stm32f103c8t6基于寄存器流水灯
时间: 2025-01-05 12:31:30 浏览: 13
### STM32F103C8T6 使用寄存器实现流水灯效果
为了通过寄存器控制STM32F103C8T6上的LED,需要理解如何配置GPIO端口以及如何操作这些端口来点亮或熄灭LED。
#### 配置GPIO端口
首先,初始化GPIO端口用于输出模式。假设使用的是PA5、PB7和PC9三个引脚连接到LED:
```c
// 解锁 GPIOA, GPIOB 和 GPIOC 的外设时钟
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPCEN;
// 设置 PA5 为推挽输出模式
GPIOA->CRL &= ~(0xF << (4 * 5));
GPIOA->CRL |= (0x2 << (4 * 5));
// 设置 PB7 为推挽输出模式
GPIOB->CRH &= ~(0xF << (4 * 7 - 32));
GPIOB->CRH |= (0x2 << (4 * 7 - 32));
// 设置 PC9 为推挽输出模式
GPIOC->CRH &= ~(0xF << (4 * 9 - 32));
GPIOC->CRH |= (0x2 << (4 * 9 - 32));
```
这段代码解锁了所需的GPIO端口,并设置了特定引脚的工作模式为推挽输出[^1]。
#### 实现流水灯逻辑
接下来编写循环程序让LED依次亮起再熄灭形成流动的效果:
```c
while(1){
// LED1 ON, others OFF
GPIOA->ODR = (1U<<5);
GPIOB->ODR = 0;
GPIOC->ODR = 0;
delay_ms(500);
// LED2 ON, others OFF
GPIOA->ODR = 0;
GPIOB->ODR = (1U<<7);
GPIOC->ODR = 0;
delay_ms(500);
// LED3 ON, others OFF
GPIOA->ODR = 0;
GPIOB->ODR = 0;
GPIOC->ODR = (1U<<9);
delay_ms(500);
}
```
这里定义了一个无限循环,在每次迭代中改变不同GPIO端口的数据寄存器(`ODR`)值以切换对应的LED状态,并调用了`delay_ms()`函数提供延迟时间使得视觉上可以看到明显的闪烁变化。
请注意上述例子中的延时函数并未给出具体实现;实际应用时可以根据需求选用合适的硬件定时器或者软件延时方法。
阅读全文