Cortex-M0芯片GPIO详解
本文以STM32F051K8U6为例,主要介绍GPIO寄存器特点及应用,以及CubeMX的配置和HAL库函数的使用。
GPIO接口简介
通用输入输出接口GPIO是嵌入式系统、单片机开发过程中最常用的接口,用户可以通过编程灵活的对接口进行控制,实现对电路板上LED、数码管、按键等常用设备控制驱动,也可以作为串口的数据收发管脚,或AD的接口等复用功能使用。因此其作用和功能是非常重要的。
SoC芯片上的单个引脚可以通过配置GPIO寄存器以实现多种不同的功能,这就是多路复用。下图是芯片上GPIOA这一组端口上的引脚复用功能示意。
STM32F051-GPIO常用寄存器
4个32位配置寄存器
GPIOx_MODER, GPIOx_OTYPER, GPIOx_OSPEEDR GPIOx_PUPDR
2个32位数据寄存器
GPIOx_IDR 、GPIOx_ODR
1 个32 位置位 / 复位寄存器
GPIOx_BSRR
2 个 32 位复用功能配置寄存器
GPIOx_AFRH 、GPIOx_AFRL
注:每一组GPIO端口都有一套上述的寄存器去配置它自己的功能
MODER
GPIO 端口模式寄存器 (GPIOx_MODER) (x = A..D,F),主要用于指定GPIO端口的工作模式。
MODER是32位寄存器,其中每两位对应一个引脚。对于每个GPIOx上的引脚y,存在位[2y+1:2y](y = 0...15),即MODERy[1:0],用于配置I/O口的工作模式,模式代码如下:
00:输入模式(复位状态)
01:通用输出模式
10:复用功能模式
11:模拟模式
OTYPER
GPIO 端口输出类型寄存器 (GPIOx_OTYPER) (x = A..D,F),主要用于指定GPIO端口的输出类型。
OTYPER是32位寄存器,其中31:16为保留位,15:0为有效位,每一位二进制位对应一个引脚。对于每个GPIO上的引脚y,存在位[y](y = 0...15),即OTy,用于配置引脚的输出类型,类型代码如下:
0:推挽输出(复位状态)
1:开漏输出
如下图所示,若将输出类型设置为推挽输出模式,则不需要外接上(下)拉电阻,直接使用输出驱动器内部的互补信号输出高低电平,且在这两种电平下都有一定的驱动能力;若将输出类型设置为开漏输出模式,则是从MOSFET的漏极输出的电路,要得到真正的高电平状态需要加上拉电阻才行,否则引脚的高电平状态为高阻态。
OSPEEDR
GPIO 口输出速度寄存器 (GPIOx_OSPEEDR) (x = A..D,F),主要用于配置I/O口的输出速度。
OSPEEDR是32位寄存器,其中每两位对应一个引脚。对于每个GPIOx上的引脚y,存在位[2y+1:2y](y = 0...15),即OSPEEDRy[1:0],用于配置引脚的输出速度,代码如下:
x0:低速 2MHz
01:中速 10MHz
11:高速 50MHz
速度越高,输出效果越好,但能耗相应的也越高,因此在配置过程中根据具体应用需要选择合适的速度进行配置即可。
PUPDR
GPIO 口上拉 / 下拉寄存器 (GPIOx_PUPDR) (x = A..D,F),用于配置引脚的上拉或下拉电阻。
PUPDR是32位寄存器,其中每两位对应一个引脚。对于每个GPIOx上的引脚y,存在位[2y+1:2y](y = 0...15),即PUPDRy[1:0],用于配置引脚的上拉或下拉电阻,代码如下:
00:无上拉或下拉
01:上拉
10:下拉
11:保留
IDR
GPIO 端口输入数据寄存器 (GPIOx_IDR) (x = A..D,F),用于读取GPIO引脚的输入数据。
IDR是32位寄存器,其中31:16为保留位,15:0为有效位,每一位二进制位对应一个引脚。对于每个GPIO上的引脚y,存在位[y](y = 0...15),即IDRy(只读),用于读取GPIO引脚的输入数据。
ODR
GPIO 端口输入数据寄存器 (GPIOx_ODR) (x = A..D,F),用于写入GPIO引脚的输输出数据。
ODR是32位寄存器,其中31:16为保留位,15:0为有效位,每一位二进制位对应一个引脚。对于每个GPIO上的引脚y,存在位[y](y = 0...15),即ODRy,用于写入GPIO引脚的输出数据。
BSRR
GPIO 端口置位 / 复位寄存器 (GPIOx_BSRR) (x = A..D,F),用于对GPIO端口进行置位/复位操作。
ODR是32位寄存器,其中31:16为端口x的复位位,15:0端口x的置位位,每一位二进制位对应一个引脚。
位31:16 BRy:对端口x的第y位进行复位操作(y = 0...15)。
这些位只写,读的时候返回0x0000。
写0:对相应的ODRy位无影响
写1:复位相应的ODRy位
位15:0 BSy:对端口x的第y位进行置位操作(y = 0...15)。
这些位只写,读的时候返回0x0000。
写0:对相应的ODRy位无影响
写1:置位相应的ODRy位
注:BRy和BSy同时写1时,BSy优先。
AFRL/AFRH
GPIO 复用功能低位寄存器 (GPIOx_AFRL) (x = A..B),以及GPIO 复用功能高位寄存器 (GPIOx_AFRH) (x = A..B),用于配置GPIO端口的复用功能。
位31:0 AFRLy:端口x引脚y的复用功能选择(y = 0...7),每四位对应一个引脚,代码如下:
0000:AF0
0001:AF1
0010:AF2
0011:AF3
0100:AF4
0101:AF5
0110:AF6
0111:AF7
其他代码保留。
位31:0 AFRHy:端口x引脚y的复用功能选择(y = 8...15),每四位对应一个引脚,代码如下:
0000:AF0
0001:AF1
0010:AF2
0011:AF3
0100:AF4
0101:AF5
0110:AF6
0111:AF7
其他代码保留。
STM32F051-GPIO输入输出配置实例(寄存器版)
由下图可知,开发板上的LED2~4分别对应GPIOB的第0号、第1号、第2号引脚,且当引脚为高电平时LED灯熄灭,引脚为低电平时LED灯点亮。
对GPIOB端口的第0号、第1号、第2号引脚进行初始化,代码如下:
RCC->AHBENR |= 1<<18; //开启AHB外部时钟GPIOB->MODER |= (1<<0)|(1<<2)|(1<<4); //将GPIOB端口的第0号、第1号、第2号引脚配置为输出模式GPIOB->OTYPER = 0x0; //所有引脚配置为推挽输出GPIOB->OSPEEDR = 0x0; //引脚速度设置为低速
对GPIOB端口的BSRR置位/复位寄存器进行操作,使第0号、第1号、第2号引脚输出一个周期为1s的方波信号,同时LED以1s为周期闪烁,代码如下:
while (1)
{GPIOB->BSRR = (1<<16)|(1<<17)|(1<<18); // 点亮LEDHAL_Delay(500); // 延时500msGPIOB->BSRR = (1<<0)|(1<<1)|(1<<2); // 熄灭LEDHAL_Delay(500); // 延时500ms
}
由下图可知,开发板上的五向按键对应GPIOA的第8号引脚。
对GPIOA端口的第8号引脚进行初始化,代码如下:
GPIOA->MODER &= ~(0x3<<16); //将GPIOA端口的第8号引脚配置为输入模式GPIOA->OTYPER = 0x0; //所有引脚配置为推挽输出GPIOA->OSPEEDR = 0x0; //引脚速度设置为低速
当GPIOA端口的第8号引脚为高电平时,说明有按键按下,此时可以控制某LED电平翻转。
while (1)
{while(GPIOA->IDR & (1<<8)){if(GPIOB->ODR & (1<<0))GPIOB->BSRR = (1<<16);elseGPIOB->BSRR = (1<<0);HAL_Delay(100);}
}
STM32F051-GPIO输入输出配置实例(HAL库函数版)
使用HAL库函数可以避免在配置寄存器的过程中出错,从而导致查错困难。首先使用CubeMX对HAL库进行初始化,如下图所示:
然后导出CubeMX自动生成的MDK工程,则可以在工程内看到GPIO初始化代码如下:
void MX_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};/* GPIO Ports Clock Enable */__HAL_RCC_GPIOB_CLK_ENABLE();/*Configure GPIO pin Output Level */HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2, GPIO_PIN_RESET);/*Configure GPIO pins : PB0 PB1 PB2 */GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);}
此时,在main函数中,只需要调用如下函数就能对GPIO引脚进行操作:
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2, GPIO_PIN_RESET); // 复位PB0, PB1, PB2 即点亮LED
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2, GPIO_PIN_SET); // 置位PB0, PB1, PB2 即熄灭LED
GPIO_PinState PA8_state = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_8); // 读取PA8状态,返回值为GPIO_PIN_SET(按键按下)/GPIO_PIN_RESET(按键放开)
至此,GPIO的输入输出操作总结完毕。
注:本文仅由作者用于总结和记录学习ARM系列软件和Linux驱动开发的过程,未经允许请勿擅自转载,如有侵权请联系作者删除。
Cortex-M0芯片GPIO详解相关推荐
- cortex m0启动代码详解
转自:http://www.cnblogs.com/mddblog/p/4920063.html 阅读目录 概述 1.堆栈空间定义 2.存放中断向量表 3. 复位中断函数(Reset_Handler) ...
- 高通驱动树中的GPIO详解
高通驱动树中的GPIO详解 reference:https://blog.csdn.net/baidu_37503452/article/details/80257441 Drive Strength ...
- STM32F0——GPIO详解
STM32F0--GPIO详解 一. GPIO (General Purpose I/O Port) 统称为通用输入/输出端口. 二. GPIO的基本结构 1. 输入配置 2.输出配置 3. 复用功能 ...
- 国产GPU的发展历程及芯片性能详解
一.国产GPU的发展历程 二.国产GPU进口代替的紧迫性 三.景嘉微:具有完全自主知识产权,打破国外GPU长期垄断 四.景嘉微国产GPU芯片概述 五.景嘉微国产GPU芯片性能详解 六.景嘉微国产GPU ...
- STM32 GPIO 详解
0. 实验平台 基于STM32F407ZG 1. GPIO 简介 1.1 简介 GPIO全称:General Purpose Input Output,即通用输入输出端口,一般用来采集外部器件的信息或 ...
- 转整型_SPI转can芯片CSM300详解、Linux驱动移植调试笔记
一口君最近移植了一款SPI转CAN的芯片CSM300A,在这里和大家做个分享. 一.CSM300概述 CSM300(A)系列是一款可以支持 SPI / UART 接口的CAN模块. 1. 简介 CSM ...
- usb hub芯片 android,usb hub芯片GL850G详解
GL850G拥有低耗电.温度低及接脚数减少等产品特性. 它支援4个下游连接埠,可完全支援USB2.0/1.1规格,因此无论是与主机端或是与其他USB设备介面的传输连接(高速/全速/低速设备传输)皆能完 ...
- STM32基础入门——GPIO详解
目录 一.GPIO的简介 二.GPIO工作模式-----输入 1.浮空输入模式 2.上拉输入模式 3.下拉输入模式 4.模拟输入模式 三.GPIO工作模式-----输出 1.开漏输出模式 2.推挽输出 ...
- 嵌入式学习笔记之GPIO详解
一. 什么是GPIO GPIO,英文全称为General-Purpose IO ports,也就是通用IO口.在嵌入式系统中常常有数量众多,但是结构却比较简单的外部设备/电路,对这些设备/电路有的需要 ...
- ZYNQ7000-AXI GPIO详解
参考:PG144 - AXI GPIO v2.0 Product Guide (v2.0) 一. AXI GPIO的概念与作用 AXI GPIO是ZYNQ PL部分的一个IP软核,此IP核提供AXI- ...
最新文章
- 谷歌又一部门震荡:半年2名副总出走,开发团队只剩一半
- 【Kaggle-MNIST之路】自定义程序结构(七)
- JavaScript学习05 定时器
- 使用Google Cloud Storage托管您的Maven工件
- 求1+2+3+...(信息学奥赛一本通-T1158)
- 关于ORM和存储过程的一些看法
- Robust Principal Component Analysis?(PCP)
- 【ambari】Ambari 环境安装
- bzoj 1014 火星人prefix —— splay+hash
- 系统清理软件测试,系统垃圾清理有用吗?六大清理工具评测
- matlab支持向量回归,支持向量回归 MATLAB代码
- 哪吒票房一路飙升100行python代码抓取豆瓣短评
- 恒生电子:控股股东恒生集团股权变更已完成工商变更登记手续
- 本周内外盘行情回顾2022.2.27
- 苹果手机计算机无法横屏,苹果手机怎么设置屏幕旋转失灵了怎么办
- 目前安卓模拟器哪个比较好?
- 【2023】DevOps、SRE、运维开发面试宝典之Redis相关面试题
- 考生合格证书打印的部分代码和生成证书方法
- sqlserver中,sql语句,按照汉字拼音首字母排序
- uni-app获取当前位置并计算出某个地点距离
热门文章
- 史上最大DDoS攻击”之争”
- 【饭谈】为什么有的技术博文你看不懂?
- 正/负相比例放大中压摆率对电路带宽的影响分析
- sql数据库可以创建同义词_如何使用同义词简化SQL Server数据库对象的使用
- WPF(C#)桌面UI控件库推荐:Newbeecoder.UI-NbGroupBox使用
- HTML中如何修改提示文字,html中input提示文字样式修改
- oss新增bucket权限问题
- CentOS下查看本机ip地址方法
- pycharm中python环境的配置
- 中国内地LCD液晶屏原材料仍正在发展中(二)