野火stm32f103跑马灯寄存器
时间: 2025-01-21 14:27:24 浏览: 32
### STM32F103 跑马灯 寄存器编程 教程
#### 初始化 GPIO 口
为了使能端口时钟并配置 GPIO 引脚作为推挽输出模式,需要操作 RCC_APB2ENR 寄存器来开启相应端口的时钟。对于 GPIOA 的情况:
```c
#define RCC_APB2Periph_GPIOA (1<<2)
void EnableClock() {
// 使能GPIOA时钟
RCC->APB2ENR |= RCC_APB2Periph_GPIOA;
}
```
接下来设定 GPIO 控制寄存器 CRL 或 CRH 来指定引脚的工作模式。这里假设使用 PA8 到 PA15 进行控制,则需修改 CRL。
```c
void ConfigureGPIOPinsAsOutput() {
// 设置PA8~PA15为通用推挽输出,最大速度50MHz
GPIOA->CRL &= ~(0xFFFFFFFF << 4 * 8);
GPIOA->CRL |= (0xB << 4 * 8);
}
```
上述代码片段中 `&=` 和 `|=` 操作用于清除原有配置并将新值写入特定位置[^1]。
#### 实现 LED 流水灯逻辑
定义宏定义简化对 IO 端口的操作,并编写函数完成实际点亮过程中的状态切换。
```c
#define SET_LED_ON(port,pin) ((port)->BSRR = (pin))
#define SET_LED_OFF(port,pin)((port)->BRR = (pin))
void ToggleLED(GPIO_TypeDef* port,uint16_t pin){
if((port->ODR & pin)==0)
SET_LED_ON(port,pin);
else
SET_LED_OFF(port,pin);
}
int main(void) {
uint16_t pins[] = {GPIO_Pin_8, GPIO_Pin_9, ... , GPIO_Pin_15}; // 定义要使用的引脚数组
EnableClock();
ConfigureGPIOPinsAsOutput();
while(1){
for(int i=0;i<sizeof(pins)/sizeof(uint16_t);i++){
ToggleLED(GPIOA,pins[i]);
delay_ms(300); // 自己实现或引入合适的延时函数
}
}
return 0;
}
```
这段程序通过遍历预先准备好的引脚列表,在每次迭代过程中改变对应引脚的状态从而形成流动的效果[^4]。
阅读全文
相关推荐


















