stm32 标准库 给定一个标志启动小灯亮,三秒后关闭,用定时器记时,不用延时函数
时间: 2023-10-26 21:06:03 浏览: 61
可以使用STM32标准库中的定时器和GPIO模块来完成这个任务。
首先,需要初始化定时器和GPIO模块。在定时器回调函数中,设置一个标志,表示时间已经到了,然后在主循环中检查这个标志,如果时间已经到了,就关闭小灯。
以下是一个简单的示例代码:
```c
#include "stm32f10x.h"
#define LED_PIN GPIO_Pin_5
#define LED_PORT GPIOA
volatile uint8_t flag = 0; // 时间到了的标志
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
flag = 1; // 标志时间到了
}
}
void init_timer(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 使能TIM2时钟
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Prescaler = 7199; // 分频系数,定时器时钟为72MHz/7200=10kHz
TIM_TimeBaseStructure.TIM_Period = 30000; // 定时时间,10kHz*30000=3s
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分割
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 计数模式为向上计数
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); // 使能定时器更新中断
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; // 定时器2中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 子优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 使能中断通道
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM2, ENABLE); // 启动定时器
}
void init_led(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 使能GPIOA时钟
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速度为50MHz
GPIO_Init(LED_PORT, &GPIO_InitStructure);
}
int main(void)
{
init_timer();
init_led();
while (1)
{
if (flag)
{
GPIO_ResetBits(LED_PORT, LED_PIN); // 关闭小灯
while (1); // 时间到了,程序停止
}
GPIO_SetBits(LED_PORT, LED_PIN); // 启动小灯
}
return 0;
}
```
在这个例子中,定时器2被用来计时3秒。当时间到了,定时器中断会被触发,并设置`flag`标志。在主循环中,检查`flag`标志是否被设置,如果被设置,就关闭小灯并停止程序。如果`flag`标志没有被设置,就启动小灯。由于定时器中断每秒只会触发一次,程序会在3秒后停止。