stm32F429IGTx四个LED流水灯效果代码编写
时间: 2024-09-15 18:00:50 浏览: 82
STM32F429IGTx是一款基于ARM Cortex-M4架构的微控制器,用于LED流水灯效果,我们需要用到GPIO端口控制以及定时器来实现闪烁的效果。这里提供一个简单的示例代码,假设我们有四个LED连接到PA8、PB0、PB1和PB2:
```c
#include "stm32f4xx.h"
// 定义LED GPIO和定时器
GPIO_TypeDef* GPIOA = GPIOA_BASE;
GPIO_TypeDef* GPIOB = GPIOB_BASE;
TIM_HandleTypeDef htim;
// LED编号
enum {LED1 = 0x01, LED2 = 0x02, LED3 = 0x04, LED4 = 0x08};
void led_init(void) {
// 配置GPIO
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = GPIO_Pin_8; // LED1 on PA8
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; //推挽模式
GPIO_InitStruct.Pull = GPIO_NOPULL; //无上拉下拉
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2; // LED2, LED3, LED4 on PB0, PB1, PB2
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
void timer_config(void) {
htim.Instance = TIM2; // 使用TIM2
htim.Init.Prescaler = 8399; // 根据系统频率调整预分频,使得周期约为1s
htim.Init.CounterMode = TIM_COUNTERMODE_UP;
htim.Init.Period = 5000; // 1s周期内点亮50%的时间
HAL_TIM_Base_Init(&htim);
HAL_TIM_Base_Start(&htim);
}
void led_blink() {
uint32_t dutyCycle = htim.Instance->CNT / (htim.Init.Period + htim.Init.Prescaler); // 计算占空比
// 控制LED1
if (dutyCycle > LED1) {
HAL_GPIO_WritePin(GPIOA, GPIO_Pin_8, GPIO_PIN_RESET);
} else {
HAL_GPIO_WritePin(GPIOA, GPIO_Pin_8, GPIO_PIN_SET);
}
// 控制LED2, LED3, LED4
HAL_GPIO_WritePin(GPIOB, GPIO_Pin_0, GPIO_PIN_SET); // 当前高电平
HAL_Delay(dutyCycle);
HAL_GPIO_WritePin(GPIOB, GPIO_Pin_0, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_Pin_1, GPIO_PIN_SET);
HAL_Delay(dutyCycle);
HAL_GPIO_WritePin(GPIOB, GPIO_Pin_1, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_Pin_2, GPIO_PIN_SET);
HAL_Delay(dutyCycle);
HAL_GPIO_WritePin(GPIOB, GPIO_Pin_2, GPIO_PIN_RESET);
}
int main(void) {
led_init();
timer_config();
while (1) {
led_blink(); // 每次定时器中断触发时,更新LED状态
}
}
```
阅读全文