【七】滴答定时器
1.1.滴答定时器介绍
SysTick定时器可用作标准的下行计数器,是一个24位向下计数器,有自动重新装载能力,可屏蔽系统中断发生器。Cortex-M4处理器内部包含了一个简单的定时器,所有基于M4内核的控制器都带有SysTick定时器,这样就方便了程序在不同的器件之间的移植。 SysTick定时器可用于操作系统,提供系统必要的时钟节拍,为操作系统的任务调度提供一个有节奏的“心跳”。正因为所有的M4内核的芯片都有Systick定时器,这在移植的时候不像普通定时器那样难以移植。
RCU 通过 AHB 时钟(HCLK)8 分频后作为 Cortex 系统定时器(SysTick)的外部时钟。通过对 SysTick 控制和状态寄存器的设置,可选择上述时钟或 AHB(HCLK)时钟作为 SysTick 时钟。关于系统时钟的介绍可参考用户手册的第89页
SysTick定时器设定初值并使能之后,每经过1个系统时钟周期,计数值就减1,减到0时,SysTick计数器自动重新装载初值并继续计数,同时内部的COUNTFLAG标志位被置位,触发中断(前提开启中断)
1.2.滴答定时器寄存器
在GD32F3X0用户指南第206页有关SysTick寄存器的介绍,如图2-1-1所示

在core_cm4.h中可查看其定义,如图2-1-2所示

关于寄存器的配置在core_cm4.h下的SysTick_Config函数中已经写好了,如图2-1-3所示,感兴趣的可以去研究一下

1.3.滴答定时器函数
SysTick定时器的使用主要有 SysTick_Config()函数和 systick_clksource_set(uint32_t systick_clksource)函数,
SysTick_Config()函数主要用来设置定时时间,systick_clksource_set()函数用来选择SysTick时钟源。
关于systick_clksource_set()函数更详细的介绍请参考GD32F3x0使用指南的第211页,如图3-1-1所示

1.4.滴答定时器配置
在systick.c中找到systick_config()这个函数,如图4-1-1所示

SystemCoreClock / 1000U 是时钟次数,即放入重装载寄存器中的值,每计数一次时钟为1/200 000 000s的时间,那么计数SystemCoreClock / 1000U 个时钟的时间就是SystemCoreClock / 1000U * 1/200 000000s = 1 / 1000U = 1ms
NVIC_SetPriority(SysTick_IRQn, 0x00U);是开启中断,每当定时1ms时间到就会进入到中断函数SysTick_Handler里面,所以每进入一次中断就是1ms,如果我们定时5ms,只需要进入5次中断即可
1.5.滴答定时器使用
GD32官方也给我们写好了延时1ms的函数,void delay_1ms(uint32_t count),有一个参数count,这个就是我们要延时的时间的ms数,延时1ms就是delay_1ms(1),延时1s就是delay_1ms(1000)。需要注意的是这个延时是阻塞延时,在延时的时间里一直在等待,比较浪费系统资源,慎用
1.6.LED灯闪烁实验
前面我们学习了如何去使用滴答定时器,下面我们就用滴答定时器的延时去实现LED闪烁1s间隔。其实很简单就是先让LED引脚输出高电平,然后调用delay_1ms(1000),再让LED引脚输出低电平,再调用delay_1ms(1000),最后在while(1)函数里调用即可
关于LED灯闪烁实验代码,在资源包/04软件资料/代码例程/里面的003滴答定时器灯闪烁
烧写代码之后,可以看到开发板LED2将会1s亮1s灭