STM32F103ZE点亮LED灯(一)
1 硬件电路设计
如下图:LED1-LED3是普通LED灯,LED4为电源指示灯。
下图展示了 STM32F103ZE 的引脚接口,LED1连接的是端口PA0,因此,只要让PA0引脚输出低电平就可以点亮LED1:
2 软件设计
根据前面硬件电路设计,我们只要让GPIOA的0口输出低电平就行了。
2.1 开启时钟
在STM32中,让IO口工作,必须先开启对应的时钟。所以需要先查找到开启时钟的寄存器,然后通过该寄存器操作时钟的开启或关闭。我们要打开的是GPIOA的时钟。
IOPAEN:GPIOA 的时钟使能位,只有把它置 1,GPIOA 的寄存器才能正常工作
我们需要知道上面RCC_APB2ENR这个寄存器的地址。如何查找呢?先知道RCC这个外设的基地址,然后加上这个寄存器的偏移地址就行了。
从上面可以看出来,RCC的基地址是0x4002 1000,APB2ENR的偏移量是0x18,所以APB2ENR的地址值是0x4002 1000 + 0x18
有了地址,在这个地址写入一个数据,这个数据的二进制第2位是1就行了。其他位暂时不管。我们写入4。这样就开启了GPIOA的时钟。
*(uint32_t *)(0x40021000 + 0x18) = 4; // 在代码中,我们需要把地址强转成指针才能给这个地址赋值。
2.2 给IO口设置输出模式
在STM32中,如果要让IO口输出低电平或高电平,必须给要使用的IO设置为输出模式。根据前面的思路,需要先找到GPIOA的基地址,再根据偏移地址找到要使用的寄存器的地址。GPIOA的基地址是0x4001 0800。
GPIOx_CRL:配置端口 第 0~7 引脚(低 8 个引脚)
GPIOx_CRH:配置端口 第 8~15 引脚(高 8 个引脚)
配置PA0口的输出模式的寄存器是GPIOA_CRL:
只需要让这个寄存器的最后4位是 0011,就是最大速度的推挽输出。
*(uint32_t *)(0x40010800 + 0x00) = 3;
2.3 给PA0口输出0
给指定PA0口输出0就可以点亮LED1了。用到的寄存器是ODR数据输出寄存器:
ODR寄存器的地址是 0x40010800 + 0x0c 。给这个地址的第0位写0,其他位写1。
*(uint32_t *)((0x40010800 + 0x0c)) = 0xfffe;
2.4 main.c
#include "stdint.h"
int main(void)
{
/* 开启GPIOA的时钟 */
*(uint32_t *)(0x40021000 + 0x18) = 4;
/* 给PA0设置为通用推挽输出 */
*(uint32_t *)(0x40010800 + 0x00) = 3;
/* 给输出寄存器赋值 */
*(uint32_t *)(0x40010800 + 0x0c) = 0xfffe;
while (1)
{
}
}
编译代码下载编译后的程序即可点亮LED1:
代码还有一些不足之处需要完善:
寄存器赋值用覆盖,容易误清其他位(应该用 |= / &=)。
对整个寄存器写值,影响所有引脚(应该只改目标引脚的位)。
代码可读性差(直接用地址,不用结构体/宏)。
1 游客 2025-09-01 11:27 回复
1
1 游客 2025-09-01 12:10 回复
1
@@2nLXA 游客 2025-09-01 12:11 回复
1
1 游客 2025-09-01 12:14 回复
1
1 游客 2025-09-01 12:15 回复
-1' OR 2+671-671-1=0+0+0+1 --