STM32F103寄存器方式点亮LED流水灯

  • Post author:
  • Post category:其他




一、什么是寄存器

简单地说,寄存器就是存放东西的存贮部件,它们主要暂存指令、数据和地址。官方说法是寄存器是

CPU

内部用来存放一些小型存储区域,用来暂时存放参与运算的数据和运算结果。同时,我们通过不同的地址区分不同的寄存器。



1、如何找到寄存器地址


step1:找到GPIOB的基地址


找到

GPIOB



小区

,即所有

GPIOB

相关的寄存器,都住在

0x4001 0C00



0x4001 0FFF

范围内。

在这里插入图片描述


step2:找到端口输入寄存器的地址偏移


找到存储数据的那个

屋子

,结论是

0x4001 0C00+8 = 0x4001 0C08


在这里插入图片描述


step3:找到知道数据的那个人


例如:

PB3

的数据位于从右往左数第4个。

在这里插入图片描述


结论:



PB3

的输入数据位于

0x4001 0C08

这个地址上,这个地址上存放数据的右起第4个位就是

PB3

引脚对应的高低电平。



二、使用寄存器点亮 LED 灯

自己尝试新建工程时,请对照查阅《新建工程— 寄存器版》章节。若没有安装

KEIL5

软件,请参考《如何安装 KEIL5》章节。

打开该工程,可看到一共有三个文件,分别

startup_stm32f10x_hd.s



stm32f10x.h

以及

main.c

,下面我们对这三个文件进行讲解。

在这里插入图片描述



2.1 硬件连接

在本教程中

STM32

芯片与

LED

灯的连接见图这是一个

RGB

灯,里面由红蓝绿三个小灯构成,使用

PWM

控制时可以混合成 256 不同的颜色。

在这里插入图片描述

我们的目标是把

GPIO

的引脚设置成推挽输出模式并且默认下拉,输出低电平,这样就能让

LED

灯亮起来了。



2.2 启动文件

名为

startup_stm32f10x_hd.s

的文件,它里边使用汇编语言写好了基本程序,当

STM32

芯片上电启动的时候,首先会执行这里的汇编程序,从而建立起 C 语言的运行环境,所以我们把这个文件称为启动文件。该文件使用的汇编指令是

Cortex-M3

内核支持的指令:

在这里插入图片描述



2.3 stm32f10x.h 文件

在编程之前我们要先实现寄存器映射,有关寄存器映射的代码都统一写在

stm32f10x.h

文件中,见代码:

在这里插入图片描述


GPIO

外设的地址跟前面章节讲解的相同,不过此处把寄存器的地址值都直接强制转换成了指针,方便使用。代码的最后两段是

RCC

外设寄存器的地址定义,

RCC

外设是用来设置时钟的。



2.4 main 文件

在这里插入图片描述

此时直接编译的话,会出现如下错误:

Error: L6218E: Undefined symbol SystemInit (referred from startup_stm32f10x.o)

错误提示

SystemInit

没有定义。

修改代码如下:


main

中添加如下函数:

在这里插入图片描述

还有一个方法就是在启动文件中把有关

SystemInit


的代码注释掉也可以,具体操作如下:

在这里插入图片描述

接下来在

main

函数中添加代码,实现我们的点灯之旅。



三、 GPIO模式

首先我们把连接到

LED

灯的

GPIO

引脚

PBO

配置成输出模式,即配置

GPIO

的端口配置低寄存器

CRL

,在这里我们把

PB0

配置为通用推挽输出,输出的速度为 10M:

在这里插入图片描述

在这里插入图片描述



3.1 控制引脚输出电平

在输出模式时,对端口位设置/清除寄存器

BSRR

寄存器、端口位清除寄存器

BRR



ODR

寄存器写入参数即可控制引脚的电平状态,其中操作

BSRR



BRR

最终影响的都是

ODR

寄存器,然后再通过

ODR

寄存器的输出来控制

GPIO



在这里插入图片描述

在这里插入图片描述



3.2 开启外设时钟

由于

STM32

的 外设很多,为了降低功耗,每个外设都对应着一个时钟,在芯片刚上电的时候这些时钟都是被关闭的,如果想要外设工作,必须把相应的时钟打开。

在这里插入图片描述

在这里插入图片描述



3.3 LED灯点亮

现在我们完整组织下用

STM32

控制一个

LED

的代码。

在这里插入图片描述



3.4 下载验证

把编译好的程序下载到开发板并复位,可看到板子上的

LED

灯被点亮。



四、C语言实现LED点灯



4.1 创建工程


step1:创建项目,名称为test3


在这里插入图片描述

在这里插入图片描述



4.2 配置环境


step2:选择STM32F103C8版


在这里插入图片描述


step3:勾选Starup和Core


在这里插入图片描述


step4:点击魔法棒


在这里插入图片描述


step5:在output里选择create hex file


在这里插入图片描述



4.3 创建leddd.c文件


step6:在source group里创建leddd.c

在这里插入图片描述

写入代码,注意项目结构,使用的引脚是PA7,PB9,PC15,同时如果灯不闪烁,程序没有正常运行,可以先试试仿真调试,仿真调试正常了一般在板子上运行就正常



4.4 硬件设备连接


step7:硬件连接

1、设备介绍

  • 面包板

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • STM32F103ZE与PC端连接


    PA9——RXD



    PA10——TXD


    在这里插入图片描述

    需将将boot0设为1,boot1设为0,利用跳线帽实现。

    在这里插入图片描述

    借助FLYMCU下载软件,即可将test3.hex载入。

FLYMCU配置需注意配置如下:

在这里插入图片描述



4.5 烧录展示


step8:build后烧录


在这里插入图片描述

在这里插入图片描述

在这里插入图片描述



五、总结

学习完用stm32f103ze芯片做流水灯实验,还运用了面包板。从开始的摸不着头脑,一个嵌入式小白,而通过老师和同学的帮助,完成了硬件的接入,最后顺利地完成流水灯实验,实现了灯的闪烁。



六、参考资料


STM32F103C8T6实现流水灯



【嵌入式08】STM32F103C8T6寄存器方式借助面包板点亮LED流水灯详解



32之寄存器点亮流水灯



版权声明:本文为m0_46275263原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。