免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

微机原理与接口技术 · 第6章《GPIO 通用输入 / 输出接口》知识点全梳理

微机原理与接口技术 · 第6章《GPIO 通用输入 / 输出接口》知识点全梳理 微机原理与接口技术 · 第6章《GPIO 通用输入 / 输出接口》知识点全梳理本文整理自福州大学《微机原理与接口技术》吴衔誉教授第六章课件系统讲解 GPIO 概述与引脚命名、内部结构与工作模式、GPIO 寄存器、RCC 时钟模块、固件库函数以及 GPIO 使用实例六大板块。目录一、GPIO 概述及引脚命名二、内部结构及工作模式三、GPIO 的寄存器四、RCC 时钟模块五、GPIO 固件库函数六、GPIO 的使用本章小结与思考题一、GPIO 概述及引脚命名1.1 什么是 GPIOGPIOGeneral-Purpose Input/Output通用输入 / 输出接口几乎是每个嵌入式系统都绕不开的基础外设。状态指示、报警输出、继电器吸合 / 断开、按钮状态读入、开关量报警输入等等这些「开关量」的输入和输出都可以通过 GPIO 实现。1.2 引脚是如何分组的STM32F103 系列根据型号不同最多可提供112 个多功能双向 I/O 引脚。以STM32F103VET6为例它有80 根能承受 5V 电压的多功能快速 I/O 口线。每16 根口线分为一组分别为PA、PB、PC、PD、PE五个端口。1.3 每个端口有哪些寄存器一个 GPIO 端口由 7 个寄存器组成寄存器名称位宽作用GPIOx_CRL端口配置低寄存器32 位配置 Pin 0~7GPIOx_CRH端口配置高寄存器32 位配置 Pin 8~15GPIOx_IDR端口输入数据寄存器32 位读引脚电平GPIOx_ODR端口输出数据寄存器32 位写引脚电平GPIOx_BSRR端口位设置 / 清除寄存器32 位原子置位 / 清位GPIOx_BRR端口位清除寄存器16 位原子清位GPIOx_LCKR端口配置锁定寄存器32 位冻结配置CRL和CRH是一对功能完全相同、但管理对象不同的「兄弟」寄存器共同负责把一个端口全部 16 个引脚的工作模式和输出速度配好。CRL管低 8 位Pin 0~7CRH管高 8 位Pin 8~15。每个引脚由 4 个位来配置可配置的模式包括模拟输入、浮空输入、上拉 / 下拉输入、推挽输出、开漏输出、复用功能推挽、复用功能开漏。对于输出模式还可以配置引脚的最大输出速度。二、内部结构及工作模式2.1 内部结构理解 GPIO先要理解它内部那点「电路」。一个 I/O 引脚的内部可以拆成三块来看。输入侧保护二极管 施密特触发器保护二极管靠近引脚处接了两只保护二极管。假设导通压降为Vd则输入信号电压被钳位在VSS - Vd Vin VDD Vd即不会让信号超出电源范围太多保护内部电路。输入驱动器主要由 TTL 肖特基触发器施密特触发器、带开关的上拉电阻和带开关的下拉电阻构成。施密特触发器Schmitt trigger用肖特基管构成的、带正反馈的比较器电路。它能把缓慢变化的模拟信号整形成干净的矩形数字信号。规则是输入高于正向阈值输出高低于负向阈值输出低介于两者之间输出保持不变。这就是为什么浮空输入的引脚读数稳定不会在临界值附近乱跳。输出侧多路选择器 输出控制 互补 MOS 管多路选择器决定引脚是普通 GPIO 输出还是复用功能输出。普通输出时信号来自ODR复用输出时信号来自片上外设。输出控制控制一对互补 MOS 管的导通 / 关断决定输出模式。MOS 管即 MOSFETMetal-Oxide-Semiconductor Field-Effect Transistor金属-氧化物半导体场效应晶体管分NMOSN 沟道和PMOSP 沟道。特性NMOS 管PMOS 管全称N 沟道金属-氧化物-半导体场效应晶体管P 沟道金属-氧化物-半导体场效应晶体管核心载流子电子带负电空穴等效正电荷导通条件栅源电压VGS 正阈值Vth栅源电压VGS 负阈值Vth通俗理解高电平导通低电平导通推挽输出Push-Pull, PP通过一对互补 MOS 管内部输出「1」时PMOS 导通、NMOS 截止引脚被拉到 VDD输出高电平内部输出「0」时PMOS 截止、NMOS 导通引脚被拉到 VSS输出低电平相比普通输出推挽输出负载能力强、开关速度快适合在 0V 和 VDD 之间来回切换的场合。从 PMOS / NMOS 状态看推挽PMOSNMOS工作模式特点导通截止推挽输出高电平提供拉电流快速上拉至 VDD驱动强截止导通推挽输出低电平提供灌电流快速下拉至 GND驱动强导通导通非法状态应避免VDD 直通 GND 短路电流可能烧毁 MOS 管开漏输出Open-Drain, OD与 VDD 相连的 PMOS 始终截止只有 NMOS漏极开路内部输出「0」时NMOS 导通引脚接地输出低电平内部输出「1」时NMOS 截止引脚既不是高也不是低而是高阻态悬空。开漏输出的关键特征要得到高电平必须外接上拉电阻通过改上拉电压可以匹配不同电平电平转换上升沿有延时延时由上拉电阻决定多个开漏引脚可接到同一条线靠一只上拉电阻形成「线与」关系吸收电流能力强适合电流型驱动。一句话区分推挽能主动输出高和低、驱动强开漏只能主动拉低、高电平靠外接上拉适合电平转换和「线与」。2.2 八种工作模式STM32 的 I/O 引脚共有 8 种工作模式4 种输入 4 种输出。4 种输入模式输入浮空引脚既不接高也不接低电平不确定可能是 0V、VDD 或中间值输入上拉通过电阻钳位到高电平如 VDD电阻兼有限流作用输入下拉与上拉原理相似钳位到低电平如 GND模拟输入用于把引脚模拟信号送进内部 ADC。此时上拉 / 下拉开关和施密特触发器都关闭。4 种输出模式开漏输出见上适合电流型驱动、电平匹配开漏复用输出在开漏基础上引脚被用作第二功能片上外设输出推挽输出可输出高 / 低电平连接数字器件导通损耗小、效率高推挽复用输出在推挽基础上引脚被用作第二功能。引脚模式怎么选实用 8 条场景应选模式要把引脚信号读入 MCU输入模式普通 GPIO 输入浮空 / 上拉 / 下拉且关闭该引脚所有复用功能内置外设输入浮空 / 上拉 / 下拉且使能对应复用功能模块普通模拟输入模拟输入模式关闭所有复用功能普通 GPIO 输出推挽或开漏关闭所有复用功能内置外设输出复用推挽或复用开漏使能对应复用功能输出既要高又要低、且速度高如 OLED推挽输出要求输出电流大、或外部电平不匹配开漏输出2.3 输出速度这里的「速度」指的是I/O 口驱动电路的响应速度不是输出信号本身的速度信号速度由软件决定。STM32F103 输出模式有3 档2 MHz、10 MHz、50 MHz。一般推荐引脚输出速度取输出信号速度的5~10 倍不需要高频时尽量选低速有利于降低 EMIElectromagnetic Interference电磁干扰和功耗。外设 / 场景建议速度LED、数码管、蜂鸣器2 MHz串口UART最大 115200 b/s2 MHzI2C400000 b/s留余量10 MHzSPI50 MHzFSMC 复用连接存储器50 MHz2.4 GPIO 的功能普通 I/O复位期间和刚复位后复用功能未开启I/O 被配成浮空输入写到ODR的值输出到引脚IDR每个 APB2 时钟捕捉一次引脚数据。单独的位设置 / 清除不用关中断通过写BSRR或BRR的对应位即可只改某些位、不影响其他位。外部中断 / 唤醒线所有端口都有外部中断能力但必须配成输入模式才能用。复用功能AF配置成复用输出后引脚与ODR断开、与片上外设输出信号连接外设未激活时输出不确定。软件重映射 I/O 复用功能通过配置 AFIO 寄存器把某些复用功能换到别的引脚上让不同封装的器件 I/O 数量最优。锁定机制执行锁定程序后在下一次复位前不能再改端口位配置。输入配置输出缓冲器禁止施密特输入激活据配置接上拉 / 下拉每个 APB2 时钟采样到IDR。输出配置输出缓冲器激活施密特输入激活上拉 / 下拉禁止读ODR得最后一次写的值。复用功能配置输出缓冲器打开由内置外设驱动施密特输入激活。模拟输入配置输出缓冲器禁止施密特触发器禁止零消耗读IDR得到 0。三、GPIO 的寄存器对外设的操作本质上就是操作寄存器。先要知道每个寄存器的地址。3.1 存储器映射以 STM32F103VET6 为例端口地址范围PA0x4001 0800 ~ 0x4001 0BFFPB0x4001 0C00 ~ 0x4001 0FFFPC0x4001 1000 ~ 0x4001 13FFPD0x4001 1400 ~ 0x4001 17FFPE0x4001 1800 ~ 0x4001 1BFF每个端口第一个地址是首地址各寄存器地址以偏移量给出物理地址 基地址 偏移量。3.2 各寄存器速查寄存器偏移复位值要点GPIOx_CRL0x000x4444 4444配 Pin 0~7CNFy[1:0]MODEy[1:0]各 4 位GPIOx_CRH0x040x4444 4444配 Pin 8~15定义同 CRLGPIOx_IDR0x080x0000 XXXX只读位 [15:0] 为引脚输入GPIOx_ODR0x0C0x0000 0000可读写位 [15:0] 为引脚输出GPIOx_BSRR0x100x0000 0000位 [15:0] 置位BSy位 [31:16] 清除BRyGPIOx_BRR0x140x0000 0000位 [15:0] 清除BRyGPIOx_LCKR0x180x0000 0000锁定配置写序列激活几个容易考的点复位值 0x4444 4444 意味着浮空输入每 4 位 CNF01、MODE00即浮空输入模式。把 PA0 配成推挽输出 50 MHz其余不变则CRL值 0x4444 4443最低 4 位从 0x4 改成 0x3。BSRR 妙处写 1 置位、写 1 清除分占高 / 低 16 位可以「只动某些位」而不影响其他位且不用关中断。LCKR 锁键写入序列写 1 → 写 0 → 写 1 → 读 0 → 读 1。执行正确序列后下次系统复位前端口配置被冻结。四、RCC 时钟模块4.1 时钟源STM32 有5 个时钟源时钟源全称频率来源HSIHigh Speed Internal高速内部时钟8 MHz内部 RC 振荡器HSEHigh Speed External高速外部时钟4~16 MHz外部晶振LSILow Speed Internal低速内部时钟40 kHz内部 RC 振荡器LSELow Speed External低速外部时钟32.768 kHz外部晶振PLLPhase Locked Loop锁相环倍频输出由 HSE/HSI ×2~×16倍频STM32 时钟配置的总原则先倍频作为处理器时钟再由内向外分频。要用某个外设必须先使能它的时钟——这就是 RCC 存在的意义。4.2 RCC 是什么RCCReset and Clock Control复位和时钟控制模块寄存器首地址0x4002 1000。相关寄存器包括RCC_CR、RCC_CFGR、RCC_CIR、RCC_APB2RSTR、RCC_APB1RSTR、RCC_AHBENR、RCC_APB2ENR、RCC_APB1ENR、RCC_BDCR、RCC_CSR。4.3 RCC_CR时钟控制寄存器偏移 0x00复位 0x0000 XX83HSION/HSIRDYHSI 使能 / 就绪标志HSEON/HSERDYHSE 使能 / 就绪标志就绪需几个振荡周期HSEBYPHSE 旁路模式——不用芯片内部时钟驱动组件直接从外界导入时钟信号调试时常开CSSON时钟安全系统使能监测 HSE 失效PLLON/PLLRDYPLL 使能 / 锁定标志HSICAL/HSITRIMHSI 校准与微调每步约 40 kHz调到 8 MHz ±1%。4.4 RCC_CFGR时钟配置寄存器偏移 0x04复位 0x0000 0000这是最关键的配置寄存器位域名称作用SW[1:0]System Clock Switch系统时钟切换选系统时钟源00 HSI / 01 HSE / 10 PLLSWS[1:0]系统时钟切换状态硬件反馈当前时钟源HPRE[3:0]AHB 预分频SYSCLK 分频后给 AHB2~512 分频PPRE1[2:0]低速 APB 预分频给 APB1须 36 MHzPPRE2[2:0]高速 APB 预分频给 APB2ADCPRE[1:0]ADC 预分频给 ADC2/4/6/8 分频PLLSRCPLL 输入时钟源0: HSI/21: HSEPLLXTPREHSE 分频器0: HSE 不分频1: HSE 2 分频PLLMUL[3:0]PLL 倍频系数×2~×16输出不超过 72 MHzUSBPREUSB 预分频给 USB 时钟MCO[2:0]Microcontroller Clock Output引脚输出时钟供外部观测4.5 RCC_CIR时钟中断寄存器偏移 0x08管理 5 个时钟源LSI/HSI/LSE/HSE/PLL的就绪中断使能xxRDYIE、就绪中断标志xxRDYF、清除xxRDYC以及CSSC清除时钟安全系统中断和CSSF安全系统中断标志HSE 失效时硬件置 1。4.6 外设时钟使能寄存器重点GPIO 挂在APB2总线上所以要点亮一个 GPIO 端口必须先开对应时钟RCC_APB2ENR偏移 0x18含IOPxENIO 端口时钟使能、AFIOEN辅助功能 IO 时钟等RCC_APB1ENR偏移 0x1CAPB1 外设时钟使能RCC_AHBENR偏移 0x14AHB 外设时钟使能DMA、FSMC、CRC、SRAM 等RCC_APB2RSTR/RCC_APB1RSTR外设复位寄存器软件置 1 复位相应外设。4.7 RCC_BDCR 与 RCC_CSRRCC_BDCR备份域控制偏移 0x20RTCENRTC 时钟使能、RTCSEL[1:0]RTC 时钟源选 LSE/LSI/HSE、LSEON/LSERDY、BDRST备份域软件复位RCC_CSR控制 / 状态偏移 0x24各种复位标志——LPWRRSTF低功耗、WWDGRSTF窗口看门狗、IWDGRSTF独立看门狗、SFTRSTF软件、PORRSTF上电 / 掉电、PINRSTFNRST 引脚以及RMVF清除复位标志。五、GPIO 固件库函数5.1 为什么用固件库直接操作寄存器虽然高效但要对硬件理解极深、记住所有寄存器名和位定义写出来的程序可读性也差。ST 提供的STM32 标准固件库位于寄存器和用户之间向下直接操作寄存器向上提供标准化的配置接口包含引脚设置、位设置 / 清除、锁定、读写等函数大幅降低开发难度。5.2 GPIO 寄存器结构#definevu32volatileunsignedint// 防优化typedefstruct{vu32 CRL;// 端口配置低寄存器vu32 CRH;// 端口配置高寄存器vu32 IDR;// 端口输入数据寄存器vu32 ODR;// 端口输出数据寄存器vu32 BSRR;// 端口位设置 / 复位寄存器vu32 BRR;// 端口位复位寄存器vu32 LCKR;// 端口配置锁定寄存器}GPIO_TypeDef;// 5 个 GPIO 外设声明基地址挂在 APB2 外设基址上#defineGPIOA_BASE(APB2PERIPH_BASE0x0800)#defineGPIOB_BASE(APB2PERIPH_BASE0x0C00)#defineGPIOC_BASE(APB2PERIPH_BASE0x1000)#defineGPIOD_BASE(APB2PERIPH_BASE0x1400)#defineGPIOE_BASE(APB2PERIPH_BASE0x1800)5.3 常用 GPIO 库函数一览函数作用GPIO_DeInit外设寄存器重设为默认值GPIO_AFIODeInit复用功能重设为默认值GPIO_Init按结构体参数初始化 GPIOxGPIO_StructInit把结构体参数填默认值GPIO_ReadInputDataBit读指定引脚输入GPIO_ReadInputData读整个端口输入GPIO_ReadOutputDataBit读指定引脚输出GPIO_ReadOutputData读整个端口输出GPIO_SetBits指定位置高电平GPIO_ResetBits指定位清低电平GPIO_WriteBit指定位置高或低GPIO_Write向整个端口写数据GPIO_PinLockConfig锁定引脚配置GPIO_PinRemapConfig改变引脚映射GPIO_EXTILineConfig选引脚作外部中断线5.4 GPIO_Init 与配置示例GPIO_Init原型voidGPIO_Init(GPIO_TypeDef*GPIOx,GPIO_InitTypeDef*GPIO_InitStruct);配置结构体只有三个成员typedefstruct{u16 GPIO_Pin;// 选引脚可用 | 组合多引脚GPIOSpeed_TypeDef GPIO_Speed;// 速率2/10/50 MHzGPIOMode_TypeDef GPIOMode;// 工作模式}GPIO_InitTypeDef;例把 PE0 配成推挽输出、50 MHzGPIO_InitTypeDef GPIO_InitStructure;// 声明结构体GPIO_InitStructure.GPIO_PinGPIO_Pin_0;// 选 PE0GPIO_InitStructure.GPIO_SpeedGPIO_Speed_50MHz;GPIO_InitStructure.GPIO_ModeGPIO_Mode_Out_PP;// 推挽输出GPIO_Init(GPIOE,GPIO_InitStructure);// 生效GPIO_SetBits(GPIOE,GPIO_Pin_0);// PE0 输出高GPIO_ResetBits(GPIOE,GPIO_Pin_0);// PE0 输出低六、GPIO 的使用6.1 三种开发方式课件给出三种开发方式以「控制 PE0 上的 LED 亮 0.5 秒、灭 0.5 秒」为例方式思路汇编直接操作寄存器例 6-1配系统时钟 → 开 GPIOE 时钟 → 设 PE0 模式 → 循环翻转C 直接操作寄存器例 6-2用指针直接写GPIOx寄存器配时钟与模式后翻转固件库函数例 6-3用RCC_APB2PeriphClockCmd(...ENABLE)开时钟再用GPIO_InitGPIO_SetBits/ResetBits翻转三种方式本质一样只是抽象层级不同寄存器方式最贴近硬件、最省空间库函数方式最易读、最好移植。6.2 通用三步无论哪种方式都逃不开三步配置系统时钟并打开 GPIO 口的时钟RCC设置 GPIO 引脚的工作模式进行输入或输出操作。本章小结与思考题核心知识地图GPIO 概述与引脚命名112 个 / 80 根 / 16 根一组、PA~PE 五端口、7 个寄存器内部结构与工作模式保护二极管 施密特触发器 互补 MOS 管推挽 / 开漏4 输入 4 输出共 8 种模式3 档输出速度10 项功能GPIO 寄存器存储器映射、CRL/CRH/IDR/ODR/BSRR/BRR/LCKR 的偏移与关键位RCC 时钟模块5 个时钟源、RCC_CR/CFGR/CIR、外设时钟使能寄存器、BDCR/CSR固件库函数GPIO_TypeDef、常用库函数一览、GPIO_Init与配置示例GPIO 的使用汇编 / 寄存器 / 库函数三种方式、通用三步。本文由课程课件与讲稿整理供学习交流使用。如需转载或用于教学请注明出处。欢迎在评论区交流讨论。
返回列表