目录
本篇博客将介绍如何使用STM32F103系列芯片以寄存器的方式点亮LED流水灯,文章内容包括芯片IO口和寄存器的使用、硬件设计、软件设计、仿真与下载。希望本篇文章能够帮助你。
一、stm32芯片寄存器及IO口简介
注:本博客使用的芯片为正点原子STM32F103RC芯片,不同的32芯片在细节上也许会有不同之处。
本博客将要实现的是控制STM32开发板上的三个IO口实现一个类似流水灯的效果,该实验的关键在于如何控制STM32的IO口输出。了解了STM32的IO口如何输出的,就可以实现流水灯了。
STM32 的 IO 口可以由软件配置成如下 8 种模式:
1、输入浮空
2、输入上拉
3、输入下拉
4、模拟输入
5、开漏输出
6、推挽输出
7、推挽式复用功能
8、开漏复用功能
STM32的每个IO端口都有7个寄存器来控制。他们分别是:配置模式的2个32位的端口配置寄存器CRL和CRH;2个32位的数据寄存器 IDR 和 ODR;1个32位的置位/复位寄存器BSRR;一个16位的复位寄存器BRR;1个32位的锁存寄存器LCKR;这里我们仅介绍常用的几个寄存器,我们常用的IO端口寄存器只有4个:CRL、CRH、IDR、ODR。
其中CRL和CRH控制着每个IO口的模式及输出速率。
STM32 的 IO 口位配置表如表
STM32 输出模式配置如表
接下来我们看看端口低配置寄存器 CRL 的描述
该寄存器的复位值为0X4444 4444,从上图可以看到,复位值其实就是配置端口为浮空输入模式。从上图还可以得出:STM32 的CRL控制着每组IO端口(A~G)的低8位的模式。 每个IO端口的位占用CRL的 4 个位,高两位为CNF,低两位为MODE。这里我们可以记住几个常用的配置,比如0X0表示模拟输入模式(ADC 用)、0X3表示推挽输出模式(做输出口用,50M速率)、0X8表示上/下拉输入模式(做输入口用)、0XB表示复用输出(使用IO口的第二功能,50M速率)。
CRH的作用和CRL完全一样,只是CRL控制的是低8位输出口,而CRH控制的是高8位输出口。这里我们对CRH就不做详细介绍了。
给个实例,比如我们要设置PORTA的8位为上拉输入,13位为复用输出。代码如下:
GPIOA->CRH&=0XFF0FFFF0; //清掉这 2 个位原来的设置,同时也不影响其他位的设置
GPIOA->CRH|=0X00B00008; //PA8输入,PA13输出
GPIOA->ODR=1<<8; //PA8 上拉
通过这3句话的配置,我们就设置了PA8为上拉输入,PA13复用输出。
IDR是一个端口输入数据寄存器,只用了低16位。该寄存器为只读寄存器,并且只能以16位的形式读出。该寄存器各位的描述如图所示:
要想知道某个IO口的状态,你只要读这个寄存器,再看某个位的状态就可以了。使用起来是比较简单的。
ODR是一个端口输出数据寄存器,也只用了低16位。该寄存器为可读写,从该寄存器读出来的数据可以用于判断当前IO口的输出状态。而向该寄存器写数据,则可以控制某个IO口的输出电平。该寄存器的各位描述如图所示:
了解了这几个寄存器&#x