M4——GPIO配置
1.GPIO 简述:
通用输入输出(General Purpose Input Output)的简称,就是芯片引脚可以通过他们输出高电平或者低电平,也可以通过他们读取引脚的电平状态。
以STM32F407ZGT6芯片为例(后面都是以这种芯片为例),这种芯片共有112个I/O口,共7组,每组16个引脚(0~15),可以通过配置寄存器来确定某个引脚用于输入、输出还是其他特殊功能。想要什么功能,使用之前先配置,其中默认为输入浮空模式。
在一个芯片内部,CPU通过地址来设别片内外设。分配给每个硬件外设的地址就是外设的寄存器地址。CPU通过寄存器操作片内外设。GPIO口对应的地址如下图:
寄存器:是一个存储器,它存储了控制硬件怎么运行、硬件运行的状态。
变量:当我们定义一个变量的时候,编译器会帮我们在RAM中申请一个存储空间。
变量和寄存器的不同点:变量的意义由程序员决定,而寄存器每一位代表的意义由设计芯片的人决定。
每个通用 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)。
2.GPIO主要特性
(1)每组GPIO口都有16个端口,端口编号为0~15。
(2)在输出状态下可设置成推挽输出或开漏输出,以及根据需要决定是否开启上拉/下拉功能。
(3)每个GPIO端口都可以设置成通用模式和复用模式。
(4)每个GPIO端口可以配置不同的输出速度。
(5)在输入状态下,可设置为浮空输入、上拉/下拉输入以及模拟输入。
(6)可以利用置位和复位寄存器(GPIOx_BSRR)对输出数据寄存器(GPIOx_ODR)进行按位写操作。
(7)可以利用端口配置寄存器(GPIOx_LCKR)对GPIO端口进行冻结配置。
(8)通过复用功能输入/输出选择寄存器可以设置GPIO端口的复用功能。
3.GPIO每个端口都可以由软件配置成如下几种模式:
- 输入浮空:在浮空输入状态下,GPIO的电平状态是不确定的,完全由外部输入确定。如果在悬空状态下读取GPIO口,得到将是一个不确定的电平值。一般用于处理信号方面。
- 输入上拉:在没有外界输入的情况下,能够让GPIO口在没有连接信号的时候有一个确定的高电平信号。一般用于对输入的电平信号进行检测。
- 输入下拉:在没有外界输入的情况下,能够让GPIO口在没有连接信号的时候有一个确定的低电平信号。一般用于对输入的电平信号进行检测。
- 模拟功能:芯片内部ADC或DAC的专用功能。
- 具有上拉或下拉功能的开漏输出:开漏输出也叫断开输出。可以正常的输出低电平(0),但是没有输出高电平(1)的能力。如果需要输出1,则需要配置成上拉功能的开漏输出。注意:芯片内部的上拉属于弱上拉,驱动能力很小,如果要获得较强的驱动能力,需要在芯片外部外接上拉电阻。
- 具有上拉或下拉功能的推挽输出:推挽输出即可以输出高电平(1),也可以输出低电平(0)。
- 具有上拉或下拉功能的复用功能推挽:当GPIO口做为第二功能时配置层推挽输出模式。复用功能是指GPIO端口的第二功能,也就是片内外设模块的管脚专用功能。
- 具有上拉或下拉功能的复用功能开漏:当GPIO口做为第二功能时配置层开漏输出模式。
4. 5 V 容忍 I/O 端口位的基本结构
需要配置什么功能,要结合实际外部电路图来分析
5.GPIO端口位配置表(查数据手册所得)
6.GPIO输入配置
对IO端口配置为输入时,TTL施密特触发器被打开,输出缓冲器被关闭(也就是输出电路管脚断开),根据GPIOx_PUPD寄存器(并结合实际电路)决定是否打开上/下拉(需要有明确的电平),对输入数据寄存器只有读操作。
7.输出配置
配置IO口为普通功能输出时,输出缓冲器被打开(注意:开漏模式时,输出寄存器中的‘0’可激活N-MOS,‘1’会使端口保持高阻态,基本没作用,P-MOS始终不激活;推挽模式时,输出寄存器的‘0’激活N-MOS,‘1’激活P-MOS),施密特触发器也会被打开,用于监控管脚的实际电平状态,根据实际情况决定是否需要上下拉,输入寄存器仍然可读。
8.复用功能配置
IO配置为复用功能时,可将输出缓冲器配置为开漏或者推挽,输出缓冲器来自外设的信号驱动,施密特触发器也被打开(但是输入输出是独立存在的),可根据实际情况配置上下拉,可对输入数据寄存器读取IO状态。
9.模拟功能
输出缓冲器被禁止,施密特触发器输入停用, I/O 引脚的每个模拟输入的功耗变为零。施密特触发器的输出被强制处理为恒定值 (0)。弱上拉和下拉电阻被关闭。对输入数据寄存器的读访问值为“ 0”。
10.配置示范
如果GPIO要配置成推挽式输出功能,速度为50M,则对应的位配置为:
MODER[1:0] |
OTYPER |
OSPEEDR[B:A] |
PUPDR[1:0] |
01 |
0 |
10 |
00 |
如果GPIO要配置成输入功能,则对应的位配置为:
MODER[1:0] |
OTYPER |
OSPEEDR[B:A] |
PUPDR[1:0] |
00 |
/ |
/ |
01/10 |
如果GPIO要配置成复用功能,则对应的位配置为:
MODER[1:0] |
OTYPER |
OSPEEDR[B:A] |
PUPDR[1:0] |
10 |
/ |
/ |
/ |
11.需要配置相关寄存器
(1) RCC AHB1外设时钟使能寄存器(RCC_AHB1ENR):配置IO功能模式时,先使能对应时钟,相关GPIO位置1使能
如果使能GPIOB组时钟,则寄存器配置为:
RCC->AHB1ENR |= 1x01 << 1; //使能GPIOB组时钟
(2)GPIO 端口模式寄存器 :配置IO工作模式(2位控制一个IO管脚):先对操作的位清零,再置相关的值
例如把GPIOB的端口8配置成复用模式,则寄存器配置为:
GPIOB->MODER &= ~(3 << 16); //把MODER寄存器的16,17位清零
GPIOB->MODER |= 2 << 16; //把端口8设置成复用模式
(3)GPIO 端口输出类型寄存器 (GPIOx_OTYPER) :0:推挽输出、1:开漏输出
例如把GPIOA的端口8输出方式位开漏输出,则寄存器配置为:
GPIOA->OTYPER |= 1x01 << 8;
(4)GPIO 端口输出速度寄存器 (GPIOx_OSPEEDR)
(5)GPIO 端口上拉/下拉寄存器 (GPIOx_PUPDR)
(6)GPIO 端口输入数据寄存器 (GPIOx_IDR):对其只有读操作
用于读取对应的GPIO口输入的高低电平。一个位对应于一组 IO 中的一个引脚。读取结果是 1,表示该 IO 引脚是高电平,结果是 0,则表示对应 IO 引脚是低电平。
(7)GPIO 端口输出数据寄存器 (GPIOx_ODR)(x = A~G)
(8)GPIO 端口置位/复位寄存器 (GPIOx_BSRR)(x = A~G):
注意:当一个端口同时设置了置1位和清零位,那么置1位有效,对相关为写1以后,相应的功能实现后,自动清除。
输出寄存器(GPIOx->ODR)和置位/复位寄存器 (GPIOx_BSRR)区别:
例:在GPIOB的端口7输出高电平
1) 使用ORD寄存器
GPIOB->ODR |= 1 << 7;
程序执行步骤:
① 读取ODR寄存器的值
② 把读出来的值和1 <<7进行按位或运算
③ 把计算后的值再写入ODR寄存器
2) 使用BSRR寄存器
GPIOB->BSRRL = 1 << 11;
程序执行步骤:
把1<<7的值写入BSRR寄存器
(9)GPIO 端口配置锁定寄存器 (GPIOx_LCKR)(x = A~G):起到锁定某个管脚的模式、输出类型、输出速度、上下拉的作用,当模块复位后锁定会被取消
(10)GPIO 复用功能低位寄存器 (GPIOx_AFRL) :需要查相关复用功能对应的值
(11)GPIO 复用功能高位寄存器 (GPIOx_AFRH)
对寄存器的计算,可画出来理解:
GPIOF->MODER &= (~(0X03<<12));
---->
GPIOF->MODER = GPIOF->MODER & (~(0X03<<12));
XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX
1111 1111 1111 1111 1100 1111 1111 1111
XXXX XXXX XXXX XXXX XX00 XXXX XXXX XXXX
GPIOF->MODER |= 0X01<<12;
--->
GPIOF->MODER = GPIOF->MODER | 0X01<<12;
XXXX XXXX XXXX XXXX XX00 XXXX XXXX XXXX
0000 0000 0000 0000 0001 0000 0000 0000
XXXX XXXX XXXX XXXX XX01 XXXX XXXX XXXX
12.GPIO口初始化步骤:(以LED1 、4灯为例):由电路图分析,可知LED4由PC0管脚控制,并且是不用上下拉的推挽输出模式
void Led_Init(void)
{
/* 1.使能GPIO口时钟 */
RCC->AHB1ENR |= 1 << 2 ; /* 使能GPIOC端口时钟 */
/* 设置GPIO工作模式 */
GPIOC->MODER &= ~(3 << (0 * 2)); /* 把MODER寄存器0,1位清零 */
GPIOC->MODER |= 1 << (0 * 2); /* PC0设置成通用输出模式 */
/* 设置GPIO输出方式 */
GPIOC->OTYPER &= ~(1 << 0); /* PC0输出方式为推挽输出 */
/* 设置GPIO输出速度 */
GPIOC->OSPEEDR &= ~(3 << (0 * 2)); /* 把OSPEEDR寄存器12,13位清零 */
GPIOC->OSPEEDR |= 2 << (0 * 2); /* PC6输出速度50M */
/* 设置上下拉模式 */
GPIOF->PUPDR &= ~(3 << (0 * 2)); /* PC0不需要无上/下拉 */
/* 设置GPIO初始输出 */
GPIOC->ODR |= 1 << 0; /* GPIOC.0初始化状态为输出高电平 */
}
M4——GPIO配置的更多相关文章
- GPIO 配置之ODR, BSRR, BRR 详解
STM32 GPIO 配置之ODR, BSRR, BRR 详解 用stm32 的配置GPIO 来控制LED 显示状态,可用ODR,BSRR,BRR 直接来控制引脚输出状态. ODR寄存器可读可写:既能 ...
- STM32 GPIO 配置之ODR, BSRR, BRR 详解
STM32 GPIO 配置之ODR, BSRR, BRR 详解 用stm32 的配置GPIO 来控制LED 显示状态,可用ODR,BSRR,BRR 直接来控制引脚输出状态. ODR寄存器可读可写:既能 ...
- 飞思卡尔IMX6处理器的GPIO配置方式
在linux或android系统中,假如我们要配置飞思卡尔IMX6处理器的GPIO管脚,比如是GPIO_19这个管脚,那么要像这样: [cpp] view plaincopy #define MX6 ...
- GPIO 配置示例
概述:学习STM32的GPIO configration /********************************************************************** ...
- STM32 HAL库学习系列第2篇 GPIO配置
GPIO 库函数 基本就是使用以下几个函数 GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); void H ...
- ARM的GPIO配置
- [uboot]uboot中am437对应的GPIO配置
修改文件:board/ti/am43xx/mux.c 修改内容:void enable_board_pin_mux(configure_module_pin_mux(d3d4_pin_mux)
- GPIO的配置过程
今天看到一篇很好的博文,,看这里:http://www.cnblogs.com/crazyxu/archive/2011/10/14/2212337.html 下面总结一下,加深一下理解. 要使用GP ...
- STM32 GPIO口模式配置
F103系列 typedef struct { uint16_t GPIO_Pin; /*!< Specifies the GPIO pins to be configured. This pa ...
随机推荐
- ES6速记手册
1.三元操作符 这是一个很好的节省代码当你想要编写一个如果. . else语句在一线. 普通写法: const x = 20;let big;if (x > 10) { 速记: const bi ...
- 对称加密详解,以及JAVA简单实现
(原) 常用的加密有3种 1.正向加密,如MD5,加密后密文固定,目前还没办法破解,但是可以能过数据库撞库有一定概率找到,不过现在一般用这种方式加密都会加上盐值. 2.对称加密,通过一个固定的对称密钥 ...
- FreeRTOS——内存管理
1. 标准malloc() 和 free() 库函数的缺陷: 1)在小型的嵌入式系统中,可能不可用. 2)具体实现相对较大,占用较多宝贵的代码空间. 3)通常不具备线程安全性. 4)具有不确定性,每次 ...
- 简单谈谈js中的MVC
MVC是什么? MVC是一种架构模式,它将应用抽象为3个部分:模型(数据).视图.控制器(分发器). 本文将用一个经典的例子todoList来展开(代码在最后). 一个事件发生的过程(通信单向流动): ...
- tensorflow softsign函数应用
1.softsign函数 图像 2.tensorflow softsign应用 import tensorflow as tf input=tf.constant([0,-1,2,-30,30],dt ...
- 分页功能的实现——Jdbc && JSP
@目录 什么是分页 ? 两个子模块功能的问题分析 和 解决方案 有条件查和无条件查询的影响 和 解决方案 项目案例: mysql + commons-dbutils+itcast-tools+Base ...
- Sqoop将mysql数据导入hbase的血与泪
Sqoop将mysql数据导入hbase的血与泪(整整搞了大半天) 版权声明:本文为yunshuxueyuan原创文章.如需转载请标明出处: https://my.oschina.net/yunsh ...
- 可存放任意类型变量的动态数组--C语言实现
之前在训练营的时候被要求用C语言实现一个可以存放任意类型数据的栈.现在尝试实现一个数组版本. 首先用到的结构体如下(接触了Win32编程所以长得有点像里面的那些类型): typedef struct ...
- 【Spring】关于SpringMvc监听的知识点
一,在使用Spring系列框架时,我们需要在Web.xml配置Spring的监听:ContextLoaderListener ContextLoaderListener的作用就是,在Web容器初始化时 ...
- 【JAVASCRIPT】React学习-组件生命周期
摘要 整理组件加载过程,详细见官方文档:https://facebook.github.io/react/docs/react-component.html mount 过程 1)constructo ...