之前那篇移植的驱动(地址https://blog.csdn.net/Mooney_yuan/article/details/83377428)似乎有点问题,验证的时候发现RTC实际上没有起作用。实际上开始时测试过可以工作的,但现在在我板子上测试不行,所以重新改写了一下,并且解决了STM32 HAL驱动RTC掉电后日期无法保存的问题。
环境
1. 开发板,正点原子ALIENTEK MiniSTM32 V3.4
2. rtthread 3.1.0
1. 增加drv_rtc.c驱动文件
添加drv_rtc.c文件到 bsp/stm32f10x-HAL/drivers 目录下,修改该目录下的SConscript文件,增加drv_rtc.c编译选择
if GetDepend(['RT_USING_RTC']):
src += ['drv_rtc.c']
2. 配置rtthread
通过env的menuconfig命令,打开 RT-Thread Components -> Device Drivers
[*] Using RTC device drivers
[ ] Using software simulation RTC device
[ ] Using NTP auto sync RTC time
3. drv_rtc.c源码
/*
* Copyright (c) 2006-2018, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2017-10-25 ZYH first implementation
*/
#include "drv_rtc.h"
#include <board.h>
#include <rtdevice.h>
#include <string.h>
#include <time.h>
#ifndef RT_USING_SOFT_RTC
RTC_HandleTypeDef hrtc;
uint8_t time_synced;
#define BKUP_REG_DATA 0xA5A5
/* RTC init function */
void MX_RTC_Init(void)
{
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_RCC_BKP_CLK_ENABLE();
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
#ifdef BSP_RTC_USING_LSI
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
RCC_OscInitStruct.LSEState = RCC_LSE_OFF;
RCC_OscInitStruct.LSIState = RCC_LSI_ON;
#else
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
RCC_OscInitStruct.LSEState = RCC_LSE_ON;
RCC_OscInitStruct.LSIState = RCC_LSI_OFF;
#endif
HAL_RCC_OscConfig(&RCC_OscInitStruct);
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
HAL_PWR_EnableBkUpAccess();
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
#ifdef BSP_RTC_USING_LSI
PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSI;
#else
PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
#endif
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
/* Enable RTC Clock */
__HAL