没有合适的资源?快使用搜索试试~ 我知道了~
第六章 跑马灯实验STM32F4开发指南正点原子探索者STM32开发板.pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 100 浏览量
2023-06-06
21:10:22
上传
评论
收藏 1.7MB PDF 举报
温馨提示
试读
23页
第六章 跑马灯实验STM32F4开发指南正点原子探索者STM32开发板.pdf
资源推荐
资源详情
资源评论
STM32F4 开发指南(库函数版)
ALIENTEK 探索者 STM32F407 开发板教程
141
第六章 跑马灯实验
任何一个单片机,最简单的外设莫过于 IO 口的高低电平控制了,本章将通过一个经典的
跑马灯程序,带大家开启 STM32F4 之旅,通过本章的学习,你将了解到 STM32F4 的 IO 口作
为输出使用的方法。在本章中,我们将通过代码控制 ALIENTEK 探索者 STM32F4 开发板上的
两个 LED:DS0 和 DS1 交替闪烁,实现类似跑马灯的效果。 本章分为如下四个小节:
6.1, STM32F4 IO 口简介
6.2, 硬件设计
6.3, 软件设计
6.4, 下载验证
6.1 STM32F4 IO 简介
本章将要实现的是控制 ALIENTEK 探索者 STM32F4开发板上的两个 LED 实现一个类似跑
马灯的效果,该实验的关键在于如何控制 STM32F4 的 IO 口输出。了解了 STM32F4 的 IO 口如
何输出的,就可以实现跑马灯了。通过这一章的学习,你将初步掌握 STM32F4 基本 IO 口的使
用,而这是迈向 STM32F4 的第一步。
这一章节因为是第一个实验章节,所以我们在这一章将讲解一些知识为后面的实验做铺垫。
为了小节标号与后面实验章节一样,这里我们不另起一节来讲。
在讲解 STM32F4 的 GPIO 之前,首先打开我们光盘的第一个固件库版本实验工程跑马灯实
验工程(光盘目录为:“4,程序源码\标准例程-库函数版本\实验 1 跑马灯/USER/ LED.uvproj”),
可以看到我们的实验工程目录:
STM32F4 开发指南(库函数版)
ALIENTEK 探索者 STM32F407 开发板教程
142
图 6.1.1 跑马灯实验目录结构
接下来我们逐一讲解一下我们的工程目录下面的组以及重要文件。
① 组 FWLib 下面存放的是 ST 官方提供的固件库函数,每一个源文件 stm32f4xx_ppp.c 都对
应一个头文件 stm32f4xx_ppp.h。分组内的文件我们可以根据工程需要添加和删除,但是
一定要注意如果你引入了某个源文件,一定要在头文件 stm32f4xx_conf.h 文件中确保对
应的头文件也已经添加。比如我们跑马灯实验,我们只添加了 5 个源文件,那么对应的
头文件我们必须确保在 stm32f4xx_conf.h 内也包含进来,否则工程会报错。
② 组 CORE 下面存放的是固件库必须的核心文件和启动文件。这里面的文件用户不需要修
改。大家可以根据自己的芯片型号选择对应的启动文件。
③ 组 SYSTEM 是 ALIENTEK 提供的共用代码,这些代码的作用和讲解在第五章都有讲解,
大家可以翻过去看下。
④ 组 HARDWARE 下面存放的是每个实验的外设驱动代码,他的实现是通过调用 FWLib
下面的固件库文件实现的,比如 led.c 里面调用 stm32f4xx_gpio.c 内定义的函数对 led 进
行初始化,这里面的函数是讲解的重点。后面的实验中可以看到会引入多个源文件。
⑤ 组 USER 下面存放的主要是用户代码。但是 system_stm32f4xx.c 文件用户不需要修改,
同时 stm32f4xx_it.c 里面存放的是中断服务函数,这两个文件的作用在 3.1 节有讲解,大
家可以翻过去看看。Main.c 函数主要存放的是主函数了,这个大家应该很清楚。
工程分组情况我们就讲解到这里,接下来我们就要进入我们跑马灯实验的讲解部分了。这
里需要说明一下,我们在讲解固件库之前会首先对重要寄存器进行一个讲解,这样是为了大家
STM32F4 开发指南(库函数版)
ALIENTEK 探索者 STM32F407 开发板教程
143
对寄存器有个初步的了解。大家学习固件库,并不需要记住每个寄存器的作用,而只是通过了
解寄存器来对外设一些功能有个大致的了解,这样对以后的学习也很有帮助。
首先要提一下,在固件库中,GPIO 端口操作对应的库函数函数以及相关定义在文件
stm32f4xx_gpio.h 和 stm32f4xx_gpio.c 中。
相对于 STM32F1 来说,STM32F4 的 GPIO 设置显得更为复杂,也更加灵活,尤其是复用
功能部分,比 STM32F1 改进了很多,使用起来更加方便。
STM32F4 每组通用 I/O 端口包括 4 个 32 位配置寄存器(MODER、OTYPER、OSPEEDR
和 PUPDR)、 2 个 32 位数据寄存器(IDR 和 ODR)、 1 个 32 位置位/复位寄存器 (BSRR)、
1 个 32 位锁定寄存器 (LCKR) 和 2 个 32 位复用功能选择寄存器(AFRH 和 AFRL)等。
这样,STM32F4 每组 IO 有 10 个 32 位寄存器控制,其中常用的有 4 个配置寄存器+2 个数
据寄存器+2 个复用功能选择寄存器,共 8 个,如果在使用的时候,每次都直接操作寄存器配置
IO,代码会比较多,也不容易记住,所以我们在讲解寄存器的同时会讲解是用库函数配置 IO
的方法。
同 STM32F1 一样,STM32F4 的 IO 可以由软件配置成如下 8 种模式中的任何一种:
1、输入浮空
2、输入上拉
3、输入下拉
4、模拟输入
5、开漏输出
6、推挽输出
7、推挽式复用功能
8、开漏式复用功能
关于这些模式的介绍及应用场景,我们这里就不详细介绍了,感兴趣的朋友,可以看看这
个帖子了解下:http://www.openedv.com/posts/list/32730.htm 。接下来我们详细介绍 IO 配置常
用的 8 个寄存器: MODER、OTYPER、OSPEEDR、PUPDR、ODR、IDR 、AFRH 和 AFRL。
同时讲解对应的库函数配置方法。
首先看 MODER 寄存器,该寄存器是 GPIO 端口模式控制寄存器,用于控制 GPIOx
(STM32F4 最多有 9 组 IO,分别用大写字母表示,即 x=A/B/C/D/E/F/G/H/I,下同)的工作模
式,该寄存器各位描述如表 5.2.5.1 所示:
表 5.2.5.1 GPIOx MODER 寄存器各位描述
该寄存器各位在复位后,一般都是 0(个别不是 0,比如 JTAG 占用的几个 IO 口),也就是
默认条件下一般是输入状态的。每组 IO 下有 16 个 IO 口,该寄存器共 32 位,每 2 个位控制 1
STM32F4 开发指南(库函数版)
ALIENTEK 探索者 STM32F407 开发板教程
144
个 IO,不同设置所对应的模式见表 5.2.5.1 描述。
然后看 OTYPER 寄存器,该寄存器用于控制 GPIOx 的输出类型,该寄存器各位描述见表
5.2.5.2 所示:
表 5.2.5.2 GPIOx OTYPER 寄存器各位描述
该寄存器仅用于输出模式,在输入模式(MODER[1:0]=00/11 时)下不起作用。该寄存器
低 16 位有效,每一个位控制一个 IO 口,复位后,该寄存器值均为 0。
然后看 OSPEEDR 寄存器,该寄存器用于控制 GPIOx 的输出速度,该寄存器各位描述见表
5.2.5.3 所示:
表 5.2.5.3 GPIOx OSPEEDR 寄存器各位描述
该寄存器也仅用于输出模式,在输入模式(MODER[1:0]=00/11 时)下不起作用。该寄存
器每 2 个位控制一个 IO 口,复位后,该寄存器值一般为 0。
然后看 PUPDR 寄存器,该寄存器用于控制 GPIOx 的上拉/下拉,该寄存器各位描述见表
5.2.5.4 所示:
表 5.2.5.4 GPIOx PUPDR 寄存器各位描述
STM32F4 开发指南(库函数版)
ALIENTEK 探索者 STM32F407 开发板教程
145
该寄存器每 2 个位控制一个 IO 口,用于设置上下拉,这里提醒大家,STM32F1 是通过 ODR
寄存器控制上下拉的,而 STM32F4 则由单独的寄存器 PUPDR控制上下拉,使用起来更加灵活。
复位后,该寄存器值一般为 0。
前面,我们讲解了 4 个重要的配置寄存器。顾名思义,配置寄存器就是用来配置 GPIO 的
相关模式和状态,接下来我们讲解怎么在库函数初始化 GPIO 的配置。
GPIO 相关的函数和定义分布在固件库文件 stm32f4xx_gpio.c 和头文件 stm32f4xx_gpio.h 文
件中。
在固件库开发中,操作四个配置寄存器初始化 GPIO 是通过 GPIO 初始化函数完成:
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
这个函数有两个参数,第一个参数是用来指定需要初始化的 GPIO 对应的 GPIO 组,取值范围
为 GPIOA~GPIOK。第二个参数为初始化参数结构体指针,结构体类型为 GPIO_InitTypeDef。
下面我们看看这个结构体的定义。首先我们打开我们光盘的跑马灯实验,然后找到 FWLib 组下
面的 stm32f4xx_gpio.c 文件,定位到 GPIO_Init 函数体处,双击入口参数类型 GPIO_InitTypeDef
后右键选择“Go to definition of …”可以查看结构体的定义:
typedef struct
{
uint32_t GPIO_Pin;
GPIOMode_TypeDef GPIO_Mode;
GPIOSpeed_TypeDef GPIO_Speed;
GPIOOType_TypeDef GPIO_OType;
GPIOPuPd_TypeDef GPIO_PuPd;
}GPIO_InitTypeDef;
下面我们通过一个 GPIO 初始化实例来讲解这个结构体的成员变量的含义。
通过初始化结构体初始化 GPIO 的常用格式是:
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9//GPIOF9
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化 GPIO
上面代码的意思是设置 GPIOF 的第 9 个端口为推挽输出模式,同时速度为 100M,上拉。
从上面初始化代码可以看出,结构体 GPIO_InitStructure 的第一个成员变量 GPIO_Pin 用来
设置是要初始化哪个或者哪些 IO 口,这个很好理解;第二个成员变量 GPIO_Mode 是用来设置
对应 IO 端口的输出输入端口模式,这个值实际就是配置我们前面讲解的 GPIOx 的 MODER 寄
存器的值。在 MDK 中是通过一个枚举类型定义的,我们只需要选择对应的值即可:
typedef enum
{
GPIO_Mode_IN = 0x00, /*!< GPIO Input Mode */
GPIO_Mode_OUT = 0x01, /*!< GPIO Output Mode */
GPIO_Mode_AF = 0x02, /*!< GPIO Alternate function Mode */
GPIO_Mode_AN = 0x03 /*!< GPIO Analog Mode */
}GPIOMode_TypeDef;
剩余22页未读,继续阅读
资源评论
oligaga
- 粉丝: 52
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功