|
使用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工具的时候有没有遇到类似的问题呢,欢迎大家进行回帖。 |