stm32关于gpio与afio的总结20130709_第1页
stm32关于gpio与afio的总结20130709_第2页
stm32关于gpio与afio的总结20130709_第3页
stm32关于gpio与afio的总结20130709_第4页
stm32关于gpio与afio的总结20130709_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

GPIO 功能描述 每个 GPI/O 端口有两个 32 位配置寄存器(GPIOx_CRL ,GPIOx_CRH),两个 32 位数 据寄存器(GPIOx_IDR 和 GPIOx_ODR),一个 32 位置位 / 复位寄存器(GPIOx_BSRR) ,一 个 16 位复位寄存器(GPIOx_BRR)和一个 32 位锁定寄存器(GPIOx_LCKR) 。 根据数据手册中列出的每个 I/O 端口的特定硬件特征, GPIO 端口的每个位可以由软 件分别配置成多种模式。 输入浮空 输入上拉 输入下拉 模拟输入 开漏输出 推挽式输出 推挽式复用功能 开漏复用功能 每个 I/O 端口位可以自由编程,然而 I/0 端口寄存器必须按 32 位字被访问( 不允许半 字或字节访问) 。GPIOx_BSRR 和 GPIOx_BRR 寄存器允许对任何 GPIO 寄存器的读/ 更改 的独立访问;这样,在读和更改访问之间产生 IRQ 时不会发生危险。 推挽与开漏 推挽输出:可以输出高,低电平 ,连接数字器件; 推挽结构一般是指两个三极管分别受两 互补信号的控制,总是在一个三极管导通的时候另一个截止. 开漏输出:输出端相当于三极管的集电极 . 要得到高电平状态需要上拉电阻才行. 适合 于做电流型的驱动,其吸收电流的能力相对强(一般 20ma 以内 ). 单独的位设置或位清除 当对 GPIOx_ODR 的个别位编程时,软件不需要禁止中断:在单次 APB2 写操作里, 可以只更改一个或多个位。 这是通过对“置位/ 复位寄存器”(GPIOx_BSRR ,复位是 GPIOx_BRR) 中想要更改 的位写1 来实现的。没被选择的位将不被更改。 外部中断/唤醒线 所有端口都有外部中断能力。为了使用外部中断线,端口必须配置成输入模式。 复用功能(AF) 使用默认复用功能前必须对端口位配置寄存器编程。 对于复用的输入功能,端口必须配置成输入模式(浮空、上拉或下拉 )且输入引脚 必须由外部驱动 注意: 也可以通过软件来模拟复用功能输入引脚,这种模拟可以通过对 GPIO 控制器编 程来实现。此时,端口应当被设置为复用功能输出模式。显然,这时相应的引脚不再由外 部驱动,而是通过 GPIO 控制器由软件来驱动。 对于复用输出功能,端口必须配置成复用功能输出模式(推挽或开漏) 。 对于双向复用功能,端口位必须配置复用功能输出模式(推挽或开漏) 。这时,输 入驱动器被配置成浮空输入模式。 如果把端口配置成复用输出功能,则引脚和输出寄存器断开,并和片上外设的输出信 号连接。 如果软件把一个 GPIO 脚配置成复用输出功能,但是外设没有被激活,它的输出将不 确定。 输入配置 当 I/O 端口配置为输入时: 输出缓冲器被禁止 施密特触发输入被激活 根据输入配置(上拉,下拉或浮动 )的不同,弱上拉和下拉电阻被连接 出现在 I/O 脚上的数据在每个 APB2 时钟被采样到输入数据寄存器 对输入数据寄存器的读访问可得到 I/O 状态 输出配置 当 I/O 端口被配置为输出时: 输出缓冲器被激活 开漏模式:输出寄存器上的0激活 N-MOS,而输出寄存器上的1将端口置于 高阻状态(P-MOS 从不被激活)。 推挽模式:输出寄存器上的0激活 N-MOS,而输出寄存器上的1将激活 P- MOS。 施密特触发输入被激活 弱上拉和下拉电阻被禁止 出现在 I/O 脚上的数据在每个 APB2 时钟被采样到输入数据寄存器 在开漏模式时,对输入数据寄存器的读访问可得到 I/O 状态 在推挽式模式时,对输出数据寄存器的读访问得到最后一次写的值。 复用功能配置 当 I/O 端口被配置为复用功能时: 在开漏或推挽式配置中,输出缓冲器被打开 内置外设的信号驱动输出缓冲器(复用功能输出) 施密特触发输入被激活 弱上拉和下拉电阻被禁止 在每个 APB2 时钟周期,出现在 I/O 脚上的数据被采样到输入数据寄存器 开漏模式时,读输入数据寄存器时可得到 I/O 口状态 在推挽模式时,读输出数据寄存器时可得到最后一次写的值。 一组复用功能 I/O 寄存器允许用户把一些复用功能重新映象到不同的引脚。 模拟输入配置 当 I/O 端口被配置为模拟输入配置时: 输出缓冲器被禁止; 禁止施密特触发输入,实现了每个模拟 I/O 引脚上的零消耗。施密特触发输出值被强 置为0 ; 弱上拉和下拉电阻被禁止; 读取输入数据寄存器时数值为0 。 复用功能 I/O 和调试配置(AFIO) 为了优化 64 脚或 100 脚封装的外设数目,可以把一些复用功能重新映射到其他引脚上。 设置复用重映射和调试 I/O 配置寄存器(AFIO_MAPR) 实现引脚的重新映射。这时,复用 功能不再映射到它们的原始分配上。 复用表参看手册 GPIO 代码分析 外设库 typedef struct uint16_t GPIO_Pin; GPIOSpeed_TypeDef GPIO_Speed; GPIOMode_TypeDef GPIO_Mode; GPIO_InitTypeDef; typedef struct _IO uint32_t CRL; _IO uint32_t CRH; _IO uint32_t IDR; _IO uint32_t ODR; _IO uint32_t BSRR; _IO uint32_t BRR; _IO uint32_t LCKR; GPIO_TypeDef; typedef struct _IO uint32_t EVCR; _IO uint32_t MAPR; _IO uint32_t EXTICR4; uint32_t RESERVED0; _IO uint32_t MAPR2; AFIO_TypeDef; 主要函数分析 void GPIO_DeInit(GPIO_TypeDef* GPIOx) 恢复默认设置 /* Check the parameters */ assert_param(IS_GPIO_ALL_PERIPH(GPIOx); 如果需要初始化 GPIOA,则先 enbale A 端口,然后关闭 A 端口 if (GPIOx = GPIOA) RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, DISABLE); 同理,先启用,然后关闭 void GPIO_AFIODeInit(void) 恢复默认设置 RCC_APB2PeriphResetCmd(RCC_APB2Periph_AFIO, ENABLE); RCC_APB2PeriphResetCmd(RCC_APB2Periph_AFIO, DISABLE); void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct) uint32_t currentmode = 0x00, currentpin = 0x00, pinpos = 0x00, pos = 0x00; uint32_t tmpreg = 0x00, pinmask = 0x00; /* Check the parameters */ assert_param(IS_GPIO_ALL_PERIPH(GPIOx); assert_param(IS_GPIO_MODE(GPIO_InitStruct-GPIO_Mode); assert_param(IS_GPIO_PIN(GPIO_InitStruct-GPIO_Pin); /*- GPIO Mode Configuration -*/ currentmode = (uint32_t)GPIO_InitStruct-GPIO_Mode) typedef struct uint16_t GPIO_Pin; GPIOSpeed_TypeDef GPIO_Speed; GPIOMode_TypeDef GPIO_Mode; GPIO_InitTypeDef; typedef enum GPIO_Mode_AIN = 0x0, GPIO_Mode_IN_FLOATING = 0x04, GPIO_Mode_IPD = 0x28, GPIO_Mode_IPU = 0x48, GPIO_Mode_Out_OD = 0x14, 输出都是 1X GPIO_Mode_Out_PP = 0x10, GPIO_Mode_AF_OD = 0x1C, GPIO_Mode_AF_PP = 0x18 GPIOMode_TypeDef; 判断是不是 1X,如果是则是输出类型。 if (uint32_t)GPIO_InitStruct-GPIO_Mode) /* Output mode */ 输出模式下,只要把速度加上就可以了,2,3 位上已经表示了 CNFX 的类型 currentmode |= (uint32_t)GPIO_InitStruct-GPIO_Speed; /*- GPIO CRL Configuration -*/ /* Configure the eight low port pins */ 把引脚数取出来,然后移位,然后再配置 if (uint32_t)GPIO_InitStruct-GPIO_Pin for (pinpos = 0x00; pinpos GPIO_Pin) if (currentpin = pos) pos = pinpos GPIO_Mode = GPIO_Mode_IPD) GPIOx-BRR = (uint32_t)0x01) GPIO_Mode = GPIO_Mode_IPU) GPIOx-BSRR = (uint32_t)0x01) CRL = tmpreg; /*- GPIO CRH Configuration -*/ /* Configure the eight high port pins */ if (GPIO_InitStruct-GPIO_Pin 0x00FF) tmpreg = GPIOx-CRH; for (pinpos = 0x00; pinpos GPIO_Pin) if (currentpin = pos) pos = pinpos GPIO_Mode = GPIO_Mode_IPD) GPIOx-BRR = (uint32_t)0x01) GPIO_Mode = GPIO_Mode_IPU) GPIOx-BSRR = (uint32_t)0x01) CRH = tmpreg; void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState) uint32_t tmp = 0x00, tmp1 = 0x00, tmpreg = 0x00, tmpmask = 0x00; /* Check the parameters */ assert_param(IS_GPIO_REMAP(GPIO_Remap); assert_param(IS_FUNCTIONAL_STATE(NewState); 看看 ramap 的地址是多少, if(GPIO_Remap else tmpreg = AFIO-MAPR; tmpmask = (GPIO_Remap tmp = GPIO_Remap if (GPIO_Remap AFIO-MAPR else if (GPIO_Remap tmpreg |= DBGAFR_SWJCFG_MASK; if (NewState != DISABLE) tmpreg |= (tmp 0x15)*0x10); Tmpreg 中保存的是最终要写进寄存器的值 if(GPIO_Remap else AFIO-MAPR = tmpreg; GPIO 应用实例 void LED_Config(void) RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOD , ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; /设置 pin5 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /设置推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /口线翻转速度为 50MHz GPIO_Init(GPIOB, PB 的 5 引脚进行设置 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_3; /LED2, LED3 V7 V8 GPIO_Init(GPIOD, PD 的 6,3 引脚也设置为 50MHZ 与推挽 输出 例: /* I2C1_SCL on PB.08, I2C1_SDA on PB.09 */ GPIO_PinRemapConfig(GPIO_Remap_I2C1, ENABLE); 这样就可以启用 I2C1 的引脚定义

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论