做一个用STM32F103R6芯片PB0~PB9引脚电平的高低变化,进而控制10个LED的亮灭,实现跑马灯效果的代码
时间: 2024-12-13 11:28:08 浏览: 23
为了在STM32F103R6单片机上通过PB0到PB9引脚控制10个LED实现跑马灯的效果,你需要使用定时器T1的PWM功能以及GPIO端口的基本配置。这里是一个简化的示例代码,假设你已经设置了系统时钟并初始化了GPIO和TIM1。
首先,需要包括必要的头文件:
```c
#include "stm32f10x.h"
#include "delay.h" // 自定义延时函数,例如使用定时器延时
```
然后设置GPIO:
```c
void LED_Config(uint8_t ledPin) {
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = ledPin; // 设置对应LED的GPIO引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode Outs; // 输出模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出
HAL_GPIO_Init(GPIOB, &GPIO_InitStructure); // 初始化GPIO
}
// 开启或关闭某个LED
void LED_Toggle(uint8_t ledPin) {
GPIO_ToggleBits(GPIOD, ledPin);
}
```
接下来,配置定时器T1作为PWM源:
```c
void TIM1_PWM_Config() {
TIM_TimeBaseInitTypeDef.TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
// 配置定时器周期(比如周期为1000us)
TIM_TimeBaseStructure.TIM_Period = 1000 - 1; // 减去1是为了避免溢出
TIM_TimeBaseStructure.TIM_Prescaler = (SystemCoreClock / 1000000U - 1) / 4; // 根据实际时钟频率调整预分频值
HAL_TIM_Base_Init(&htim1);
HAL_TIM_Base_Start(&htim1);
// 配置通道1为PWM输出
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0; // PWM高脉冲时间
TIM_OCInitStructure.TIM_DutyCycle = 50; // 50% duty cycle for a symmetric PWM signal
HAL_TIM_OC_InitChannel(&htim1, &TIM_OCInitStructure, TIM_CHANNEL_1);
}
```
主循环部分实现跑马灯效果:
```c
int main(void) {
LED_Config(LED_Pin_1); // 初始化第一个LED
TIM1_PWM_Config(); // 启动PWM
while (1) {
for(int i = 0; i < 10; i++) { // 指定10个LED
if(i == 0 || i % 2 == 0) { // 跑马灯模式,交替点亮前两个LED
LED_Toggle(LED_Pin_1);
LED_Toggle(LED_Pin_2);
} else {
LED_Toggle(LED_Pin_2);
LED_Toggle(LED_Pin_3);
}
HAL_Delay(100); // 稍微延时,等待下一个LED切换
}
}
}
```
注意:这只是一个基本的示例,实际项目中可能需要处理中断、错误检查和其他细节。此外,如果你使用的LED不是直接连接到GPIO的,可能还需要外部驱动电路。
阅读全文