3-Systick滴答定时器的使用
滴答定时器的使用非常简单,沁恒已经为我们封装好了现成的库函数:
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;//清除中断标志
}