stm32 systick

详细资料请参考《Cortex M3与M4权威指南》.
 

时钟频率与延时
时钟选择
采用参考8分频的参考时钟(168M / 8 = 21M)比较准,所以此处SysTick计数器选择21M的时钟
 如何延时1us
时钟频率为21M,也就是1s的时间技术21M次。
由此可知计数一次用了 (1/21000000) s ,用了(1/21000) ms, 用了(1/21) us
所以,1us计数21次。
如何延时1ms
因为1ms = 1000us,所以综上所述,1ms计数1000*21次计数,1ms也就是21000次计数
最大延时
24位计数器能保存的最大值 : 16777215。
最大延时时间 =:16777215 / 21 = 798915 us = 798.915ms

编程思路
Delay初始化
选择时钟源
关闭计数器
延时函数
设置重装载值
当前值清零
使能SysTick
等待计数器计数完毕
当前值清零
关闭计数器
示例代码
#include "delay.h"
 
#define    Value_us    21
#define    Value_ms    21000
 
void delay_init(void)
{
              SysTick->CTRL &= (1 << 2); //控制寄存器位2置0,选择8分频时钟
              SysTick->CTRL &= ~(1 << 0); //关闭计数器
}
void delay_us(u32 num)
{            
              SysTick->LOAD = num * Value_us;
              SysTick->VAL = 0;
              SysTick->CTRL |= (1 << 0); //使能计数器
              while (!(SysTick->CTRL & 1<<16));              //判断是否计数完毕
              SysTick->VAL = 0;
              SysTick->CTRL &= ~(1 << 0); //关闭计数器            
}
void delay_ms(u32 num)
{                           
              SysTick->LOAD = num * Value_ms;
              SysTick->VAL = 0;
              SysTick->CTRL |= (1 << 0); //使能计数器
              while (!(SysTick->CTRL & 1<<16));
              SysTick->VAL = 0;
              SysTick->CTRL &= ~(1 << 0); //关闭计数器            
}
 
附:
SysTick->CTRL 状态和控制寄存器
位16:当前值寄存器递减到0,位16置1
位2:时钟源选择位
              0:使用外部参考时钟
              1:使用内核时钟
位1:使能SysTick中断,当前值寄存器递减到0时产生中断
位0:SysTick时钟使能

2.2  SysTick->LOAD 重装载值寄存器

当前值寄存器为0时,自动将重装载值重装到当前值计数器,重装载值的大小需要自己设置
 
 
SysTick->VAL当前值寄存器
可读可写,当计数器使能时,这个寄存器的值开始递减,使用前后注意清零

 
PS:网络整理所得。非原创。
 
posted @ 2019-04-28 16:34  yuanhuang  阅读(318)  评论(0编辑  收藏  举报