| 使用STM32CubeMX软件快速生成项目的底层驱动的方法,确实很方便。最近我手上正好有个新项目,采用的是STM32F103控制器,于是使用STM32CubeMX生成底层的驱动。结果生成的RTC外设初始化代码总是编译失败,提示有错误。花了很长时间才解决掉。 
 下面简单介绍一下使用STM32CubeMX自动生成RTC外设底层驱动代码的简单过程。 
 为了查找原因,我对RTC外设模块单独进行了测试。首先是在Pinout中配置RCC、SYS和RTC。在RCC中设置主时钟和RTC时钟,然后在SYSY中选择Serial Wire作为调试接口。在RTC外设的配置中,勾选了activate clock source和activate calendar,RTC OUT组合框中选择No RTC Output。详细的引脚配置信息如下图所示: 
  
 在Clock Configuration选项卡中,设置主频SYSCLK为72MHz,其他的按照软件自动进行配置。 在Configuration选项卡中,RTC外设的配置保持默认状态。 
  
 然后单击菜单Project->Setting,对工程进行配置,包含工程名称、所在路径、使用的工具链。配置完成后,点击菜单Project->Generate Code,生成KEIL工程。代码生成后,打开并进行编译,提示错误。 复制代码compiling rtc.c...
../Src/rtc.c(100): warning:  #223-D: function "LL_PWR_EnableBkUpAccess" declared implicitly
      LL_PWR_EnableBkUpAccess();
../Src/rtc.c(102): warning:  #223-D: function "LL_APB1_GRP1_EnableClock" declared implicitly
      LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_BKP);
../Src/rtc.c(102): error:  #20: identifier "LL_APB1_GRP1_PERIPH_BKP" is undefined
      LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_BKP);
../Src/rtc.c: 2 warnings, 1 error
compiling system_stm32f1xx.c...
"RTC Test\RTC Test.axf" - 1 Error(s), 2 Warning(s).
Target not created.
提示LL_APB1_GRP1_PERIPH_BKP未定义,这是什么鬼,在HAL库中竟然出现了LL库函数?经过多次查找原因后,终于发现,如果在项目配置中,Generated files组框中勾选Generate peripheral initialization as a pair of '.c/.h' files,生成的RTC初始化部分的代码就会不一样。 
  
 让我们来比较一下这两种方式中,函数HAL_RTC_MspInit()会有哪些不同的地方; 复制代码void HAL_RTC_MspInit(RTC_HandleTypeDef* rtcHandle)
{
  if(rtcHandle->Instance==RTC)
  {
  /* USER CODE BEGIN RTC_MspInit 0 */
  /* USER CODE END RTC_MspInit 0 */
    LL_PWR_EnableBkUpAccess();
    /* Enable BKP CLK enable for backup registers */
    LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_BKP);
    /* RTC clock enable */
    __HAL_RCC_RTC_ENABLE();
  /* USER CODE BEGIN RTC_MspInit 1 */
  /* USER CODE END RTC_MspInit 1 */
  }
}
不报错误的代码是: 复制代码void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc)
{
  if(hrtc->Instance==RTC)
  {
  /* USER CODE BEGIN RTC_MspInit 0 */
  /* USER CODE END RTC_MspInit 0 */
    HAL_PWR_EnableBkUpAccess();
    /* Enable BKP CLK enable for backup registers */
    __HAL_RCC_BKP_CLK_ENABLE();
    /* Peripheral clock enable */
    __HAL_RCC_RTC_ENABLE();
  /* USER CODE BEGIN RTC_MspInit 1 */
  /* USER CODE END RTC_MspInit 1 */
  }
}
看来是程序员小哥有些疏忽了。STM32CubeMX自动生成代码确实便捷,但底层出现错误后,查找问题就比较麻烦了,尤其是在外设接口比较多的项目中。你在使用STM32CubeMX工具的时候有没有遇到类似的问题呢,欢迎大家进行回帖。 |