#include "SysTick.h" #include "gd32e230x_conf.h" /********************************************************************************************************* * 宏定义 *********************************************************************************************************/ /********************************************************************************************************* * 枚举结构体 *********************************************************************************************************/ /********************************************************************************************************* * 内部变量定义 *********************************************************************************************************/ static __IO unsigned int s_iTimDelayCnt = 0; /********************************************************************************************************* * 内部函数声明 *********************************************************************************************************/ static void TimDelayDec(void); //延时计数 /********************************************************************************************************* * 内部函数实现 *********************************************************************************************************/ /********************************************************************************************************* * 函数名称:TimDelayDec * 函数功能:延时计数 * 输入参数:void * 输出参数:void * 返 回 值:void * 创建日期:2021年07月01日 * 注 意:在SysTick中断服务函数SysTick_Handler中调用 *********************************************************************************************************/ static void TimDelayDec(void) { if(s_iTimDelayCnt != 0) //延时计数器的数值不为0 { s_iTimDelayCnt--; //延时计数器的数值减1 } } /********************************************************************************************************* * 函数名称:SysTick_Handler * 函数功能:SysTick中断服务函数 * 输入参数:void * 输出参数:void * 返 回 值:void * 创建日期:2021年07月01日 * 注 意: *********************************************************************************************************/ void SysTick_Handler(void) { TimDelayDec(); //延时计数函数 } /********************************************************************************************************* * API函数实现 *********************************************************************************************************/ /********************************************************************************************************* * 函数名称:InitSysTick * 函数功能:初始化SysTick模块 * 输入参数:void * 输出参数:void * 返 回 值:void * 创建日期:2021年07月01日 * 注 意:SystemCoreClock / 1000 1ms中断一次(计数1000次为1s,每计一次位1/1000s=1ms) * SystemCoreClock / 4000 0.25ms中断一次(计数4000次为1s,每计一次位1/4000s=0.25ms) * SystemCoreClock / 100000 10us中断一次(计数100000次为1s,每计一次位1/100000s=10us) * SystemCoreClock / 1000000 1us中断一次(计数1000000次为1s,每计一次位1/1000000s=1us) *********************************************************************************************************/ void InitSysTick( void ) { if (SysTick_Config(SystemCoreClock / 1000)) //配置系统滴答定时器1ms中断一次 { while(1) //错误发生的情况下,进入死循环 { } } } /********************************************************************************************************* * 函数名称:DelayNms * 函数功能:毫秒级延时函数 * 输入参数:nms * 输出参数:void * 返 回 值:void * 创建日期:2021年07月01日 * 注 意: *********************************************************************************************************/ void DelayNms(__IO unsigned int nms) { s_iTimDelayCnt = nms; //将延时计数器s_iTimDelayCnt的数值赋为nms while(s_iTimDelayCnt != 0) //延时计数器的数值为0时,表示延时了nms,跳出while语句 { } } /********************************************************************************************************* * 函数名称:DelayNus * 函数功能:微秒级延时函数 * 输入参数:nus * 输出参数:void * 返 回 值:void * 创建日期:2021年07月01日 * 注 意:经测试,100us和200us基本准确 *********************************************************************************************************/ void DelayNus(__IO unsigned int nus) { unsigned int s_iTimCnt = nus; //定义一个变量s_iTimCnt作为延时计数器,赋值为nus unsigned short i; //定义一个变量作为循环计数器 while(s_iTimCnt != 0) //延时计数器s_iTimCnt的值不为0 { for(i = 0; i < 3; i++) //空循环,产生延时功能 { } s_iTimCnt--; //成功延时1us,变量s_iTimCnt减1 } }