本帖最后由 TechHolder 于 2019-8-8 23:13 编辑
AC781x GPIO模块应用笔记
1 GPIO特性
1. AC781x系列最多有68个GPIO可供选用(boot脚也可用作GPIO)
2. GPIO的驱动能力可配置:4mA,8mA,12mA,16mA
3. 输入模式:浮空输入,上拉/下拉输入,模拟输入(配置为ADC通道)
4. 输出模式:推挽输出,开漏输出(配置为I2C功能)
5. 能够按位进行读写
6. 快速切换,每2个时钟周期切换一次
7. 引脚高度灵活复用,每隔IO可提供多种功能选择
8. 可配置边沿触发外部中断(上升沿,下降沿,both)
9. 低功耗模式能够唤醒MCU
1.2 GPIO操作模式
1.2.1 bit-band
AC781x提供快速IO桥对CRC和GPIO进行高速访问,GPIO快速访问地址:0x20080000 ~ 0x20080FFF,bit-band能够通过快速地址对GIO进行访问,控制GPIO操作。
1.2.2 输入输出
可将引脚配置为通用输入输出功能,用来识别或输出高低电平,GPIOx_CR寄存器控制输入输出方向,GPIOx_IDR与GPIOx_ODR分别是输入模式与输出模式下的数据寄存器。
备注: 1.为什么某些引脚不能输出高电平或低电平,或输入功能无效? 某些引脚上电后具有特定功能,如JTAG接口引脚与BOOT脚,需要使用多路复用将其复用到GPIO,然后才能正常使用其GPIO功能;使用GPIOx_PINMUX选择复用功能,对应库函数是GPIO_SetFunc()。
1.2.3 外部中断
虽然AC781x系列每个GPIO引脚都可配置为外部中断,但EXTI_Line却只有16条,所以同时只能支持最多16个外部中断。
备注: 1.为什么同时使能两个外部中断,只有其中一个能产生外部中断,另外一个则不能产生? 同一EXTI_Line同时只能支持一个外部中断,如果同一EXTI_Line同时使能多个GPIO外部中断,最后使能的GPIO外部中断有效,之前的被覆盖,无效,这点在产品设计中需要特别注意。
1.2.4 引脚复用
每个GPIO引脚都支持复用功能,凡是需要占用GPIO引脚的外设,在使用时都应该先进行引脚复用配置,配置成对应的复用功能。
备注: 1.为什么外设复用到特定引脚后再次复用到另外的引脚,功能异常? 同一个外设不能同时复用多个相同功能的GPIO引脚,必须先复位已经复用功能的GPIO引脚,然后复用当前期望的GPIO引脚。如:UART6 TX已经复用到PE10,现在期望复用到PA14,那么应该先复位PE10为GPIO,然后将PA14配置成复用功能UART6 TX。
1.2.5 休眠唤醒
MCU进入休眠之后,GPIO产生外部中断可将MCU唤醒。在Sleep模式、Stop模式、StopLite模式下,配置GPIO外部中断皆可将MCU唤醒,但在Standby模式下,配置GPIO外部中断无法唤醒MCU,这是因为在Standby模式下,GPIO处于关闭状态,引脚电平由外部电路决定。在Standby模式下,除RTC与SPM外,其他所有数字模块均被断电,所以,只有RTC与NMI可唤醒MCU。 在进入休眠模式之前,需要对唤醒源进行配置。在ATC_AC781x_ReferenceManual_CH第6章“系统电源管理”中有描述,在寄存器REG_EN_PERIPH_WAKEUP中使能期望的唤醒源,GPIO模块默认是使能状态。调用库SPM_EnableModuleWakeup(SPM_MODULE_GPIO)使能GPIO模块唤醒,就能将MCU从休眠模式中唤醒,Standby模式除外。
2 驱动库
2.1 bit-band驱动
能够通过GPIOx_OUT(n)对GPIO输出进行控制, 通过GPIOx_IN(n)读取GPIO输入引脚状态(x=A,B,C,D,E)。
备注: 1.为什么使用GPIOx_OUT无法控制对应引脚输出期望电平? 最大的可能性便是参数传递错误,为了便于说明,这里以将GPIO_PB0输出高电平举例,正确的写法是GPIOB_OUT(0),而不是GPIOB_OUT(GPIO_PB0)。引申,对于GPIOx_IN(n)同理。
2.2 寄存器驱动
3 例程介绍
3.1 总述
共5个子例程用以阐述GPIO的各种功能使用,包括通用输入输出,引脚复用,外部中断,外部中断休眠唤醒,NMI休眠唤醒。每个子例程对应一个宏定义,通过修改GPIO_SAMPLE_SEL选择不同的子例程。
3.2 例程功能概述
这里对宏USE_BITBAND_TO_ACCES解释一下,用来选择访问GPIO是通过bit-band还是寄存器,可任意设置为TRUE或FALSE,不影响任何功能。
欢迎各位坛友指正,后续会根据问题持续更新。
|
@curry97 :可以
楼主 你好 可以给下固件库手册吗