[STM32F1] STM32之滴答定时器

[复制链接]
746|3
 楼主| darklighttt 发表于 2020-6-27 18:43 | 显示全部楼层 |阅读模式
  1.定时器主要由时钟源、分频器、基准时钟、计数器和重装载值寄存器组成
  2.单片机定时器都是通过计数来实现计时, 而滴答定时器是Cortex-M3内核自带的一个24位向下计数的定时器
  3.SysTick定时器被捆绑在NVIC中, 用于产生SysTick异常。 常用来做延时或者实时系统的心跳时钟。
  4.
SysTick定时器就是系统滴答定时器, 一个24 位的倒计数定时器, 计到0 时, 将从RELOAD 寄存器中自动重装载定时初值。 只要不把它在SysTick 控制及状态寄存器中的使能位清除, 就永不停息, 即使在睡眠模式下也能工作。
  5。滴答定时器的寄存器介绍
  (1)控制及状态寄存器STK_CTR ---用来选择时钟源(CLKSOURCE)和标志位的判断(COUNTFLAG)及滴答定时器异常请求使能(TICKINT)和定时器使能(ENABLE)。
  (2)重装载数值寄存器STK_LOAD----决定计数的个数( 周期) 。
  (3)当前值寄存器STK_VAL-------------实际计数的寄存器。  
例如: 实现1ms计时时间, 定时器时钟频率为
72MHz,使用内核时钟( FCLK) , STK_LOAD寄存器为计
72000个数实现1ms计时。

 楼主| darklighttt 发表于 2020-6-27 18:44 | 显示全部楼层
  1. void Delay_Init(void)
  2. {
  3. //    SysTick->VAL = 0;//计数器清0
  4. //    //使能计数器  中断  内核时钟
  5. //    SysTick->CTRL |=(1<<0)|(1<<1)|(1<<2);
  6. //    SysTick->LOAD = 72000-1;
  7. //    NVIC_SetPriority(SysTick_IRQn,0xf);   // 11 11
  8.     if(SysTick_Config(72000)==1)
  9.     {
  10.         while(1); //错误
  11.     }
  12. }
  13. /*
  14.     函数名称:Delay_ms
  15.     函数功能:ms延时
  16.     函数参数:time -- 延时时间
  17.     函数返回值:无
  18. */
  19. void Delay_ms(uint32_t time)
  20. {
  21.     uint32_t nowtime = runtime;
  22.     while(runtime < nowtime + time);   
  23. }

  24. SysTick初始化---Delay_Init------延时1ms
 楼主| darklighttt 发表于 2020-6-27 18:44 | 显示全部楼层
可以借由此滴答时钟进行时间片的实验 
  1. uint32_t runtime = 0; //记录系统运行的时间
  2. uint32_t ledrun[2]={0,300}; //ledrun[0]  -- 起始时间
  3.                                                         //ledrun[1]  -- 结束时间
  4. uint32_t beeprun[2] = {0,500};
  5. uint32_t keyrun[2] = {0,10};
  6. // 1ms产生一次中断
  7. void SysTick_Handler(void)
  8. {
  9.     runtime++;
  10.     ledrun[0]++;
  11.     beeprun[0]++;
  12.     keyrun[0]++;
  13. }

  14. 时间片
 楼主| darklighttt 发表于 2020-6-27 18:45 | 显示全部楼层
848025ef7234178715.png
Systick库函数相关函数
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

132

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部