OneOS驱动RTC
1、简介
RTC(Real-Time Clock)实时时钟,可以提供精确的实时时间,它可以用于产生年、月、日、时、分、秒等信息。目前实时时钟芯片大多采用精度较高的晶体振荡器作为时钟源。有些时钟芯片为了在主电源掉电时还可以工作,会外加电池供电,使时间信息一直保持有效。
2、RTC设备注册
以stm32l475-atk-pandora为例。
2.1.os_driver_info_t和os_device_info_t结构体创建
- os_driver_info_t
位置:drivershalstdriversdrv_rtc.c
OS_DRIVER_INFO:注册结构体os_driver_info_t到”driver_table”段;
OS_DRIVER_DEFINE:注册系统启动进行初始化时调用的初始化函数。
- os_device_info_t
位置:templatesstm32l475-atk-pandoraboardperipherals.c
OS_HAL_DEVICE_DEFINE注册结构体os_device_info_t到”device_table”段
2.2.RTC_HandleTypeDef结构体(hrtc)
- 结构体定义
drivershalstSTM32L4xx_HALSTM32L4xx_HAL_DriverIncstm32l4xx_hal_rtc.h
- 结构体初始化
- MX_RTC_Init函数
位置:templatesstm32l475-atk-pandoraboardCubeMX_ConfigSrcmain.c
对Instance和Init成员进行初始化。
由上图可知,Instance成员赋值为RTC宏。RTC宏定义和RTC_TypeDef结构体定义如下。宏RTC定义为RTC寄存器的基地址,该地址指向RTC_TypeDef结构体。该结构体的成员都是32位的寄存器,是与时间、日期等相关的寄存器。只要知道该结构体的基地址,即下图中的RTC_BASE,那么就能够访问其中的寄存器成员,从而可以进行时间和日期的获取、设置等操作。
位置:stSTM32L4xx_HALCMSISDeviceSTSTM32L4xxIncludestm32l475xx.h
(2)其他初始化函数
位置:drivershalstSTM32L4xx_HALSTM32L4xx_HAL_DriverSrcstm32l4xx_hal_rtc.c
HAL_RTC_Init和HAL_RTC_DeInit函数:主要对结构体中的函数指针成员的赋值;
HAL_RTC_RegisterCallback和HAL_RTC_UnRegisterCallback函数:同样是对结构体中的函数指针成员的赋值。
3、注册函数
设备驱动层probe函数:
注意:操作接口只有一个os_rtc_control接口。
结构体stm32_rtc
注意,上面probe函数直接调用os_device_register,即无设备框架层,直接注册到设备管理层
虽然没有注册到设备框架层,但是仍然有driversrtcrtc.c。本来一般rtc.c为设备框架层,但是此处不同,注册时并未到这一层,而且用户调用也从rtc.c开始,并不是从设备管理层开始。访问RTC设备直接从rtc.c中的接口开始,而设备管理层的接口又放在rtc.c中的接口中调用。具体看下面设备访问一节。
4、RTC设备访问
位置:driversrtcrtc.c
另外还有set_date和set_time两个接口,用户可由这两个接口通过调用rtc_get、rtc_set接口完成日期和时间的设置。
rtc_get结构的执行流程。
rtc.c |
rtc_get |
device.c |
os_device_open_s |
os_device_control |
|
drv_rtc.c |
os_rtc_control |
stm32_rtc_get_timestamp |
|
device.c |
os_device_close |
其中的RTC_HandleTypeDef结构体hrtc中包含有RTC寄存器基地址成员,这在前面的内容中讲过。再借助HAL_RTC_GetTime和HAL_RTC_GetDate接口来访问寄存器获取时间和日期。