对象:在STM32F10X的3.5官方库的进行芯片的切换
例子:f103切换成f107
资源吸取自:野火的《【野火®】零死角玩转STM32—F103霸道》、网上大神
所需材料:STM32F10X的官方3.5的库
测试所用开发工具:MDK5.2 ; IAR 7.3;
说明:至于怎么使用STM32的库建立MDK工程或IAR工程,我是看火哥的教程搞的,野火的教程只是MDK的工程但是和IAR工程的建立是一个道理的只要把涉及到的MDK的文件替换成IAR文件就行了,至于碰到错误和警告如何修改,可以查看我之后的博客。
一、原理依据
从上面可以看到不同芯片对应不同的.s文件,这个要切换。另外还要切换的是预编译器里的宏定义,例如STM32F10X_CL/STM32F10X_HD/……等
二、MDK5.2下的切换
目标:将STM32F103ZET工程切换成STM32F107VC工程。
看图说话:
1.将f103切换成f107,
这个大家都会切换就不截图了,太容易了,省略。
2.在c/c++预编译上用STM32F10X_CL把STM32F10X_HD的替换掉。
为啥是STM32F10X_CL?这一点我也有疑问,直到我看到野火书里那个图,就是第一节的原理依据,才恍然大悟,在此再次粘贴下以示重要。
仔细看看,然后再去stm32f10x.h中随便逛逛,看看那些宏判断,有什么定义了STM32F10X_CL之后就开始定义各寄存器的地址,等等,也就是根据不同宏定义其选取的中断向量表呀、各寄存器地址呀等都不同的,所以这些预编译的判断宏很重要,根据上图再根据你所用的芯片型号来选取宏定义。
例如
#ifdef STM32F10X_LD
ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */
USB_HP_CAN1_TX_IRQn = 19, /*!< USB Device High Priority or CAN1 TX Interrupts */
USB_LP_CAN1_RX0_IRQn = 20, /*!< USB Device Low Priority or CAN1 RX0 Interrupts */
CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */
CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */
EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */
TIM1_BRK_IRQn = 24, /*!< TIM1 Break Interrupt */
TIM1_UP_IRQn = 25, /*!< TIM1 Update Interrupt */
TIM1_TRG_COM_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt */
TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */
TIM2_IRQn = 28, /*!< TIM2 global Interrupt */
TIM3_IRQn = 29, /*!< TIM3 global Interrupt */
I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */
I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */
SPI1_IRQn = 35, /*!< SPI1 global Interrupt */
USART1_IRQn = 37, /*!< USART1 global Interrupt */
USART2_IRQn = 38, /*!< USART2 global Interrupt */
EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */
RTCAlarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */
USBWakeUp_IRQn = 42 /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */
#endif /* STM32F10X_LD */
#ifdef STM32F10X_LD_VL
ADC1_IRQn = 18, /*!< ADC1 global Interrupt */
EXTI9_5_IRQn = 23, /
所以这个宏可以在stm32f10x.h中找到,再结合那张图,再结合芯片型号,你就知道选哪个了。
3.把startup_stm32f10x_hd.s去掉,添加startup_stm32f10x_cl.s
这三步就完成了f103到f107的切换,编译无错。
三、IAR下的切换
同MDK的步骤,结果会出现警告,是startup_stm32f10x_cl.s中NOROOT的问题,如下问题:
解决方法:添加NOROOT,就是在REORDER后面加:NORROT就OK了,如下图,上面一个我已经改了,下面圆圈里的还没改(作为错误对照)
另外发现IAR7.3下直接改变芯片编译不会出错,看来IAR没有MDK严谨呀!
四、其他芯片型号的切换
同理,其他芯片的切换,也是:1,对应芯片startup_stm32f10x_xxx.s的替换,2.预编译c/c++下面的全局宏定义替换下,OK了。