不用stm32标准库写一个STM32f103rbt6的点灯代码,并且每一行都进行详细的注释
时间: 2024-05-01 08:20:04 浏览: 169
好的,下面是一个不使用STM32标准库的STM32F103RBT6点灯代码,每一行都进行了详细注释:
```c
#include <stdint.h> // 引入stdint.h头文件,定义了各种数据类型的别名
#include "stm32f103xb.h" // 引入stm32f103xb.h头文件,包含了STM32F103xB芯片的寄存器地址
#define RCC_APB2ENR_GPIOCEN_Pos 4 // 定义RCC_APB2ENR寄存器中GPIOCEN位的位置为4
#define RCC_APB2ENR_GPIOCEN_Msk (1UL << RCC_APB2ENR_GPIOCEN_Pos) // 定义RCC_APB2ENR寄存器中GPIOCEN位的掩码
#define GPIOC_CRH_MODE13_Pos 20 // 定义GPIOC_CRH寄存器中MODE13位的位置为20
#define GPIOC_CRH_MODE13_Msk (0b11UL << GPIOC_CRH_MODE13_Pos) // 定义GPIOC_CRH寄存器中MODE13位的掩码为0b11
#define GPIOC_CRH_CNF13_Pos 22 // 定义GPIOC_CRH寄存器中CNF13位的位置为22
#define GPIOC_CRH_CNF13_Msk (0b11UL << GPIOC_CRH_CNF13_Pos) // 定义GPIOC_CRH寄存器中CNF13位的掩码为0b11
int main(void) {
RCC->APB2ENR |= RCC_APB2ENR_GPIOCEN_Msk; // 开启GPIOC时钟
GPIOC->CRH &= ~(GPIOC_CRH_MODE13_Msk | GPIOC_CRH_CNF13_Msk); // 清空GPIOC13的MODE和CNF位
GPIOC->CRH |= (0b0010UL << GPIOC_CRH_MODE13_Pos); // 设置GPIOC13为输出模式,最大输出速率为2MHz
while (1) {
GPIOC->BSRR = GPIO_BSRR_BS13; // 点亮LED
for (uint32_t i = 0; i < 1000000; i++); // 延时
GPIOC->BSRR = GPIO_BSRR_BR13; // 熄灭LED
for (uint32_t i = 0; i < 1000000; i++); // 延时
}
}
```
注释已经写在代码中了,这里简单介绍一下代码的实现过程。
首先,我们需要引入`stdint.h`和`stm32f103xb.h`头文件,分别定义了各种数据类型的别名和STM32F103xB芯片的寄存器地址。
然后,我们定义了一些宏,用于方便操作一些寄存器位。
在`main()`函数中,我们开启了GPIOC的时钟,并配置了GPIOC13位为输出模式,最大输出速率为2MHz。
最后,我们使用无限循环来控制LED的点灭,每隔一段时间点亮或熄灭LED。具体来说,我们使用了`GPIOC->BSRR`寄存器来控制GPIOC13位的状态,其中`GPIO_BSRR_BS13`表示将GPIOC13位置位(点亮LED),`GPIO_BSRR_BR13`表示将GPIOC13位清零(熄灭LED)。我们通过循环实现了一个简单的延时功能,每次循环都会进行一次延时,由于运行速度非常快,所以需要延时一段时间来控制LED的点亮和熄灭。
阅读全文