MM32 GPIO口8种模式

  • MindMotion
  • LV4工程师
  • |      2018-08-24 19:31:47
  • 浏览量 934
  • 回复:0
本帖最后由 MindMotion 于 2018-8-24 19:33 编辑 MM32的每个GPIO端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个32位数据寄存器(GPIOx_IDR 和 GPIOx_ODR),一个32 位置位/复位寄存器 (GPIOx_BSRR),一个16位复位寄存器 (GPIOx_BRR)、一个32位锁定寄存器(GPIOx_LCKR)和两个复用功能选择寄存器(GPIOx_AFRH)和(GPIOx_AFRL)。 一、 MM32 GPIO口模式介绍 GPIO端口的每个位可以由软件分别配置成输入浮空、输入上拉、输入下拉、模拟输入、开漏输出、推挽式输出、推挽式复用功能和开漏复用功能等8种模式。下面通过I/O端口位的基本结构图来讲解这几种模式: 1. 推挽输出 可以输出高电平,也可以输出低电平,结构是两个三极管分别受两个互补信号的控制,总是在一个三极管导通的时候另一个截止,高电平由IC电源确定。 推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高。输出既可以向负载灌电流,也可以从负载抽取电流。推拉式输出级既提高电路的负载能力,又提高开关速度。 2. 开漏输出 输出端相当于三极管的集电极,要得到高电平状态需要使用上拉电阻才行,适用于做电流型的驱动,其吸收能力相对较强(一般20ma以内) 。 开漏的特点: 利用外部电流的驱动能力,减少IC内部的驱动,当IC内部的MOSFET导通的时候,驱动电流是从外部的VCC流经 R pull-up,MOSFET到GND。IC内部仅需要很小的栅极驱动电流。 一般来说开漏是用来连接不同电平的元器件,匹配电平使用的。因为开漏输出的引脚在不连接外部的上拉电阻的时候,只能输出低电平,如果需要同时具备输出高电平的功能需要加上上拉电阻,很好的一个有点就是可以通过改变上拉电源的电压,便可以改变输出电平,比如加上上拉电阻就可以提供TTL/CMOS电平的输出等,(上拉电阻的组织决定了逻辑电平转换速度,阻值越大,速度越低功耗越小,所以负载电阻的阻值要结合实际情况选优)。 OPEN-DRAIN 提供了灵活的输出方式,但是也有弱点,就是在上升沿的时候会有延时,因为上升沿是通过外接无源上拉电阻对负载进行充电实现的,所以当电阻选择小的时候延时就小,但是功耗大,反之延时大功耗小,如果对延时有要求,则建议使用下降沿输出。 可以将多个开漏输出的Pin,连接到一条线上,通过一个上拉电阻,在不增加任何器件的情况下,形成”与逻辑”关系。这也是I2C,SMBus等总线判断总线占用的原理。 3. 复用开漏输出、复用推挽输出 可以理解为GPIO被作为第二功能使用的时候的配置情况。 4. 浮空输入 浮空输入一般多用于外部按键输入,结合图上的输入部分电路,我理解为浮空输入状态下,IO的电平状态是不确定的,完全由外部输入决定,如果在该引脚悬空的情况下,读取该端口的电平是不确定的。 5. 上拉输入 IO内部带上拉电阻输入。 6. 下拉输入 IO内部带下拉电阻输入。 7. 模拟输入 应用ADC模拟输入,或者低功耗下省电。 二、 MM32 GPIO口模式配置 MM32的GPIO端口模式配置对端口配置低寄存器(GPIOx_CRL)和端口配置高寄存器(GPIOx_CRH)的位进行操作的。 例1:配置PA15引脚推挽输出高。 #define GPIO_CRH_MODE15 ((uint32_t)0x30000000) #define GPIO_CRH_MODE15_0 ((uint32_t)0x10000000) #define GPIO_CRH_MODE15_1 ((uint32_t)0x20000000) #define GPIO_ODR_ODR15 ((uint16_t)0x8000) RCC->AHBENR|=0x3<<17; //使能GPIOA时钟 GPIOA->CRH|=GPIO_CRH_MODE15; //PA15 推挽输出 GPIOA->ODR|=GPIO_ODR_ODR15; //PA15 输出高 例2:PA0 PC13 PB10 PB11设置成输入。 void KEY_Init(void) { RCC->AHBENR|=0xf<<17; //RCC->APB2ENR|=1<<2; //使能GPIOA时钟 GPIOA->CRL&=0XFFFFFFF0; //PA0设置成输入 ,K2(WK_UP) GPIOA->CRL|= 0x00000008; GPIOC->CRH&=0XFF0FFFFF; //PC13设置成输入,K1 GPIOC->CRH|= 0x00800000; GPIOC->ODR|= 0x2000; //PC13上拉 GPIOB->CRH&=0XFFFF00FF; //PB10,PB11设置成输入,K3,K4 GPIOB->CRH|= 0x00000800| 0x00008000; GPIOB->ODR|= 0x0400| 0x0800; //PB10,PB11上拉 }
  • 0
  • 收藏
  • 举报
  • 分享
我来回复

登录后可评论,请 登录注册

所有回答 数量:0
x
收藏成功!点击 我的收藏 查看收藏的全部帖子