《STM32开发指南》第六章 跑马灯实验

  • 格式:pdf
  • 大小:870.35 KB
  • 文档页数:10

下载文档原格式

  / 10
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第六章跑马灯实验

STM32最简单的外设莫过于IO口的高低电平控制了,本章将通过一个经典的跑马灯程序,带大家开启STM32之旅,通过本章的学习,你将了解到STM32的IO口作为输出使用的方法。在本章中,我们将通过代码控制ALIENTEK战舰STM32开发板上的两个LED:DS0和DS1交替闪烁,实现类似跑马灯的效果。本章分为如下四个小节:

6.1,STM32 IO口简介

6.2,硬件设计

6.3,软件设计

6.4,仿真与下载

6.1 STM32 IO简介

本章将要实现的是控制ALIENTEK战舰STM32开发板上的两个LED实现一个类似跑马灯的效果,该实验的关键在于如何控制STM32的IO口输出。了解了STM32的IO口如何输出的,就可以实现跑马灯了。通过这一章的学习,你将初步掌握STM32基本IO口的使用,而这是迈向STM32的第一步。

STM32的IO口可以由软件配置成如下8种模式:

1、输入浮空

2、输入上拉

3、输入下拉

4、模拟输入

5、开漏输出

6、推挽输出

7、推挽式复用功能

8、开漏复用功能

每个IO口可以自由编程,但IO口寄存器必须要按32位字被访问。STM32的很多IO口都是5V兼容的,这些IO口在与5V电平的外设连接的时候很有优势,具体哪些IO口是5V兼容的,可以从该芯片的数据手册管脚描述章节查到(I/O Level标FT的就是5V电平兼容的)。

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口位配置表如表6.1.1所示:

表6.1.1 STM32的IO口位配置表

STM32输出模式配置如表6.1.2所示:

表6.1.2 STM32输出模式配置表

接下来我们看看端口低配置寄存器CRL的描述,如图6.1.1所示:

图6.1.1 端口低配置寄存器CRL各位描述

该寄存器的复位值为0X4444 4444,从图6.1.1可以看到,复位值其实就是配置端口为浮空输入模式。从上图还可以得出: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就不做详细介绍了。

给个实例,比如我们要设置PORTC的11位为上拉输入,12位为推挽输出。代码如下:GPIOC->CRH&=0XFFF00FFF;//清掉这2个位原来的设置,同时也不影响其他位的设置GPIOC->CRH|=0X00038000; //PC11输入,PC12输出

GPIOC->ODR=1<<11; //PC11上拉

通过这3句话的配置,我们就设置了PC11为上拉输入,PC12为推挽输出。

IDR是一个端口输入数据寄存器,只用了低16位。该寄存器为只读寄存器,并且只能以16位的形式读出。该寄存器各位的描述如图6.1.2所示:

图6.1.2 端口输入数据寄存器IDR各位描述

要想知道某个IO口的状态,你只要读这个寄存器,再看某个位的状态就可以了。使用起来是比较简单的。

ODR是一个端口输出数据寄存器,也只用了低16位。该寄存器为可读写,从该寄存器读出来的数据可以用于判断当前IO口的输出状态。而向该寄存器写数据,则可以控制某个IO口的输出电平。该寄存器的各位描述如图6.1.3所示:

图6.1.3 端口输出数据寄存器ODR各位描述

了解了这几个寄存器,我们就可以开始跑马灯实验的真正设计了。关于IO口更详细的介绍,请参考《STM32参考手册》第105页8.1节。

在此,我们可以总结一下,对于学过A VR的人来说,我们都知道A VR的IO口由3个寄存器控制:DDR、PORT、PIN。这里我们可以拿STM32的IO控制寄存器和A VR的来个类比:

1、STM32的CRL和CRH就相当于AVR的DDR寄存器,用来控制IO口的方向,只

不过STM32的CRL和CRH功能更强大一点罢了。

2、STM32的ODR就相当于A VR的PORT,都是用来控制IO口的输出电平或者上下

拉电阻的。

3、STM32的IDR就相当于A VR的PIN,都是用来存储IO口当前的输入状态(高低

电平)的。

除此之外,STM32还有BSRR、BRR、LCKR等几个寄存器用于控制IO口,这点是A VR 所没有的。

6.2 硬件设计

本章用到的硬件只有LED(DS0和DS1)。其电路在ALIENTEK战舰STM32开发板上默认是已经连接好了的。DS0接PB5,DS1接PE5。所以在硬件上不需要动任何东西。其连接原

理图如图6.2.1下:

图6.2.1 LED与STM32连接原理图

6.3 软件设计

首先,找到之前3.2节新建的TEST工程,在该文件夹下面新建一个HARDWARE的文件夹,用来存储以后与硬件相关的代码。然后在HARDW ARE文件夹下新建一个LED文件夹,用来存放与LED相关的代码。如图6.3.1所示:

图6.3.1 新建HARDW ARE文件夹

然后我们打开USER文件夹下的TEST.Uv2工程,按按钮新建一个文件,然后保存在

HARDW ARE->LED文件夹下面,保存为led.c。在该文件中输入如下代码:#include "led.h"

//初始化PB5和PE5为输出口.并使能这两个口的时钟

//LED IO初始化

void LED_Init(void)

{