stm32爱心流水灯代码
时间: 2023-09-09 22:12:09 浏览: 96
以下是一个简单的 STM32 爱心流水灯代码示例,使用了 TIM3 定时器和 GPIO 口控制:
```c
#include "stm32f10x.h"
// 爱心流水灯的 LED 引脚编号
#define LED_0_PIN GPIO_Pin_0
#define LED_1_PIN GPIO_Pin_1
#define LED_2_PIN GPIO_Pin_2
#define LED_3_PIN GPIO_Pin_3
#define LED_4_PIN GPIO_Pin_4
#define LED_5_PIN GPIO_Pin_5
#define LED_6_PIN GPIO_Pin_6
#define LED_7_PIN GPIO_Pin_7
// 爱心流水灯的 LED 引脚组
#define LED_PORT GPIOB
#define LED_ALL (LED_0_PIN | LED_1_PIN | LED_2_PIN | LED_3_PIN | LED_4_PIN | LED_5_PIN | LED_6_PIN | LED_7_PIN)
// 定时器 TIM3 预分频值
#define TIM3_PRESCALER_VALUE (SystemCoreClock / 1000000 - 1)
// 定时器 TIM3 ARR 值
#define TIM3_ARR_VALUE 300
// 定时器 TIM3 中断优先级
#define TIM3_IRQ_PRIORITY 0
// 爱心流水灯的 LED 状态数组
uint8_t led_states[] = {0x18, 0x3C, 0x7E, 0xFF, 0xFF, 0x7E, 0x3C, 0x18};
// 当前流水灯状态的索引
uint8_t led_index = 0;
// 定时器 TIM3 中断处理程序
void TIM3_IRQHandler(void)
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
{
// 清除 TIM3 更新中断标志位
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
// 设置 LED 引脚状态
GPIO_Write(LED_PORT, (uint16_t)led_states[led_index]);
// 更新流水灯状态的索引
led_index = (led_index + 1) % sizeof(led_states);
}
}
int main(void)
{
// 使能 GPIOB 外设时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
// 配置 GPIOB 引脚为推挽输出模式
GPIO_InitTypeDef gpio_init;
gpio_init.GPIO_Pin = LED_ALL;
gpio_init.GPIO_Mode = GPIO_Mode_Out_PP;
gpio_init.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LED_PORT, &gpio_init);
// 使能 TIM3 外设时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
// 配置定时器 TIM3
TIM_TimeBaseInitTypeDef tim_init;
tim_init.TIM_Period = TIM3_ARR_VALUE;
tim_init.TIM_Prescaler = TIM3_PRESCALER_VALUE;
tim_init.TIM_CounterMode = TIM_CounterMode_Up;
tim_init.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM3, &tim_init);
// 配置 TIM3 更新中断
NVIC_InitTypeDef nvic_init;
nvic_init.NVIC_IRQChannel = TIM3_IRQn;
nvic_init.NVIC_IRQChannelPreemptionPriority = TIM3_IRQ_PRIORITY;
nvic_init.NVIC_IRQChannelSubPriority = 0;
nvic_init.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&nvic_init);
// 启动定时器 TIM3
TIM_Cmd(TIM3, ENABLE);
while (1)
{
// 暂停主函数
__WFI();
}
}
```
此代码将在 PB0~PB7 的引脚上控制一个爱心流水灯。每隔一段时间更新一次 LED 的状态,从数组 `led_states` 中取出一个字节,分别表示每个 LED 的亮灭状态。循环播放该数组中的所有状态,形成爱心流水灯的效果。
阅读全文