stm32中使用定时器中断控制led闪烁代码
时间: 2024-11-13 15:20:22 浏览: 72
在STM32单片机中,我们可以利用TIM(定时器和计数器)模块配合中断机制来控制LED灯闪烁。这里是一个基本的示例代码,我们将使用 TIM1 定时器通过溢出中断驱动 LED 闪烁:
```c
#include "stm32f1xx_hal.h"
// LED 初始化
GPIO_InitTypeDef GPIO_InitStruct;
__IO uint8_t ledState = 0;
void TIM1_IRQHandler(void) {
// 阻塞当前中断,防止嵌套
HAL_NVIC_DisableIRQ(TIM1_IRQn);
if (ledState == 0) { // LED OFF
GPIO_InitStruct.Pin = LED_PIN; // 替换LED_PIN为你实际的LED引脚
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.OType = GPIO_OType_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Value = GPIO_PIN_RESET;
HAL_GPIO_WritePin(GPIOB, LED_PIN, GPIO_PIN_RESET); // LED熄灭
} else { // LED ON
GPIO_InitStruct.Pin = LED_PIN;
GPIO_InitStruct.Value = GPIO_PIN_SET;
HAL_GPIO_WritePin(GPIOB, LED_PIN, GPIO_PIN_SET); // LED亮起
}
ledState ^= 1; // 状态反转
// 恢复中断并允许再次触发
HAL_NVIC_EnableIRQ(TIM1_IRQn);
}
int main(void) {
// 初始化TIM1、GPIOB等硬件
HAL_Init();
MX_TIM1_Init(); // 初始化定时器
MX_GPIO_Init();
// 设置TIM1的溢出中断
__HAL_RCC_TIM1_CLK_ENABLE();
GPIO_InitStruct.Pin = TIM1_COMPLEMENTARY outputs pins; // 获取TIM1互补输出引脚
HAL_TIM_Base_Init(&htim1);
HAL_NVIC_SetPriority(TIM1_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM1_IRQn);
// 开始定时器
HAL_TIM_Base_Start_IT(&htim1);
while (1) {
// 这里可以添加其他主程序任务
}
return 0;
}
阅读全文