滴答定时器的使用非常简单,沁恒已经为我们封装好了现成的库函数:
RV_STATIC_INLINE uint32_t SysTick_Config(uint64_t ticks) { if((ticks - 1) > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */ SysTick->CMP = ticks - 1; /* set reload register */ PFIC_EnableIRQ(SysTick_IRQn); SysTick->CTLR = SysTick_CTLR_INIT | //向上计数从0 开始,向下计数从比较值开始; SysTick_CTLR_STRE | SysTick_CTLR_STCLK | //HCLK 做时基; SysTick_CTLR_STIE | //使能计数器中断; SysTick_CTLR_STE; //启动系统计数器STK; /* Enable SysTick IRQ and SysTick Timer */ return (0); /* Function successful */ }
下面是一段使用滴答定时器交替闪烁LED灯的代码:
#include "CH58x_common.h" /********************************************************************* * @fn main * @brief 主函数 * @return none */ uint32_t cnt=0; int main() { SetSysClock(CLK_SOURCE_PLL_60MHz); SysTick_Config(60000000);//设定嘀嗒时间 GPIOB_SetBits(GPIO_Pin_15); GPIOB_ModeCfg(GPIO_Pin_15, GPIO_ModeOut_PP_20mA); // 配置推挽输出 while(1){ if (cnt%2==0) GPIOB_SetBits(GPIO_Pin_15); else GPIOB_ResetBits(GPIO_Pin_15); } } /********************************************************************* * @fn SysTick_Handler * @brief SysTick中断函数 * @return none */ __attribute__((interrupt("WCH-Interrupt-fast"))) __attribute__((section(".highcode"))) void SysTick_Handler() { cnt++; SysTick->SR=0;//清除中断标志 }