滴答定时器 systick

编程入门 行业动态 更新时间:2024-10-15 04:22:07

滴答<a href=https://www.elefans.com/category/jswz/34/1768257.html style=定时器 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

本文发布于:2024-02-26 09:07:34,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1701972.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:定时器   systick

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!