本帖最后由 wangzheyu1989 于 2013-8-24 18:30 编辑
本文主要介绍从stm32f1芯片到stm32f4芯片的软硬件移植要点,水平有限,仅供参考。首先,我们的移植主要需要用到以下两个官方App Notes:
AN3364 Migration and compatibility guidelines for STM32(软件移植参考)
AN3427 Migrating a microcontroller application from STM32F1 to STM32F2 series 1.0(硬件移植参考)
看到这里大家可能有疑问了,AN3427怎么是F1到F2的移植手册,其实原因就是在硬件方面,F2系列和F4系列完全是pin-to-pin兼容的,因此在硬件上,ST公司也就没有再出和F4有关的移植手册了。有了这两个手册后,我们将开始详细的移植讨论。
硬件部分:
从硬件部分来说,移植的思路是比较明确的,主要参考以下两幅图
由于本大赛采用的是100pin的系列,这里就仅仅讨论一下100pin的封装,其余封装大同小异。从上图我们可以看到,F1和F4(F2)系列的主要区别在于有些电源和地的管脚互换了,也就是电源变成了地,地变成了电源,而保持两系列兼容性的方法也很简单,就是通过0欧姆的电阻来选择即可。 软件部分:
从上文可以看出,硬件部位的移植和兼容性保持还是非常容易的,但是到了软件部分,就不得不吐槽一下F1和F4两个系列的软件库了,看似大同小异,其实陷阱多多,由于本文作者用F4系列也不久,也只移植了一个比较大的程序,因此本文所列出的注意点,可能只是两个系列软件库兼容性问题中的一部分,如有遗漏,还望补充。AN3364 Migration and compatibility guidelines for STM32这个APP notes可以作为移植时的参考,并无太大的参考意义。
1、总线变化:
F1系列到F4的系列最大的变化就是系统总线的不同,也就导致了系统外设在初始化时需要修改时钟初始化的函数。区别如下:
F1系列:AHB+(APB1 APB2)
F4系列:(AHB1 AHB2 AHB3)+(APB1 APB2)
例子1:使能GPIOE的时钟
F1:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
F4:RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
如此改动的原因就是F4系列的GPIO总线从APB上变成了AHB,这一点的影响深远,将在下一节时钟树中再做讨论。
2、时钟树变化:
F1系列时钟树
F4系列时钟树 从图中可以看到(可能不是很清晰,详细的可以参考手册),由于F系列总线变多,因此时钟树也变得更为复杂,因此在移植使能时钟树的代码时,也需要特别注意,例如上文章中的例子1。同时,由于F4系列的主频从原来的72Mhz,变成了168Mhz,并且很多外设所挂载的总线也都不同了,对于外设最高频率的计算,也许额外的注意。
3、库函数的改变:
从F1到F4,库函数看似大同小异,但在GPIO上,似乎改动不小,下面就以一个实际例子来说明。
例子2:将GPIO管脚配置成SPI的外设管脚:
F1代码:
/* Configure SPI1 pins: SCK, MISO and MOSI ---------------------------------*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
F4代码: GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);
/* Configure SPI1 pins: SCK, MISO and MOSI ---------------------------------*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
从以上代码可以看出,首先是添加了GPIO_PinAFConfig函数,并且其中的GPIO_PinSource5很容易被搞错成GPIO_Pin_5,这点需要特别注意,其次F1的库函数中的GPIO_Mode_AF_PP宏,已经包含了alternative function和push-pull两重含义,但在F4的库函数中,这些都被分开单独定义。
4、总结:
以上提到的这些移植要点,可能只是F1平台到F4平台移植要点中的一部分,这里只是抛砖引玉,希望大家能多讨论。下面总结一下移植步骤:
1、替换库函数版本,F1-》F4。
2、编译,查看错误。
3、根据编译错误,将旧函数或旧宏替换成新的版本。
4、针对具体的外设,查看是否有新的函数添加,若有,则确认新函数的功能是否需要使用。
谢谢阅读。
|