stm32f103 定时器实现40分钟后将PB13拉低 15秒后拉高,每一行代码都要有注释说明
时间: 2024-03-14 13:46:50 浏览: 135
好的,下面是代码实现及注释说明:
```c
#include "stm32f10x.h"
#define LED_PIN GPIO_Pin_13
#define LED_GPIO GPIOB
int main(void)
{
// 使能 GPIOB 时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
// 配置 PB13 引脚为推挽输出
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = LED_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LED_GPIO, &GPIO_InitStructure);
// 使能 TIM3 时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
// 配置 TIM3 为定时器模式
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period = 40000 - 1; // 自动重载值
TIM_TimeBaseStructure.TIM_Prescaler = 7200 - 1; // 分频器,72MHz / 7200 = 10KHz
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
// 配置 TIM3 的中断,并使能更新中断
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
NVIC_EnableIRQ(TIM3_IRQn);
// 启动 TIM3
TIM_Cmd(TIM3, ENABLE);
while (1)
{
// 主程序循环,不需要额外的代码
}
}
// TIM3 中断处理函数
void TIM3_IRQHandler(void)
{
// 判断 TIM3 是否为更新中断
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
{
static uint16_t cnt = 0;
// 计数器加 1
cnt++;
// 判断是否到达 40 分钟
if (cnt == 24000)
{
// 停止计数器
TIM_Cmd(TIM3, DISABLE);
// 将 PB13 拉低
GPIO_ResetBits(LED_GPIO, LED_PIN);
// 重新启动计数器,定时 15 秒
TIM_SetCounter(TIM3, 0);
TIM_Cmd(TIM3, ENABLE);
cnt = 0;
}
// 判断是否到达 15 秒
if (cnt == 1500)
{
// 将 PB13 拉高
GPIO_SetBits(LED_GPIO, LED_PIN);
cnt = 0;
}
// 清除 TIM3 的更新中断标志位
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
}
}
```
注释说明:
1. `RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);` 使能 GPIOB 时钟。
2. `GPIO_InitStructure.GPIO_Pin = LED_PIN;` 配置 PB13 引脚为推挽输出。
3. `RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);` 使能 TIM3 时钟。
4. `TIM_TimeBaseStructure.TIM_Period = 40000 - 1;` 配置 TIM3 自动重载值为 40000 - 1,计数器从 0 到 39999 循环计数。
5. `TIM_TimeBaseStructure.TIM_Prescaler = 7200 - 1;` 配置 TIM3 分频器为 7200 - 1,使 TIM3 的时钟频率为 10KHz。
6. `TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);` 配置 TIM3 的中断,并使能更新中断。
7. `NVIC_EnableIRQ(TIM3_IRQn);` 使能 TIM3 的中断。
8. `TIM_Cmd(TIM3, ENABLE);` 启动 TIM3。
9. `if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)` 判断 TIM3 是否为更新中断。
10. `static uint16_t cnt = 0;` 静态变量 `cnt` 记录计数器的值。
11. `cnt++;` 计数器加 1。
12. `if (cnt == 24000)` 判断计数器是否达到 40 分钟,停止计数器,将 PB13 拉低,重新启动计数器并计时 15 秒。
13. `if (cnt == 1500)` 判断计数器是否达到 15 秒,将 PB13 拉高。
14. `TIM_ClearITPendingBit(TIM3, TIM_IT_Update);` 清除 TIM3 的更新中断标志位。
阅读全文