:系统心跳定时器,提供系统心跳
可在裸机程序中作为独立的延时定时器使用
使用:
1. 生成操作系统时钟节拍
2.方便不同处理器之间的程序移植
定时器捆绑在 NVIC 中,例外编号 15
3.用作闹钟测量时间,
但当处理器在调试期间停止时,计时器也会暂停。
它有四个寄存器
, -- 控制寄存器
, -- 重新加载寄存器
, -- 当前值寄存器
, -- 校准值寄存器
stm32时钟源
选择外部时钟源时,时钟为HCLK/8
选择内核时钟源时,时钟为HCLK
延时编程原理
定时器是一个 24 位递减计数器。 设置初始值并启用后,每个系统时钟周期计数器都会减1。
当计数达到 0 时,将自动从寄存器中重新加载初始计时值。 只要控制和状态寄存器中的使能位不被清除,它就永远不会停止。
延迟编程步骤
1、计算产生1us需要多少个时钟周期;
2.计算寄存器的值
即产生相应延迟所需的时钟周期数
=*努斯
3. 开启计数
4、循环检测计数到0的标志位;
5. 清除计数器并关闭定时器
=========================================
异常配置步骤
1配置三个寄存器CTRL//LOAD/VAL,
2 初始化所使用的时钟,
3 清除当前系统值并加载重载值。
4 使能,使能响应中断
=======================
当定时器达到0时,该位将被设置; 下面的方法可以清除:
1.读取控制和状态寄存器(STCSR)
2. 将任意数据写入当前值寄存器(STCVR)
仅当VAL值为0时,计数器才会自动重新加载
=====================
库函数
ST的函数库使用的方法严格按照以下顺序:
1. Call()——禁用计数器
2.Call()——禁用中断
3. 调用fig()——设置时钟源。
4. Call()——设置重载值。
5.Call()——使能中断
6.Call()——启动计数器
中断服务函数
无效(无效);
=========================
注册版本号注释
使用外部8M时钟,锁相环出来的频率是72M,AHB预分频器是72M。
固定HCLK时钟的1/8,即9M,那么1us的延时就是9个时钟
C代码
()//系统时钟为72MHz,=72
->CTRL&=;//将bit2清0,表示配置选择外部时钟
=/8;//硬件将频率除以8,得到的值用于后面的时钟函数
=(u16)*1000;
()//nus如果10us
;
->LOAD=nus*;//如果延时10us,就是10*9=90,加载到加载寄存器中
->VAL=0x00;//计数器清0,因为手动清零字段时,会自动重新加载到VAL中。
->CTRL=0x01; //配置使异常生效,即当计数器倒数到0时,发出异常通知
做
temp=->CTRL;//时间到后,该位会被硬件置1,但查询后会自动清0。
while(temp&0x01&&!(tmep&(1CTRL=0x00;//关闭计数器
->VAL=0x00;//清除val
//这个while循环判断是否还处于该状态并且计数器还没有计数到0,
只需不停循环地将当前->CTRL寄存器的值写入变量temp中,继续进行下一次判断即可。
当计数或计数器达到0时,停止循环
还有一点需要注意:
LOAD 寄存器最大为 24 位
那么最大延迟值的计算公式为
纳米管