因为项目的需求,需要将F103上的程序移植到F407上,用了一天研究了一下也移植成功了!
我的思路是找一个F4的例程,然后将其HARDWARE文件夹里的文件全部替换成原本F103的HARDWARE文件夹里的,将原来的main.c文件也替换成原F103的,然后把头文件都改成对应正确的,接着编译,报错什么修改什么。
1.部分外设及GPIO口对应的时钟改变
因此各GPIO的时钟使能函数和时钟名称均发生改变
2.GPIO口的模式发生改变
F1的GPIO口只有8种模式;而F4在输出时亦可设置上拉和下拉,因此F4可以有12种模式。并且F4的GPIO口的输入/输出/复用/模拟、推挽/开漏、上拉/下拉 都需要单独设置。除此之外,因为F4用的是AHB时钟,其最大输出速率可达到100MHz。
3.GPIO口对应的寄存器的名称发生改变
直接编译的话就会出现这样的错误error:#136:struct""has no field "CRL"
CRL是F1的端口配置低位寄存器,而因为F4中对应的寄存器已经不叫这个名字了(叫MODER),因此会报错。
//举个栗子
//F1
#define AMG_SDA_IN() {GPIOB->CRL&=0x0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}//PB7输入模式
#define AMG_SDA_OUT() {GPIOB->CRL&=0x0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}//PB7输入模式
//F4
#define AMG_SDA_IN() {GPIOB->MODER&=~(3<<(7*2));GPIOB->MODER|=0<<7*2;} //PB7输入模式
#define AMG_SDA_OUT() {GPIOB->MODER&=~(3<<(7*2));GPIOB->MODER|=1<<7*2;}//PB7输入模式
4.F4配置有浮点数得硬件运算单元
F1是没有浮点数得硬件运算单元的,其浮点数运算是采用软件模拟,因此运算速度会很慢。
(1)警告:warning:#1035-D:single-precision operand implicitly converted to double-precision
解决方法:1)如果是浮点数值进行运算的话,则在浮点数值后加上f;2)若是变量运算,则将其计算强制转换
float a,b,c;
c=0.1f*8.9f;//浮点数值后加f
a=(float)(a*b);//将其运算结果将至转换
(2)如何开启F4的浮点数硬件计算单元
1)打开文件system_stm32f4xx.c——>函数void SystemInit(void)中加入如下代码:
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));
#endif
2)在编译器中,Options for Target’XXX’—>C/C+±—>Define中加入以下语句:
__FPU_PRESENT=1,__FPU_USED =1