天南地北客
发表于: 2018-5-4 22:53:00 | 显示全部楼层

使用STM32CubeMX软件快速生成项目的底层驱动的方法,确实很方便。最近我手上正好有个新项目,采用的是STM32F103控制器,于是使用STM32CubeMX生成底层的驱动。结果生成的RTC外设初始化代码总是编译失败,提示有错误。花了很长时间才解决掉。


下面简单介绍一下使用STM32CubeMX自动生成RTC外设底层驱动代码的简单过程。


为了查找原因,我对RTC外设模块单独进行了测试。首先是在Pinout中配置RCC、SYS和RTC。在RCC中设置主时钟和RTC时钟,然后在SYSY中选择Serial Wire作为调试接口。在RTC外设的配置中,勾选了activate clock sourceactivate calendar,RTC OUT组合框中选择No RTC Output。详细的引脚配置信息如下图所示:

pinout.png


Clock Configuration选项卡中,设置主频SYSCLK为72MHz,其他的按照软件自动进行配置。

Configuration选项卡中,RTC外设的配置保持默认状态。

RTC Configration.png


然后单击菜单Project->Setting,对工程进行配置,包含工程名称、所在路径、使用的工具链。配置完成后,点击菜单Project->Generate Code,生成KEIL工程。代码生成后,打开并进行编译,提示错误。

  1. compiling rtc.c...
  2. ../Src/rtc.c(100): warning:  #223-D: function "LL_PWR_EnableBkUpAccess" declared implicitly
  3.       LL_PWR_EnableBkUpAccess();
  4. ../Src/rtc.c(102): warning:  #223-D: function "LL_APB1_GRP1_EnableClock" declared implicitly
  5.       LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_BKP);
  6. ../Src/rtc.c(102): error:  #20: identifier "LL_APB1_GRP1_PERIPH_BKP" is undefined
  7.       LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_BKP);
  8. ../Src/rtc.c: 2 warnings, 1 error
  9. compiling system_stm32f1xx.c...
  10. "RTC Test\RTC Test.axf" - 1 Error(s), 2 Warning(s).
  11. Target not created.
复制代码

提示LL_APB1_GRP1_PERIPH_BKP未定义,这是什么鬼,在HAL库中竟然出现了LL库函数?经过多次查找原因后,终于发现,如果在项目配置中,Generated files组框中勾选Generate peripheral initialization as a pair of '.c/.h' files,生成的RTC初始化部分的代码就会不一样。

Generate files.png


让我们来比较一下这两种方式中,函数HAL_RTC_MspInit()会有哪些不同的地方;

  1. void HAL_RTC_MspInit(RTC_HandleTypeDef* rtcHandle)
  2. {

  3.   if(rtcHandle->Instance==RTC)
  4.   {
  5.   /* USER CODE BEGIN RTC_MspInit 0 */

  6.   /* USER CODE END RTC_MspInit 0 */
  7.     LL_PWR_EnableBkUpAccess();
  8.     /* Enable BKP CLK enable for backup registers */
  9.     LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_BKP);
  10.     /* RTC clock enable */
  11.     __HAL_RCC_RTC_ENABLE();
  12.   /* USER CODE BEGIN RTC_MspInit 1 */

  13.   /* USER CODE END RTC_MspInit 1 */
  14.   }
  15. }
复制代码

不报错误的代码是:

  1. void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc)
  2. {

  3.   if(hrtc->Instance==RTC)
  4.   {
  5.   /* USER CODE BEGIN RTC_MspInit 0 */

  6.   /* USER CODE END RTC_MspInit 0 */
  7.     HAL_PWR_EnableBkUpAccess();
  8.     /* Enable BKP CLK enable for backup registers */
  9.     __HAL_RCC_BKP_CLK_ENABLE();
  10.     /* Peripheral clock enable */
  11.     __HAL_RCC_RTC_ENABLE();
  12.   /* USER CODE BEGIN RTC_MspInit 1 */

  13.   /* USER CODE END RTC_MspInit 1 */
  14.   }

  15. }
复制代码

看来是程序员小哥有些疏忽了。STM32CubeMX自动生成代码确实便捷,但底层出现错误后,查找问题就比较麻烦了,尤其是在外设接口比较多的项目中。你在使用STM32CubeMX工具的时候有没有遇到类似的问题呢,欢迎大家进行回帖。

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 28 | 回复: 50



手机版|

GMT+8, 2024-3-29 09:51 , Processed in 0.192579 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表