相信大家在使用STM32的过程中,一直都想配置并且使用定时器吧,下面小编就带大家了解SysTick定时器。
SysTick定时器是什么?
从原理上来说,Systick定时器和开发板上的通用定时器没有区别。从功能上来说,Systick定时器主要是用来用来进行延时的(就是让CPU一直重复计数这件事),而通用或者高级定时器往往用来进行PWM输出、输入捕获等功能。至于为什么不用通用定时器或者高级定时器来完成延时功能,则是考虑到节省MCU的资源来做更重要的事。
Systick定时器相关寄存器
地址 | 名称 | 类型 | 复位值 | 描述 |
---|---|---|---|---|
0xE000E010 | STK_CTRL | RW | 0x0000 0000 | STK的控制和状态基础器 |
0xE000E014 | STK_LOAD | RW | 不确定 | STK的重载值寄存器 |
0xE000E018 | STK_VAL | RW | 不确定 | STK的当前值寄存器 |
0xE000E01c | STK_CALIB | RO | 不确定 | STK 的标定值寄存器 |
实现函数
Systick定时器在工作时,先将LOAD中存放的值放入VAL中,然后VAL中的值会在每个时钟周期中减1直到变成0,变成0并且有开启中断的前提下,就会触发中断。这里还需要注意的是LOAD是24位的,也就是最大值为FFFFFF。
/*
* @brief microsecond dealy(微秒级延时)
* @param i:time to be delayed(延时时间)
* @retval none
*/
void delay_us(u32 i){
//u32表示uint32_t数据类型
u32 temp = 0;
SysTick->LOAD = 9*i;
//使能状态,减到0是无动作,采用的是外部时钟源
SysTick->CTRL = 1;
//清空计数器
SysTick->VAL = 0;
do{
temp = SysTick->CTRL;//获取当前计数值
}while((temp&0x01) && (!(temp&(1<<16))));
SysTick->CTRL = 0;//关闭计数器
SysTick->VAL = 0;//清空计数器
}
/*
* @brief millisecond dealy(毫秒级延时)
* @param i:time to be delayed(延时时间)
* @retval none
*/
void dealy_ms(u32 i){
delay_us(i*1000);//毫秒与微秒的进制就是1000,因此微秒延时扩大1000倍就是毫秒延时
}