stm32 标准库 在一个函数中给定一个标志启动小灯亮,三秒后关闭,在另一个函数中同理,用定时器记时,不用延时函数
时间: 2024-02-03 10:14:00 浏览: 121
可以使用STM32的定时器和中断来实现计时功能,代码如下:
```c
#include "stm32f10x.h"
#define LED_PIN GPIO_Pin_13
#define LED_PORT GPIOC
uint8_t flag = 0; // 标志位
void init_led(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = LED_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LED_PORT, &GPIO_InitStructure);
}
void init_timer(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseStructure.TIM_Period = 2999; // 定时器周期为3s
TIM_TimeBaseStructure.TIM_Prescaler = 7199; // 定时器预分频为72Mhz/7200
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
}
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
flag = 1; // 定时器溢出,标志位置1
}
}
void led_on(void)
{
GPIO_SetBits(LED_PORT, LED_PIN);
}
void led_off(void)
{
GPIO_ResetBits(LED_PORT, LED_PIN);
}
int main(void)
{
init_led();
init_timer();
while (1)
{
if (flag) // 定时器溢出标志位为1
{
led_on(); // 点亮LED
TIM_Cmd(TIM2, DISABLE); // 停止定时器
flag = 0; // 标志位清零
// 启动第2个计时器
TIM_Cmd(TIM3, ENABLE);
TIM_ClearFlag(TIM3, TIM_FLAG_Update);
}
}
return 0;
}
void TIM3_IRQHandler(void)
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
led_off(); // 关闭LED
TIM_Cmd(TIM3, DISABLE); // 停止定时器
}
}
```
在上面的代码中,我们初始化了一个定时器`TIM2`来计时3秒,并在定时器中断中将标志位`flag`置为1。当`flag`为1时,我们就可以执行需要在3秒后执行的任务,例如点亮LED。同时,我们启动了另外一个定时器`TIM3`来计时3秒,当`TIM3`定时器中断发生时,我们就可以执行需要在6秒后执行的任务,例如关闭LED。
另外,需要注意的是,`TIM2`和`TIM3`的时钟源都是APB1时钟,因此,预分频系数为`7199`,周期为3秒,即:
$$
T_{TIM2} = \frac{(7199+1)\times(72Mhz)}{72Mhz} = 1s\\
T_{TIM3} = T_{TIM2} \times 3 = 3s
$$
这样,我们就可以实现在一个函数中给定一个标志启动小灯亮,三秒后关闭,在另一个函数中同理,用定时器记时,不用延时函数的功能了。
阅读全文