在STM32的官方库切换芯片型号

对象:在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了。

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值