stm32点亮流水灯代码
时间: 2024-07-16 17:00:55 浏览: 94
STM32点亮流水灯通常涉及到GPIO和定时器的基本操作。这里是一个简单的示例代码,使用STM32F103系列的GPIOA端口连接LED数码管(例如7段数码管),并通过TIM2定时器控制LED轮流点亮:
```c
#include "stm32f1xx.h"
// 定义LED数码管的段位
#define LED_PORT GPIOA
#define LED_PIN_0 GPIO_Pin_0 // 数码管的第一位
#define LED_PIN_1 GPIO_Pin_1
// ...其他位定义
// TIM2初始化结构体
TIM_HandleTypeDef htim2;
void TIM2_IRQHandler(void) {
static uint8_t led_index = 0;
// 判断当前触发中断的是哪个计数状态
if (htim2.Instance->CNT <= 1) {
// 清零定时器,并更新LED亮灭顺序
htim2.Instance->CNT = 0;
led_index++;
if (led_index >= 8) { // 如果超过最大位数,重新从第一位开始
led_index = 0;
}
// 更新GPIO的状态
LED_PORT->BSRR &= ~(1 << LED_PIN_0 + led_index); // 非高电平有效,关闭前一位LED
LED_PORT->BSRR |= (1 << LED_PIN_0 + led_index); // 打开新的LED位置
}
}
int main(void) {
// GPIOA配置为推挽输出
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = LED_PIN_0 | LED_PIN_1; // 初始化LED段位
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(LED_PORT, &GPIO_InitStruct);
// TIM2初始化
htim2.Instance = TIM2;
htim2.Init.Prescaler = 100 - 1; // 设置定时周期,根据实际需求调整
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 100; // 设定每个脉冲持续时间
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
HAL_TIM_Base_Init(&htim2);
// TIM2中断使能
HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0); // 设置优先级
HAL_NVIC_EnableIRQ(TIM2_IRQn);
while (1) {
// 主程序不执行,等待定时器触发中断
}
}
```
阅读全文