当前位置:   article > 正文

系统定时器

系统定时器

目录

理论部分

概述

组成

介绍寄存器(常用)

介绍库函数 SysTick_Config()

函数定义

代码分析

实践部分

本次实验目的

编程思路

代码复现


理论部分

概述

SysTick——系统定时器(System Tick)

系统定时器是属于CM3内核中的一个外设,内嵌在NVIC(NVIC也是内核中的一个外设,控制着整个芯片中断相关功能)中,这是一个24bit的向下递减的计数器计数器每计数一次的时间为 \frac{1}{sysclk},在所学stm32 F10x系列通常预设为72M。

组成

系统定时器由四个寄存器组成。

系统定时器中寄存器
寄存器名称寄存器描述
CTRLSysTick 控制及状态寄存器
LOADSysTick 重装载数值寄存器
VALSysTick 当前数值寄存器
CALIBSysTick 校准数值寄存器

介绍寄存器(常用)

需要说明的是,以下翻译版本使用了 刘火良老师写的《零死角玩转stm32》

 CTRL,控制及状态寄存器

 

LOAD,重装载数值寄存器

 VAL, 当前数值寄存器

 

 

 

 

介绍库函数 SysTick_Config()

 

函数定义

  1. static __INLINE uint32_t SysTick_Config(uint32_t ticks)
  2. {
  3. if (ticks > SysTick_LOAD_RELOAD_Msk) return (1);
  4. SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;
  5. NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);
  6. SysTick->VAL = 0;
  7. SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
  8. SysTick_CTRL_TICKINT_Msk |
  9. SysTick_CTRL_ENABLE_Msk;
  10. return (0);
  11. }

代码分析

if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1); 

由于LOAD寄存器中的reload占用24bit,所能表示的最大数值为 1<<25 - 1,可以看到“SysTick_LOAD_RELOAD_Msk”在固件库中定义为 0xFFFFFFul。

SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;   

将得到的tick值写进LOAD寄存器

NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);

设置定时器的优先级为15,可以看到在core_cm3.h中将“__NVIC_PRIO_BITS” 定义为4。

  SysTick->VAL   = 0;  

VAL寄存器重置

  1. SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
  2. SysTick_CTRL_TICKINT_Msk |
  3. SysTick_CTRL_ENABLE_Msk;

 “SysTick_CTRL_CLKSOURCE_Msk” 在固件库宏定义为1<<2,可以在上面的寄存器介绍中知道这里的作用是选择的是AHB预分频器1分频;

“SysTick_CTRL_TICKINT_Msk” 在固件库宏定义为1<<1, SysTick 倒数计数到 0 时产生 SysTick 异常请求;

“SysTick_CTRL_ENABLE_Msk” 在固件库宏定义为1<<0, 打开定时器。

实践部分

本次实验目的

分别编写毫秒、微秒级别的定时单位的函数,实现LED灯以1s的频率闪烁

编程思路

1、编写SysTick板级支持包,在其中实现控制毫秒、微秒级别的延时函数。

2、将原有利用 软件延时 实现LED灯闪烁的代码,更换成本次编写的硬件级别的延时函数。

代码复现

  1. 微秒级延时
  2. void SysTick_Delay_us ( uint32_t us )
  3. {
  4. SysTick_Config(72);
  5. int i;
  6. for ( i = 0; i < us; i++ ) {
  7. while( !( (SysTick->CTRL) & ( 1<<16 ) ) ) ;
  8. }
  9. SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
  10. }
  1. 毫秒级延时
  2. void SysTick_Delay_ms ( uint32_t ms )
  3. {
  4. SysTick_Config(72000);
  5. int i;
  6. for ( i = 0; i < ms; i++ ) {
  7. while( !( (SysTick->CTRL) & ( 1<<16 ) ) ) ;
  8. }
  9. SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
  10. }

可以看到微秒和毫秒级别的延时函数,代码上只是reload值(tick值)设置的不一样

 之后就在主函数中替换到软件延时。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/942243
推荐阅读
相关标签
  

闽ICP备14008679号