Comparator
该示例通过使用 RTC 比较器实现定时功能。
RTC 时钟源经过预分频后(该示例为 32kHz/3200 = 10Hz),每经过设定的比较器值的周期数(该示例中为 10,即 0.1s*10=1s),触发比较器中断。
RTC 支持四个通道的比较器。
环境需求
该示例支持以下开发套件:
Hardware Platforms |
Board Name |
---|---|
RTL8752H HDK |
RTL8752H EVB |
更多信息请参考 快速入门。
编译和下载
该示例的工程路径如下:
Project file: board\evb\io_sample\RTC\Comparator\mdk
Project file: board\evb\io_sample\RTC\Comparator\gcc
请按照以下步骤操作构建并运行该示例:
打开工程文件。
按照 快速入门 中 编译 APP Image 给出的步骤构建目标文件。
编译成功后,在路径
mdk\bin
或gcc\bin
下会生成 app binapp_MP_xxx.bin
文件。按下 reset 按键,开始运行。
测试验证
比较器设定时间(1s)到,触发 RTC 中断,在中断函数内打印中断信息和计数值,每次计数值 +10。
[main]RTC_Handler: RTC_COMP_INDEX1
[main]RTC_Handler: RTC counter current value = 10
[main]RTC_Handler: RTC_COMP_INDEX1
[main]RTC_Handler: RTC counter current value = 20
...
代码介绍
该章节分为以下几个部分:
源码路径
工程路径:
sdk\board\evb\io_sample\RTC\Comparator
源码路径:
sdk\src\sample\io_sample\RTC\Comparator
该工程的工程文件代码结构如下:
└── Project: rtc_comparator
└── secure_only_app
└── include
├── app_define.h
└── rom_uuid.h
├── cmsis includes CMSIS header files and startup files
├── overlay_mgr.c
├── system_rtl876x.c
└── startup_rtl876x.s
├── lib includes all binary symbol files that user application is built on
├── rtl8752h_sdk.lib
├── gap_utils.lib
└── ROM.lib
├── peripheral includes all peripheral drivers and module code used by the application
├── rtl876x_rcc.c
├── rtl876x_nvic.c
└── rtl876x_rtc.c
├── profile
└── app includes the ble_peripheral user application implementation
└── main.c
初始化
当 EVB 复位启动时,执行 main
函数。在 rtc_demo
中,包含 RTC 外设的初始化等流程。
int main(void)
{
extern uint32_t random_seed_value;
srand(random_seed_value);
__enable_irq();
rtc_demo();
while (1)
{
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
__NOP();
}
}
void rtc_demo(void)
{
/* Initialize RTC peripheral */
driver_rtc_init();
}
driver_rtc_init
为 RTC 外设的初始化,包含如下流程:
复位 RTC 外设。
设置 RTC 的分频系数为(3200-1),RTC 时钟频率为 10Hz(32K/3200)。
设置 RTC 比较器通道 1 的比较值为 10。
使能 RTC 比较器通道 1 计数中断
RTC_COMP_INDEX_INT
。配置并使能 RTC 的 IRQ 通道,开启 CPU 的 NVIC 中断。
复位 RTC 计数值。
启动 RTC 外设。
void driver_rtc_init(void) { RTC_DeInit(); RTC_SetPrescaler(RTC_PRESCALER_VALUE); RTC_SetCompValue(RTC_COMP_INDEX, RTC_COMP_VALUE); RTC_INTConfig(RTC_COMP_INDEX_INT, ENABLE); /* Config RTC interrupt */ NVIC_InitTypeDef NVIC_InitStruct; NVIC_InitStruct.NVIC_IRQChannel = RTC_IRQn; NVIC_InitStruct.NVIC_IRQChannelPriority = 3; NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStruct); RTC_NvCmd(ENABLE); /* Start RTC */ RTC_ResetCounter(); RTC_Cmd(ENABLE); }
功能实现
比较器设定时间(0.1 s*10 = 1 s)到,触发 RTC 中断,进入中断处理函数 RTC_Handler
。
打印中断信息和比较值信息。
重新设置比较值为当前计数值+10,即从当前开始继续计数 10 周期。
清除比较器通道 1 计数中断。
void RTC_Handler(void) { if (RTC_GetINTStatus(RTC_COMP_INDEX_INT) == SET) { DBG_DIRECT("[main]RTC_Handler: RTC_COMP_INDEX%d", RTC_COMP_INDEX); DBG_DIRECT("[main]RTC_Handler: RTC counter current value = %d", RTC_GetCounter()); RTC_SetCompValue(RTC_COMP_INDEX, RTC_GetCounter() + RTC_COMP_VALUE); RTC_ClearCompINT(RTC_COMP_INDEX); } }