0

0

0

修罗

站点介绍

只有了解事实才能获得真正的自由

STM32F103ZE点亮LED灯(一)

修罗 2025-08-18 623 5条评论 stm32

首页 / 正文

STM32F103ZE点亮LED灯(一)

1 硬件电路设计

​ 如下图:LED1-LED3是普通LED灯,LED4为电源指示灯。

image-20250818113307703.png

​ 下图展示了 STM32F103ZE 的引脚接口,LED1连接的是端口PA0,因此,只要让PA0引脚输出低电平就可以点亮LED1:

image-20250818113425424.png

2 软件设计

​ 根据前面硬件电路设计,我们只要让GPIOA的0口输出低电平就行了。

2.1 开启时钟

​ 在STM32中,让IO口工作,必须先开启对应的时钟。所以需要先查找到开启时钟的寄存器,然后通过该寄存器操作时钟的开启或关闭。我们要打开的是GPIOA的时钟。

image-20250818113710857.png

​ IOPAEN:GPIOA 的时钟使能位,只有把它置 1,GPIOA 的寄存器才能正常工作

​ 我们需要知道上面RCC_APB2ENR这个寄存器的地址。如何查找呢?先知道RCC这个外设的基地址,然后加上这个寄存器的偏移地址就行了。

image-20250818113952833.png

​ 从上面可以看出来,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:

image-20250818114331204.png

​ 只需要让这个寄存器的最后4位是 0011,就是最大速度的推挽输出。

*(uint32_t *)(0x40010800 + 0x00) = 3;

2.3 给PA0口输出0

​ 给指定PA0口输出0就可以点亮LED1了。用到的寄存器是ODR数据输出寄存器:

image-20250818114539304.png

​ 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:

image-20250818115050295.png

代码还有一些不足之处需要完善:

寄存器赋值用覆盖,容易误清其他位(应该用 |= / &=)。

对整个寄存器写值,影响所有引脚(应该只改目标引脚的位)。

代码可读性差(直接用地址,不用结构体/宏)。

评论(5)

  1. 1 游客 2025-09-01 11:27 回复

    1

  2. 1 游客 2025-09-01 12:10 回复

    1

  3. @@2nLXA 游客 2025-09-01 12:11 回复

    1

  4. 1 游客 2025-09-01 12:14 回复

    1

  5. 1 游客 2025-09-01 12:15 回复

    -1' OR 2+671-671-1=0+0+0+1 --


最新评论

  • 1

    1

  • 1

    1

  • -1' OR 2+158-158-1=0+0+0+1 or 'TKCTZnRa'='

    1

  • 1

    1

  • 1

    1

  • 1

    1

  • 1

    1

  • @@5Qa2D

    1

  • 1

    1

  • 1

    1

日历

2025年09月

 123456
78910111213
14151617181920
21222324252627
282930    

文章目录

推荐关键字: Linux webpack js 算法 MongoDB laravel JAVA jquery javase redis