STC单片机的c代码可以移植到stm32上吗,要不要做什么修改?

STC单片机的c代码可以移植到stm32上吗,要不要做什么修改?,第1张

换芯片,改电路,底层肯定要重写的。

写程序有个好习惯还是很重要的。下面说一下移植方面的习惯,

提高移植性,最重要的手段就是隐藏硬件实现的细节,把逻辑与底层分开。

举个例子,LED闪一下亮一下,P1_0=0在51上就是一句话的事。就这一句,就有三个地方涉及硬件,(1)硬件上是P1.0接LED,(2)硬件上低电平亮,相应的是高电平灭,(3)硬件是用的51,用了51独有的位 *** 作。

换个电路,或者换个芯片,这些都要重新改写。假设程序里面有十个地方需要亮灯,移植时就要改十个地方。把亮灯这件事定义成一个函数,或者叫方法,或者叫 *** 作,把具体的 *** 作细节隐藏起来,只表示出做了一件什么事情--亮灯。像这样,voidLED_ON(void)在主程序里面,或者说在应用层的程序中调用LED_ON()就是亮灯,具体怎么亮灯,应用程序不管,也不能管,而是由单独的底层程序来做,也就是LED_ON这个函数的内容,是放在单独的一个文件中。用51,就写一个51下的底层,要移植,要用CM3就写一个CM3的底层,主程序可以不用改动,至少是尽量少改动。

为了提高移植性,尽量用标准的C写代码,涉及不同编译系统的实现细节,也要注意隐藏细节,前面的硬件细节,这个算是软件的细节吧。

比如sfr,sbit,interrupt这些,都是51独有的,换到不同的系统上,都需要重写。处理办法也是一样的,隐藏起来,放到单独的底层文件中。

基本上,做到这两步,程序的移植性会提高很多。

再举个小例子吧:

//app.c

#include"bsp.h"//注意这里不要包含硬件有关的头文件,比如"reg51.h",不要包含在这里。

voidmain(void)

{

while(1)

{

if(hasKey())

{

led_on()

delay(100)

led_off()

}

}

//bsp.h

typedefunsignedshortuint16_t

typedefbitbool

voidled_on(void)

voidled_off(void)

voiddelay(uint16_tms)

boolhasKey(void)

//bsp_for_51.c

#include"bsp.h"

#include"reg51.h"

sbitled=P1^0

#defineON(0)

voidled_on(void)

{

led=ON

}

voidled_off(void)

{

led=!ON

}

voiddelay(uint16_tms)

{

inti

while(ms--)

for(i=0i}

boolhasKey(void)

{

return(P0!=0xFF)//测试是否有按键?

}

这个是51的系统,换成STM32,简单重写一下bsp.c,不需要改app.c,系统就可以移植过来。

一般学习中使用FatFS可能多一点,使用上差别不是太大,但是FatFs没有,磨损均衡,坏块,ECC等管理,作为学习移植文件系统,问题不大,但在用到实际项目上去的话,这是肯定不行的,FLASH在产生坏块后,文件系统会受到破坏导致数据的丢失和产品的不稳定,RL-FlashFs是专门针对Flash芯片的文件系统,类似的还有国外一个开源的SPI-ffs,是专门针对小型化SPI FLASH的一种文件系统。

FLASH:W29N1GV 128MB SLC NAND

控制器:STM32F417ZGT6

接口:STM32的FSMC接口

软件平台:MDK4.74(选4.74的原因是5版本以后的RL-FlashFs变成了一个pack,依赖于RTX,因为现在使用了QPN框架,暂时不想用RTX就不去掉这个依赖了)

CubeMx配置:

根据自己FLASH的数据手册来进行配置吧

其余的部分大可参照安富莱的教程,记录一下自己遇到的坑,其他朋友也可以参考一下

1.配置时不使用STM32的硬件ECC。

2.读取时的页大小 = Page Size + Spare area Size(我这边是2048 + 64 = 2112)

3.ST官方的库里面的读取函数都是整页读取的,移植时要自己写字节读取函数

这个大概可以分几类:

1.如果你准备用STM32做嵌入式,并且想移植windows中的GUI函数,那么可以肯定的说,不可以的,除非你用WinCE。而且一般32跑的嵌入式系统是:UCos;

2.如果你只是移植一些简单的计算处理函数等,可以说,直接就可以使用,当然除了一些输入,输出外(C中:printf,scanf);至于变量定义如:int ,double,char可以不用改变;如果是非负整数的,一般采用STM32自身定义,如:u8 , u16 ,u32等。

3.STM32开发一般使用的是C/C++语言,由于语言的相通性,所以语言都是通用(if else等),所以是很好移植的,建议可以看看STM32的一些程序。

4,当然,如果你只是做算法,移植是很简单的,但是,如果加上IO口输出,如:算法运行后,输出电压量即:DAC的话,这些你需要 *** 作STM32的一些相关ADC寄存器,才会使计算的结果可以形象地表达出来,建议看看《STM32中文参考手册》


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9897214.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-03
下一篇2023-05-03

发表评论

登录后才能评论

评论列表(0条)

    保存