第六章 GPIO 跑马灯实验正点原子探索者STM32F4开发板STM32F4开发指南

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
表 5.2.5.3 GPIOx OSPEEDR 寄存器各位描述 该寄存器也仅用于输出模式,在输入模式(MODER[1:0]=00/11 时)下不起作用。该寄存 器每 2 个位控制一个 IO 口,复位后,该寄存器值一般为 0。 然后看 PUPDR 寄存器,该寄存器用于控制 GPIOx 的上拉/下拉,该寄存器各位描述见表 5.2.5.4 所示:
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;
表 5.2.5.1 GPIOx MODER 寄存器各位描述 该寄存器各位在复位后,一般都是 0(个别不是 0,比如 JTAG 占用的几个 IO 口),也就是 默认条件下一般是输入状态的。每组 IO 下有 16 个 IO 口,该寄存器共 32 位,每 2 个位控制 1
143
STM32F4 开发指南(库函数版)
ALIEBiblioteka BaiduTEK 探索者 STM32F407 开发板教程
个 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 所示:
145
STM32F4 开发指南(库函数版)
ALIENTEK 探索者 STM32F407 开发板教程
GPIO_Mode_IN 是 用 来 设 置 为 复 位 状 态 的 输 入 , GPIO_Mode_OUT 是 通 用 输 出 模 式 , GPIO_Mode_AF 是复用功能模式,GPIO_Mode_AN 是模拟输入模式。
142
STM32F4 开发指南(库函数版)
ALIENTEK 探索者 STM32F407 开发板教程
对寄存器有个初步的了解。大家学习固件库,并不需要记住每个寄存器的作用,而只是通过了 解寄存器来对外设一些功能有个大致的了解,这样对以后的学习也很有帮助。
首先要提一下,在固件库中,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)等。
表 5.2.5.4 GPIOx PUPDR 寄存器各位描述
144
STM32F4 开发指南(库函数版)
ALIENTEK 探索者 STM32F407 开发板教程
该寄存器每 2 个位控制一个 IO 口,用于设置上下拉,这里提醒大家,STM32F1 是通过 ODR 寄存器控制上下拉的,而 STM32F4 则由单独的寄存器 PUPDR 控制上下拉,使用起来更加灵活。 复位后,该寄存器值一般为 0。
应一个头文件 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 函数主要存放的是主函数了,这个大家应该很清楚。 工程分组情况我们就讲解到这里,接下来我们就要进入我们跑马灯实验的讲解部分了。这 里需要说明一下,我们在讲解固件库之前会首先对重要寄存器进行一个讲解,这样是为了大家
141
STM32F4 开发指南(库函数版)
ALIENTEK 探索者 STM32F407 开发板教程
图 6.1.1 跑马灯实验目录结构 接下来我们逐一讲解一下我们的工程目录下面的组以及重要文件。 ① 组 FWLib 下面存放的是 ST 官方提供的固件库函数,每一个源文件 stm32f4xx_ppp.c 都对
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 每组 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 所示:
STM32F4 开发指南(库函数版)
ALIENTEK 探索者 STM32F407 开发板教程
第六章 跑马灯实验
任何一个单片机,最简单的外设莫过于 IO 口的高低电平控制了,本章将通过一个经典的 跑马灯程序,带大家开启 STM32F4 之旅,通过本章的学习,你将了解到 STM32F4 的 IO 口作 为输出使用的方法。在本章中,我们将通过代码控制 ALIENTEK 探索者 STM32F4 开发板上的 两个 LED:DS0 和 DS1 交替闪烁,实现类似跑马灯的效果。 本章分为如下四个小节:
前面,我们讲解了 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 {
相关文档
最新文档