STM32F103C8T6HAl库跑马灯代码
时间: 2024-10-28 11:10:31 浏览: 32
STM32F103C8T6HAl是一款基于STM32F103C8T6微控制器的板子,它通常用于开发基于C语言的应用程序。在实现LED跑马灯效果,我们常常会利用其GPIO功能以及定时器来控制LED灯的亮灭周期。
这是一个简单的跑马灯代码示例,假设你有两个GPIO引脚(例如PA0和PA1)连接到LED灯:
```c
#include "stm32f10x.h" // 包含STM32官方头文件
// 定义LED灯标志位和定时器变量
volatile uint8_t led_index = 0; // 当前点亮的LED索引
uint16_t timer_value = 500; // LED闪烁间隔(毫秒)
void Led_Init(void) {
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); // 启动GPIOA时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; // 设置要操作的LED引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 输出推挽模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 高速
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void Tim2_IRQHandler(void) {
if (TIM2->SR & TIM_SR_UIF) { // 如果定时器溢出中断标志触发
TIM2->CR1 &= ~TIM_CR1 UIF; // 清除中断标志
if (led_index < 2) { // 只有两个LED
GPIO_ResetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1); // 熄灭当前LED
led_index = ++led_index % 2; // 切换LED并点亮下一个
GPIO_SetBits(GPIOA, GPIO_Pin_0 << led_index); // 点亮新的LED
}
TIM2->ARR = timer_value; // 重新设置定时器预设值
TIM2->CNT = 0; // 重置定时器计数器
}
}
int main(void) {
Led_Init();
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Prescaler = 8399; // 根据系统频率计算合适的预分频值,这里假设系统频率是72MHz
TIM_TimeBaseStructure.TIM_Period = 1000 - 1; // LED闪烁间隔减去1(防止首次触发溢出)
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
NVIC_EnableIRQ(TIM2_IRQn); // 开启定时器2中断
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); // 启用定时器更新中断
while (1) {}
}
```
阅读全文