定时器
- 定时器
-
- [5.1 独立看门狗定时器](#5.1 独立看门狗定时器)
- [5.2 窗口看门狗](#5.2 窗口看门狗)
- [5.3 通用定时器](#5.3 通用定时器)
- 计数器的时钟频率与内部时钟的关系:
-
- 示例
-
- [例1 定时器中断](#例1 定时器中断)
- [例2 PWM输出控制LED渐明渐暗](#例2 PWM输出控制LED渐明渐暗)
- [例 3 引脚电平输入捕获](#例 3 引脚电平输入捕获)
- 输入捕获的一般配置步骤:
定时器
5.1 独立看门狗定时器
描述:
独立看门狗的寄存器:
独立看门狗的配置步骤:
看门狗计时时间的计算:
使用的库函数:
在1秒内按键喂狗,否则复位。初始化时LED为灭,while中点亮,如果复位则灯闪烁,喂狗后灯一直亮。
Iwdog.h文件(条件编译在预编译时实现)
Iwdog.c文件
主函数:
5.2 窗口看门狗
计数值递减,B段是窗口,
<1>当计数值递减在A段时喂狗,会产生复位信号;
<2>当计数值由0x40h减1到了0X3Fh时(T6位变为0)还没有喂狗,会产生喂狗信号。
看门狗有什么作用?
窗口看门狗超时时间计算:
窗口看门狗的配置过程:
设置窗口值时,窗口值是7位,所以存在8位值->7位的变换,使用&运算。(黄色标记部分)
主函数:
5.3 通用定时器
三种定时器:
定时器的时钟来源:
定时器的时钟默认选择的是系统内部时钟,内部时钟的选择:
计数器的时钟频率与内部时钟的关系:
预分频寄存器:
具体的定时器结构和工作过程可以参看《stm32中文参考手册》
示例
例1 定时器中断
要求:每500ms中断一次,中断服务函数控制LED状态取反,实现LED灯闪烁。
定时器参数初始化的库函数:
定时器中断实现步骤:
定时器参数计算:
根据要求,Tout=500ms,由于系统的时钟频率为72MHz,如果设置APB1的频率是AHB的2分频,即36MHz,此时就要考虑APB1的分频系数了,
<1>分频系数为1,即不分频,则输出的CK_PSC=36MHZ,即Tclk=36MHz;
<2>分频系数为2或其他值,则CK_PSC=APB12,即,Tclk=APB1 2。
由于系统函数程序中默认的是APB1=36MHz,次处设置APB1的分频系数是2,所以根据前面的介绍得出,Tclk=72MHz。ARR和PSC的值只要不超出16位二进制数转十进制数的值的范围,合理即可,当然方便理解和计算最好。
timer.c文件
定时器初始化函数
定时器中断服务函数:
主函数:
例2 PWM输出控制LED渐明渐暗
PWM输出是通过定时器TIMER中的设定值与计时值比较大小输出不同的电平。
工作过程:
PWM模式1和PWM模式2的区别:
PWM模式:
自动重转载寄存器:
PWM输出的库函数:
PWM输出的配置步骤:
示例程序:
如果使用的是高级定时器的话,必须使能这个:
例 3 引脚电平输入捕获
以通道1为例,介绍输入捕获的工作原理:
由上面的框图,分解介绍
<1>设置输入捕获滤波器:
TIMx_CR1->CKD:
捕获/比较模式寄存器TIMx_CCMR->IC1F设置采样的频率:
<2>设置输入捕获极性:
<3>设置输入捕获映射通道(通道1为例):
上面说到的映射到TI1和TI2上,如下图所示:
<4>设置输入捕获分频寄存器:
<5>捕捉到有效信号后使能中断
输入捕获相关库函数:
通道极性设置独立函数:
获取通道捕获值:
输入捕获的一般配置步骤:
使用PA0和TIM5的通道1
代码:
将结构体定义在了程序外,其它初始化与之前的类似。
定义了两个变量记录输入
中断服务函数:
主函数: