使用STM32f103定时器1实现PE0~PE6的0.4秒流水灯的代码
时间: 2024-10-23 17:07:56 浏览: 40
要在STM32F103单片机上使用Timer 1实现PE0到PE6的0.4秒流水灯效果,首先需要设置定时器工作模式,配置GPIO用于LED控制,并编写主循环中的定时器更新以及LED轮流点亮的逻辑。这里提供一个简单的代码示例:
```c
#include "stm32f10x.h"
// 定义LED端口映射
#define LED_PORT GPIOB
#define LED_PIN (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5)
// Timer 1 初始化函数
void TIM1_Init(void) {
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); // 启动TIM1时钟
TIM_TimeBaseInitTypeDef.TIM_Prescaler = 8399; // 根据系统频率调整计数器预分频值(假设是72MHz)
TIM_TimeBaseInitTypeDef.TIM_Period = 1000 - 1; // 计数周期设为1000(0.4s * 256)
TIM_TimeBaseInitTypeDef.TIM_ClockDivision = 0;
TIM_TimeBaseInitTypeDef.TIM_CounterMode = TIM_COUNTERMODE_UP;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitTypeDef);
TIM_Cmd(TIM1, ENABLE); // 开启定时器
}
// 主函数中的LED切换任务
void switch_led(void) {
static uint8_t index = 0;
index++;
if (index >= 7) index = 0;
GPIO_SetBits(LED_PORT, LED_PIN >> index); // 设置当前LED亮起
HAL_Delay(400); // 等待0.4秒
GPIO_ResetBits(LED_PORT, LED_PIN >> index); // 关闭当前LED
}
int main(void) {
TIM1_Init();
GPIO_Init(LED_PORT, GPIO_MODE_OUTPUT_PP | GPIO_NOPULL); // 初始化LED端口为推挽输出
while (1) {
switch_led(); // 永远循环,不断切换LED
}
return 0;
}
```
阅读全文