在Keil中详细写一段实现三个LED跑马灯的代码,要求为只使用gpio口的输出,输出模式为推娩输出
时间: 2024-12-15 19:21:35 浏览: 13
在Keil uVision环境下编写STM32F407微控制器的代码,我们需要使用HAL库来控制GPIO口。以下是一个简单的示例,假设我们有三个LED连接到PA8、PA9和PA10:
```c
#include "stm32f4xx_hal.h"
#include "tim.h"
// LED GPIO初始化
__IO uint16_t LedPin[] = {GPIO_PIN_8, GPIO_PIN_9, GPIO_PIN_10};
__IO GPIO_TypeDef *LedPort[] = {GPIOA};
void led_init(void) {
GPIO_InitTypeDef GPIO_InitStructure;
for (int i = 0; i < 3; i++) {
GPIO_InitStructure.Pin = LedPin[i];
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出
GPIO_InitStructure.Pull = GPIO_NOPULL;
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(LedPort[i], &GPIO_InitStructure);
}
}
// LED跑马灯函数
void led_marathon(uint8_t start_index, uint8_t direction) {
static uint8_t current_led = 0;
static bool state = true; // 初始状态为高电平
if (start_index == current_led && direction == 1) { // 如果当前LED和新开始LED相同且方向相反,则切换状态
state = !state;
}
HAL_GPIO_WritePin(LedPort[current_led], LedPin[current_led], state); // 设置LED状态
current_led += direction; // 更新LED索引
if (current_led >= 3) { // 如果超过最后一个LED,回到第一个LED
current_led = 0;
} else if (current_led < 0) { // 如果小于第一个LED,到达最后一个LED后回溯
current_led = 2;
}
}
int main(void) {
led_init();
TIM_HandleTypeDef hTIM;
TIM_TimeBaseInitTypeDef.TIM_Prescaler = 5000 - 1; // 5ms周期,这里假设系统时钟频率为100MHz
TIM_TimeBaseInitTypeDef.TIM_Period = 1000;
TIM_TimeBaseInit(&hTIM, &TIM_TimeBaseInitTypeDef);
TIM_ITConfig(&hTIM, TIM_IT_Update, ENABLE); // 开启更新中断
HAL_TIM_Base_Start(&hTIM);
while (1) {
led_marathon(0, 1); // 从第一个LED开始往右跑
HAL_Delay(500); // 暂停一段时间等待下一次切换
}
return 0;
}
```
阅读全文