12MHz晶振的机器周期是1us,因为单片机的一个机器周期由6个状态周期组成,1个机器周期=6个状态周期=12个时钟周期,因此机器周期为1us。
51单片机常用
for(){
__nop(); //执行一个机器周期,若想循环n us,则循环n次。
}
软件定时原理
使用纯软件(CPU死等)的方式实现定时功能。
函数调用压栈出栈也需要时间。
STM32是ARM架构,具有流水线,一个指令的执行会分成多个步骤,延时也不精准。
缺点:
- 延时不精准
- CPU死等
定时器定时原理
使用精准的时基,通过硬件的方式,实现定时。
定时器核心就是计数器。
STM32定时器分类
- 常规定时器:基本定时器、通用定时器、高级定时器
- 专用定时器:独立看门狗、窗口看门狗、实时时钟、低功耗定时器
- 内核定时器:SysTick定时器
区别:
- 基本定时器:没有输入输出通道,常用作时基,即定时功能。
- 通用定时器:具有多路独立通道,可用于输入捕获、输出比较,甚至可用作时基。
- 高级定时器:除了具备通用定时器所有功能外,还具备带死区控制的信号输出。
基本定时器
基本定时器:TIM6/TIM7
16位递增计数器(计数值:0~65535)
16位预分频器(分频系数:1~65536)
可用于触发DAC
在计数器溢出时,可产生中断/DMA请求
- 时钟源
- 控制器
- 计数器
溢出条件 CNT=ARR(影子)
影子寄存器是实际起作用的寄存器,不可直接访问。
因此,定时器2-7最大频率72MHz。
计数器模式及溢出条件:
- 递增计数器:CNT==ARR(影子)
- 递减计数器:CNT==0
- 中心对齐模式:CNTARR-1、CNT1
具有缓冲能减少操作寄存器时间的误差。