定时器 systick"/>
滴答定时器 systick
滴答定时器
- systick
- systick定时器时间计算
- 代码
systick
24位系统定时器 只能递减 存在内核中,嵌套在NVIC 所有的Cortex-M中都有这个
系统定时器
功能简述
1)对照手册
大概的思路
重装载值 reload 递减,当递减到0 就会触发中断 判断标志位 并且会置countflag
标志位为0 然后 reload 继续 从预设的值开始递减,周而复始。
这个滴答定时器 和 普通定时器没什么区别 只不过他只能递减 规律都是到了某个值就会 产生中断 然后判断标志位 把相应的位置零 置零相当于是每一次结束的标志了
systick定时器时间计算
T:一个计数的循环 reload:自动重装载值 :24位用户自己配置
clk:72兆
T=relaod/(1/clk); 假如 reload ==72 clk=72兆
T=72/(1/72000 000)= 1/1000 0 00 = 1us
使用的原因
项目中一般用delay函数延时 但是它会占用我们的cpu,也就是在执行延时
不执行任何事情 只执行延时。cpu停止工作了 systick还是不会受到影响。
打个比方 :你妈妈一直在煮饭炒菜洗碗 而你一直在吃 妈妈这不是很累吗 。
代码
1)结构体
typedef struct
{__IO uint32_t CTRL; //控制和状态寄存器 __IO uint32_t LOAD; //reload当前值 __IO uint32_t VAL; //定时器当前值
} SysTick_Type;
2)函数原型
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{ if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); SysTick->VAL = 0; SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk; return (0);
}
拆解
第一句
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1);
意思是 定时器值大于 2的24次方 就退出 函数 也就是出现异常了
第二句
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;
结合宏定义来看
对应& 就让最低位为1 了 最后减 1 就是reload初始值了
继续下一句
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);
结合宏定义看
他的优先级是 4 怎么算最后结果呢
1<<4 == 00001---> 10000 10000就是最后结果 也就是 2的4次方 ==16
下一句是 val=0;就是 定时器的初值为0
最后一句 定时器使能
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk; //使能
3)systick.c
#include "stm32f10x.h"
#include "sys.h"void ms_delay(uint16_t ms)
{uint16_t i;SysTick_Config(72000); //72000/72k = 1/1000s =1msfor(i=0;i<ms;i++){ while(!(( SysTick->CTRL >>16) & 0x01 ) ); // count从 reload 计数到0判断CTRL 的位16 等待全部置1 0000 0000 0000 0000 -----1111 1111 1111 1111 ---退出 for }SysTick->CTRL &=~ SysTick_CTRL_ENABLE_Msk;//使能
}
main.c
#include "stm32f10x.h"
#include "main.h"
#include "sys.h"
#include "led.h"int main(int argc,char *argv[])
{LED_INIT();while(1){GPIO_ResetBits(GPIOC, GPIO_Pin_13);ms_delay(1000);GPIO_SetBits(GPIOC,GPIO_Pin_13);ms_delay(1000);}return 0;
}
static 的知识延展 @参考static
用static定义全局变量 可以称为静态全局变量 仅对当前有效 不接受访问 其他文件可以定义同名
变量 互不影响
更多推荐
滴答定时器 systick
发布评论