05- 定时器

定时器

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=APB12。
由于系统函数程序中默认的是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
在这里插入图片描述
在这里插入图片描述

代码:

将结构体定义在了程序外,其它初始化与之前的类似。
在这里插入图片描述
在这里插入图片描述
定义了两个变量记录输入
在这里插入图片描述
中断服务函数:
在这里插入图片描述
主函数:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STC32是基于STC89系列单片机的一款开发板,而HC-05是一款蓝牙无线通信模块。下面是一段简单的STC32与HC-05进行通信的示例程序: ```c #include <reg52.h> // 定义串口接收和发送的数据缓冲区 unsigned char receiveBuffer[10]; unsigned char sendBuffer[] = "Hello World!"; // 初始化串口 void initSerial() { TMOD = 0x20; // 定时器T1工作在8位自动重装模式 TL1 = TH1 = 0xFA; // 波特率为9600 SM0 = 0x00; // 设置串口工作在模式1 SM1 = 0x01; TR1 = 1; // 启动定时器T1 REN = 1; // 允许串口接收 TI = 0; // 清除发送中断标志位 RI = 0; // 清除接收中断标志位 } // 串口发送数据 void sendData(unsigned char *buffer, unsigned char length) { unsigned char i; for (i = 0; i < length; i++) { SBUF = buffer[i]; // 将数据发送到发送缓冲区 while (!TI); // 等待发送完成 TI = 0; // 清除发送中断标志位 } } // 串口接收中断服务函数 void serialInterrupt() interrupt 4 { if (RI) { // 接收到了数据 unsigned char data = SBUF; // 从接收缓冲区读取数据 RI = 0; // 清除接收中断标志位 // 处理接收到的数据 // ... // 发送回应数据 sendData(sendBuffer, sizeof(sendBuffer)); } } void main() { initSerial(); // 初始化串口 while (1) { // 主循环中进行其他业务处理 // ... } } ``` 以上是一段简单的STC32与HC-05通信的程序示例,程序通过串口与HC-05进行数据的发送和接收。在每次接收到数据后,程序会对接收到的数据进行处理,并发送回应数据。你可以根据实际需求修改和扩展这个简单示例程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值