影视网站策划书,wordpress 首页标题,百度搜索提交入口,如何设计公司网站第2章 STM32-GPIO口
2.1 GPIO口概述
通用输入/输出口
2.1.1 GPIO口作用
GPIO是单片机与外界进行数据交流的窗口。
2.1.2 STM32的GPIO口
在51单片机中#xff0c;IO口#xff0c;以数字进行分组#xff08;P0~P3#xff09;#xff0c;每一组里面又有8个IO口。
在ST…第2章 STM32-GPIO口
2.1 GPIO口概述
通用输入/输出口
2.1.1 GPIO口作用
GPIO是单片机与外界进行数据交流的窗口。
2.1.2 STM32的GPIO口
在51单片机中IO口以数字进行分组P0~P3每一组里面又有8个IO口。
在STM32里面GPIO口以英文字母进行分组针对M4系列最多可以分为AI组而在我们现在使用的stm32f407zgt6这款芯片一共分成AG组。每一组里面有16个IO口以0~15进行编号所以我们这款芯片一共有112个GPIO口。
并不是所以的管脚都是GPIO口
每一个GPIO口都是多功能的在使用之前需要先配置好特定的一个功能需要用什么功能就要配置成什么功能。
对GPIO的配置就是学习如何使用GPIO口。
对GPIO口操作其实就是操作GPIO对应的寄存器。
寄存器其实就是一段内存空间。芯片内部有很多模块系统会给每一个模块都分配一段特定的内存空间这些内存空间的地址其实就是这些模块的寄存器地址。每个寄存器都有自己特定的一些功能我们往寄存器里面读写的数据也都是有一定意义的不是随意的。如果我们想要操作一个模块做某些事情就需要找到这个模块对应有这个功能的寄存器往这个寄存器里面写入特定的指令数据系统就会根据你的操作对这个模块进行控制。 补充
变量声明变量其实就是在内存中申请了一段内存空间我们可以在这个内存空间进行读写操作。这个内存空间的地址是随机。
寄存器寄存器其实也是一段内存空间同样可以往里面进行读写操作但是寄存器的地址是固定的是已知的是芯片厂家出厂时就已经固化了不可更改的。 从上图可以知道GPIO模块寄存器边界地址和所在的总线AHB1 相邻两组GPIO之间的偏移量是0x0400换句话说每组GPIO的空间大小为1024字节。 总结
相邻GPIO组之间的偏移量为1K字节每一组GPIO相邻寄存器之间的偏移量为0x04.
2.1.3 STM32的GPIO口特征
每个通用 I/O 端口包括 4 个 32 位配置寄存器GPIOx_MODER、 GPIOx_OTYPER、GPIOx_OSPEEDR 和 GPIOx_PUPDR、 2 个 32 位数据寄存器GPIOx_IDR 和GPIOx_ODR、 1 个 32 位置位/复位寄存器 (GPIOx_BSRR)、 1 个 32 位锁定寄存器(GPIOx_LCKR) 和 2 个 32 位复用功能选择寄存器GPIOx_AFRH 和 GPIOx_AFRL。
● 受控 I/O 多达 16 个 ● 输出状态推挽或开漏 上拉/下拉 ● 从输出数据寄存器 (GPIOx_ODR) 或外设复用功能输出输出数据 ● 可为每个 I/O 选择不同的速度 ● 输入状态浮空、上拉/下拉、模拟 ● 将数据输入到输入数据寄存器 (GPIOx_IDR) 或外设复用功能输入 ● 置位和复位寄存器 (GPIOx_BSRR)对 GPIOx_ODR 具有按位写权限 ● 锁定机制 (GPIOx_LCKR)可冻结 I/O 配置 ● 模拟功能 ● 复用功能输入/输出选择寄存器一个 I/O 最多可具有 16 个复用功能 ● 快速翻转每次翻转最快只需要两个时钟周期 ● 引脚复用非常灵活允许将 I/O 引脚用作 GPIO 或多种外设功能中的一种
2.1.4 STM32的GPIO功能
根据数据手册中列出的每个 I/O 端口的特性可通过软件将通用 I/O (GPIO) 端口的各个端口 位分别配置为多种模式 ● 输入浮空 ● 输入上拉 ● 输入下拉 ● 模拟功能----用在模数转换/数模转换上 ● 具有上拉或下拉功能的开漏输出 ● 具有上拉或下拉功能的推挽输出 ● 具有上拉或下拉功能的复用功能推挽 ● 具有上拉或下拉功能的复用功能开漏 每个 I/O 端口位均可自由编程但 I/O 端口寄存器必须按 32 位字、半字或字节进行访问。 GPIOx_BSRR 寄存器旨在实现对 GPIO ODR 寄存器进行原子读取/修改访问。这样便可确保 在读取和修改访问之间发生中断请求也不会有问题。
2.2 STM32的GPIO口框架重点 输入电路和输出电路是独立的。
2.2.1 输出配置框架分析
对 I/O 端口进行编程作为输出时 ● 输出缓冲器被打开 — 开漏模式输出寄存器中的“0”可激活 N-MOS而输出寄存器中的“1”会使端 口保持高组态 (Hi-Z)P-MOS 始终不激活。 — 推挽模式输出寄存器中的“0”可激活 N-MOS而输出寄存器中的“1”可激活 P-MOS。 ● 施密特触发器输入被打开 ● 根据 GPIOx_PUPDR 寄存器中的值决定是否打开弱上拉电阻和下拉电阻 ● 输入数据寄存器每隔 1 个 AHB1 时钟周期对 I/O 引脚上的数据进行一次采样 ● 对输入数据寄存器的读访问可获取 I/O 状态 ● 对输出数据寄存器的读访问可获取最后的写入值 在配置成输出模式时输入功能并没有被关闭。
推挽输出当配置成推挽模式时P-MOS和N-MOS均可以工作都被打开
当要输出高电平‘1’时P-MOS导通N-MOS不导通VDD电源正极高电平连接到IO引脚
当要输出低电平‘0’时P-MOS不导通N-MOS导通VSS电源负极低电平连接到IO引脚
推挽输出即可以输出高电平也可以输出低电平
开漏输出当配置成开漏模式时P-MOS被关闭高阻态N-MOS被打开
当要输出高电平‘1’时P-MOS不导通N-MOS不导通不能把高电平从输出驱动器输出出去IO引脚的电平值取决外界环境。
当要输出低电平‘0’时P-MOS不导通N-MOS导通VSS电源负极低电平连接到IO引脚
开漏输出只具有输出低电平的能力不具有输出高电平的能力。
如果仍然想输出高电平‘1’那么需要在外部电路中接一个上拉电阻
上拉电阻电阻的一端接着电源正极在IO口没有电流流过时保证电阻另外一端有一个稳定高电平
下拉电阻电阻的一端接着电源负极GND在IO口没有电流流过时保证电阻另外一端有一个稳定低电平
芯片内部上拉电阻和下拉电阻都是弱上拉和弱下拉驱动能力比较弱
2.2.2 输入配置框架分析
对 I/O 端口进行编程作为输入时 ● 输出缓冲器被关闭 ● 施密特触发器输入被打开 ● 根据 GPIOx_PUPDR 寄存器中的值决定是否打开上拉和下拉电阻 ● 输入数据寄存器每隔 1 个 AHB1 时钟周期对 I/O 引脚上的数据进行一次采样 ● 对输入数据寄存器的读访问可获取 I/O 状态 变换一下如下图 这种情况下配置成输入浮空不上拉也不下拉 这种情况下可以配置成输入上拉 这种情况下可以配置成输入下拉
2.2.3 模拟功能框架分析
对 I/O 端口进行编程作为模拟配置时 ● 输出缓冲器被禁止。 ● 施密特触发器输入停用 I/O 引脚的每个模拟输入的功耗变为零。施密特触发器的输出被 强制处理为恒定值 (0)。 ● 弱上拉和下拉电阻被关闭。 ● 对输入数据寄存器的读访问值为“0”。 2.2.4 复用功能框架分析
对 I/O 端口进行编程作为复用功能时 ● 可将输出缓冲器配置为开漏或推挽 ● 输出缓冲器由来自外设的信号驱动发送器使能和数据 ● 施密特触发器输入被打开 ● 根据 GPIOx_PUPDR 寄存器中的值决定是否打开弱上拉电阻和下拉电阻 ● 输入数据寄存器每隔 1 个 AHB1 时钟周期对 I/O 引脚上的数据进行一次采样 ● 对输入数据寄存器的读访问可获取 I/O 状态 2.3 STM32的GPIO口相关寄存器 2.3.1 GPIO 端口模式寄存器 (GPIOx_MODER) (x A…I)
偏移地址 0x00 复位值默认值 ● 0xA800 0000端口 A ● 0x0000 0280端口 B ● 0x0000 0000其它端口 位 2y:2y1 MODERy[1:0] 端口 x 配置位 (Port x configuration bits) (y 0…15) 这些位通过软件写入用于配置 I/O 方向模式。 00输入复位状态 01通用输出模式 10复用功能模式 11模拟模式
2.3.2 GPIO 端口输出类型寄存器 (GPIOx_OTYPER) (x A…I)
偏移地址 0x04 复位值 0x0000 0000 位 31:16 保留必须保持复位值。 位 15:0 OTy[1:0] 端口 x 配置位 (Port x configuration bits) (y 0…15) 这些位通过软件写入用于配置 I/O 端口的输出类型。 0输出推挽复位状态 1输出开漏
2.3.3 GPIO 端口输出速度寄存器 (GPIOx_OSPEEDR) (x A…I/)
偏移地址 0x08 复位值 ● 0x0000 00C0端口 B ● 0x0000 0000其它端口 位 2y:2y1 OSPEEDRy[1:0] 端口 x 配置位 (Port x configuration bits) (y 0…15) 这些位通过软件写入用于配置 I/O 输出速度。 00 2 MHz低速 01 25 MHz中速 10 50 MHz快速 11 30 pF 时为 100 MHz高速15 pF 时为 80 MHz 输出最大速度
2.3.4 GPIO 端口上拉/下拉寄存器 (GPIOx_PUPDR) (x A…I/)
偏移地址 0x0C 复位值 ● 0x6400 0000端口 A ● 0x0000 0100端口 B ● 0x0000 0000其它端口 位 2y:2y1 PUPDRy[1:0] 端口 x 配置位 (Port x configuration bits) (y 0…15) 这些位通过软件写入用于配置 I/O 上拉或下拉。 00无上拉或下拉浮空 01上拉 10下拉 11保留
2.3.5 GPIO 端口输入数据寄存器 (GPIOx_IDR) (x A…I)
偏移地址 0x10 复位值 0x0000 XXXX其中 X 表示未定义 位 31:16 保留必须保持复位值。 位 15:0 IDRy[15:0] 端口输入数据 (Port input data) (y 0…15) 这些位为只读形式只能在字模式下访问。它们包含相应 I/O 端口的输入值。
2.3.6 GPIO 端口输出数据寄存器 (GPIOx_ODR) (x A…I)
偏移地址 0x14 复位值 0x0000 0000 位 31:16 保留必须保持复位值。 位 15:0 ODRy[15:0] 端口输出数据 (Port output data) (y 0…15) 这些位可通过软件读取和写入。 注意 对于原子置位/复位通过写入 GPIOx_BSRR 寄存器可分别对 ODR 位进行置位和复 位 (x A…I/)。
2.4 寄存器访问方法
操作GPIOA_MODE,写入data值
第一种
*(unsigned int *)0x4002 0000data;
第二种
#define GPIOA_MODE *(unsigned int *)0x4002 0000
GPIOA_MODEdata;
第三种
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE)#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE)#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE)#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE)#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE)#define GPIOG ((GPIO_TypeDef *) GPIOG_BASE)#define GPIOH ((GPIO_TypeDef *) GPIOH_BASE)#define GPIOI ((GPIO_TypeDef ) GPIOI_BASE) typedef struct{ __IO uint32_t MODER; /! GPIO port mode register, Address offset: 0x00 / __IO uint32_t OTYPER; /! GPIO port output type register, Address offset: 0x04 / __IO uint32_t OSPEEDR; /! GPIO port output speed register, Address offset: 0x08 / __IO uint32_t PUPDR; /! GPIO port pull-up/pull-down register, Address offset: 0x0C / __IO uint32_t IDR; /! GPIO port input data register, Address offset: 0x10 / __IO uint32_t ODR; /! GPIO port output data register, Address offset: 0x14 / __IO uint16_t BSRRL; /! GPIO port bit set/reset low register, Address offset: 0x18 / __IO uint16_t BSRRH; /! GPIO port bit set/reset high register, Address offset: 0x1A / __IO uint32_t LCKR; /! GPIO port configuration lock register, Address offset: 0x1C / __IO uint32_t AFR[2]; /! GPIO alternate function registers, Address offset: 0x20-0x24 /} GPIO_TypeDef; 说明GPIO_TypeDef 结构体 GPIO_TypeDef结构体指针 #define GPIOA_BASE (AHB1PERIPH_BASE 0x0000)#define GPIOB_BASE (AHB1PERIPH_BASE 0x0400)#define GPIOC_BASE (AHB1PERIPH_BASE 0x0800)#define GPIOD_BASE (AHB1PERIPH_BASE 0x0C00)#define GPIOE_BASE (AHB1PERIPH_BASE 0x1000)#define GPIOF_BASE (AHB1PERIPH_BASE 0x1400)#define GPIOG_BASE (AHB1PERIPH_BASE 0x1800)#define GPIOH_BASE (AHB1PERIPH_BASE 0x1C00)#define GPIOI_BASE (AHB1PERIPH_BASE 0x2000)//---------------------------------------------------------------------------------------#define AHB1PERIPH_BASE (PERIPH_BASE 0x00020000)//---------------------------------------------------------------------------------------#define PERIPH_BASE ((uint32_t)0x40000000) 分析#define GPIOA_BASE (AHB1PERIPH_BASE 0x0000) ((PERIPH_BASE 0x00020000)0x0000) ((((uint32_t)0x40000000) 0x00020000)0x0000) ((uint32_t)0x40020000) #define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)#define GPIOA ((GPIO_TypeDef *) (uint32_t)0x40020000)GPIOA—结构体常量指针 操作寄存器方法GPIOA-MODEdata;
2.5 STM32的GPIO口相关实验
2.5.1 通用输出功能实验
通过GPIO口点亮LED灯
LED其实是发光二极管当给阳极高电平给阴极低电平会让二极管正向导通LED点亮
2.5.1.1 硬件设计 2.5.1.2 软件设计
点亮LED1把PF6配置成普通功能推挽输出
配置流程
\1. 配置模式寄存器把GPIOF的MODER寄存器的第13和12位分配成01—输出模式
\2. 配置输出类型寄存器把GPIOF的OTYPER寄存器的第6位分配成0—输出推挽
\3. 配置输出速度寄存器把GPIOF的OSPEEDR寄存器的第13和12位分配成00–低速2Mhz
\4. 配置上/下拉寄存器把GPIOF的PUPDR寄存器的第13和12位分配成00–浮空
点亮LED1----往GPIOF的ODR寄存器的第6位写入0
熄灭LED1----往GPIOF的ODR寄存器的第6位写入1
操作寄存器的原则操作你要操作的相关位而不能影响到其他位的值。
2 软件设计
点亮LED1把PF6配置成普通功能推挽输出
配置流程
\1. 配置模式寄存器把GPIOF的MODER寄存器的第13和12位分配成01—输出模式
\2. 配置输出类型寄存器把GPIOF的OTYPER寄存器的第6位分配成0—输出推挽
\3. 配置输出速度寄存器把GPIOF的OSPEEDR寄存器的第13和12位分配成00–低速2Mhz
\4. 配置上/下拉寄存器把GPIOF的PUPDR寄存器的第13和12位分配成00–浮空
点亮LED1----往GPIOF的ODR寄存器的第6位写入0
熄灭LED1----往GPIOF的ODR寄存器的第6位写入1
操作寄存器的原则操作你要操作的相关位而不能影响到其他位的值。