目录
一、什么是寄存器
简单地说,寄存器就是存放东西的存贮部件,它们主要暂存指令、数据和地址。官方说法是寄存器是
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之寄存器点亮流水灯