stm32流水灯一个一个亮代码
时间: 2024-10-13 13:04:45 浏览: 16
STM32单片机上的流水灯通常是指LED数码管的动态显示,下面是一个简单的例子,展示如何使用STM32通过定时器逐位点亮一组共阳极LED数码管:
```c
#include "stm32f10x.h"
// LED数码管配置
#define LED_PORT GPIOA // LED数码管连接到GPIOA
#define LED_PIN array_of_pins // 数码管的各个段对应的GPIO引脚
// 定义定时器配置
#define TIMER TIM2
#define PRESCALER RCC_APB1Periph_APB2 // 分频器预设值
#define PERIOD (F_CPU / 1000000) - 1 // 设置周期,比如50ms闪烁,F_CPU是系统时钟频率
void TIM_Config(void);
void Display_Bit(uint8_t bit);
int main(void)
{
TIM_Config();
while(1)
{
for(uint8_t i = 0; i < 7; ++i) // 一般7段数码管有7位
Display_Bit(i);
// 等待下一次循环,这里可以设置延时
HAL_Delay(PERIOD);
}
}
void TIM_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef.TIM_TimeBaseStructure;
// 初始化GPIO
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);
// 初始化TIM
TIM_TimeBaseStructure.TIM_Period = PERIOD;
TIM_TimeBaseStructure.TIM_Prescaler = ((F_CPU / PRESCALER) - 1) / 10;
TIM_TimeBaseInit(TIMER, &TIM_TimeBaseStructure);
TIM_Cmd(TIMER, ENABLE); // 开启定时器
}
void Display_Bit(uint8_t bit)
{
// 打开对应LED位
LED_PORT->ODR |= (1 << bit);
// 等待定时器计时结束
TIM_Delay(PERIOD);
// 关闭LED位
LED_PORT->ODR &= ~(1 << bit);
}
```
阅读全文