stm32f103r6寄存器点灯
时间: 2024-12-31 08:28:54 浏览: 14
### STM32F103R6 单片机通过寄存器操作实现LED点亮
对于STM32F103系列单片机而言,直接操作寄存器是一种深入理解硬件工作原理的方式。这种方式绕过了标准外设库或HAL库的抽象层,提供了更精细的操作能力。
#### GPIO初始化配置
为了使能特定端口上的GPIO功能并设置其模式(输入/输出),需要修改对应的`APB2ENR`寄存器来开启时钟供给,并调整相应的控制寄存器如`CRL`和`CRH`以指定引脚的工作状态[^1]。
```c
// 开启GPIOA时钟
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
// 设置PA0为推挽输出模式,最大速度50MHz
GPIOA->CRL &= ~(0xF << (4 * 0)); // 清除原有配置
GPIOA->CRL |= (0x02 << (4 * 0)); // 推挽输出模式
```
#### 控制LED的状态变化
一旦完成了上述初始化过程之后,就可以利用位带操作轻松改变LED连接引脚电平高低从而达到开关效果:
```c
#define LED_ON() (GPIOA->BSRR = GPIO_BSRR_BR_0) /* 关闭 */
#define LED_OFF() (GPIOA->BSRR = GPIO_BSRR_BS_0) /* 打开 */
while(1){
LED_ON();
for(volatile int i=0;i<1000000;i++); // 延迟循环
LED_OFF();
for(volatile int i=0;i<1000000;i++);
}
```
这段程序展示了如何使用简单的延时循环让LED按照一定频率闪烁。实际应用中建议替换为此种方法以外更为精确可靠的定时机制[^2]。
#### 完整示例代码展示
下面给出了一段完整的用于演示目的的小型应用程序源码片段,它实现了基于寄存器级别的编程接口去驱动外部接线至PA0的一个LED灯泡持续交替亮灭的效果。
```c
#include "stm32f1xx.h"
int main(void)
{
// 配置系统时钟
// 初始化GPIOA PA0 输出
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // 使能GPIOA时钟
GPIOA->CRL &= ~(0xF << (4 * 0)); // 清除旧配置
GPIOA->CRL |= (0x02 << (4 * 0)); // 设定为推挽输出模式
while (1)
{
GPIOA->BSRR = GPIO_BSRR_BS_0;
for(volatile unsigned long i = 0 ;i < 1000000UL ; ++i);
GPIOA->BSRR = GPIO_BSRR_BR_0;
for(volatile unsigned long i = 0 ;i < 1000000UL ; ++i);
}
}
```
阅读全文