HPM6700系列芯片是上海先楫半导体推出的高性能国产MCU。本篇文章介绍HPM6700系列芯片GPIO的应用指南。
HPM6700系列芯片GPIO基本情况介绍
● 提供PA∼PZ共8 组最多195 个GPIO功能复用引脚,每组最多32个IO
● IO 支持 3V 和 1.8V 两种电压模式,分组供电
● IO 支持开漏控制、内部上下拉、驱动能力调节,内置施密特触发器
● 2个GPIO 控制器,供2个处理器独立操作
– 支持读取任意IO的输入或者控制IO的输出
– 支持IO 输入触发中断
● 2 个快速GPIO控制器FGPIO,作为处理器私有的IO快速访问接口
● 提供一个GPIO管理器,管理各GPIO控制器的IO控制权限
● 电源管理域专属IO PYxx 拥有专属GPIO 控制器和IO配置模块,支持低功耗模式下状态保持
● 电池备份域专属IO PZxx 拥有专属GPIO 控制器和IO配置模块,支持低功耗模式下状态保持
GPIO寄存器配置(IO控制器、GPIO控制器、GPIO管理器GPIOM )
IO控制器分类
1. 通用IO控制器IOC
控制通用IO(PA,PB,PC,PD,PE,PF)。
2. 电源管理域IO控制器PIOC
控制电源管理域IO(PY)。它的功能和通用IOC 一致,可以配置电源管理域 IO 的基本属性以及外设功能。
3.电池备份域IO控制器BIOC
控制电池备份域IO(PZ)。它的功能和通用IOC 一致,可以配置电池备份域 IO 的基本属性以及外设功能。
PIOC 和 BIOC 可以把电源管理域IO(PY)和电池备份域 IO(PZ)中的一个或者多个IO映射到系统电源域。之后,这些 IO 就可以由 IOC 控制。
当电源管理域 IO(PY)的外设复用功能由 PIOC 设置为 ALT3 时, IOC 针对该 IO 的配置生效,而 PIOC 的配置不再生效。
当电池备份域 IO(PZ)的外设复用功能由 BIOC 设置为 ALT3 时, IOC 针对该 IO 的配置生效,而 BIOC 的配置不再生效。
IO控制器:外设复用功能选择寄存器FUNC_CTL
通过 IOC 的 IOC_X_FUNC_CTL 寄存器配置 IO 的外设功能。
1. 输出回送功能:可在输入端读取到输出信号。
2. 模拟功能:用作模拟外设的引脚,如 ADC, ACMP 等。
3. 外设功能复选器:选择映射到这个 IO 上的外设功能。
位域 | 名称 | 描述 |
16 | LOOP_BACK | 输出回送开关 |
8 | ANALOG | 引脚切换至模拟输入输出功能开关 |
4-0 | ALT_SELECT | 外设复用功能映射选择 |
IO控制器:PAD 性能配置寄存器PAD_CTL
用户可以通过 IOC_X_PAD_CTL 寄存器,配置任意 IO 的基本属性。
1. 工作电压设置:指定 IO 的工作电压,本产品的 IO 支持 3.3V 和 1.8V 两种工作电压。
2. 开漏选择:用户可以把 IO 配置成开漏输出(open drain)。如果 IO 配置成开漏输出,那么输出低电平时,正常输出;输出高电平时, IO 不会驱动高电平,而是输出高阻,需要用户配置外部上拉电阻。
3. 施密特触发器:用户可以打开 IO 的输入施密特触发器,即打开输入滞回(hysteresis),增加抗干扰能力。
4. 内部的上下拉电阻:即可以配置成内部上拉,也可以配置成下拉。
5. 配置驱动强度
位域 | 名称 | 描述 |
14 | MS | 引脚供电电压选择, 此位只对高速引脚可用 |
13 | OD | 开漏输出开关 |
12 | SMT | 输入施密特触发器使能, 此位只对高速引脚可用 |
11 | PS | 内部上下拉电阻选择 |
4 | PE | 内部上下拉功能开关 |
2-0 | DS | 驱动强度选择: |
GPIO控制器:分类
1. 2 个 GPIO 控制器(GPIO0, GPIO1)
控制通用 IO(PA, PB, PC, PD, PE, PF),支持配置 GPIO 中断
2. 2 个快速 GPIO 控制器(FGPIO0, FGPIO1)
控制通用 IO(PA, PB, PC, PD, PE, PF),不支持配置 GPIO 中断
3. 电源管理域 GPIO 控制器(PGPIO)
控制电源管理域 IO(PY),支持配置 GPIO 中断
4.电池备份域 GPIO 控制器(BGPIO)
控制电池备份域 IO(PZ),支持配置 GPIO 中断
经过适当的 PIOC 和 IOC 配置, 2 个 GPIO 控制器 GPIO0, GPIO1 和 2 个快速 GPIO 控制器 FGPIO0, FGPIO1可以控制电源管理域 IO(PY)和电池备份域 IO(PZ)。
GPIO控制器:控制相关寄存器
1. OE寄存器:配置IO输入。该位置 1 对应的IO 配置为 GPIO 输出,反之该 IO 即为 GPIO 输入
2. DO 寄存器 :配置 GPIO 的输出
3. 输出高寄存器SET:对应位置 1,会把对应 IO 输出置高;置 0 则 IO 输出不变
4. 输出低寄存器CLEAR :对应位置 1,会把对应 IO 输出置低;置 0 则 IO 输出不变
5. 翻转寄存器TOGGLE :对应位置 1,会把对应 IO 输出翻转;置 0 则 IO 输出不变
6. DI 寄存器:读取 IO 的电平状态
GPIO控制器:中断相关寄存器
1. IE 寄存器:中断使能,对应位置 1 就可以使能对应 IO 的中断。
2. TP 寄存器:中断类型,对应位置 1,表示中断由边沿触发,对应位置0,表示中断由电平触发。
3. PL 寄存器:中断极性,对应位置 1,表示中断由下降沿或者低电平触发,对应位置 0,表示中断由上升沿或高电平触发。
4. IF 寄存器:查询中断状态,对应标志位置 1,表示对应 IO 有中断待处理。对标志位写 1,可以清除这个标志位。
GPIO 管理器 GPIOM: GPIOxASSIGNy寄存器
1. SELECT 位域
选择这个 IO 受到哪个 GPIO 控制器控制。
2. HIDE 位域
由 4 个 HIDE 位组成,每一位置 1,即表示这个 IO 的输入在对应的GPIO 控制器 DI 寄存器内不可见,即GPIO 控制器无法读取到这个 IO 的输入。
3. LOCK 位
锁定这个 IO 的对应寄存器。一旦置 1,这个寄存器的配置直到下次复位前都不能再更改。
4. NON_SEC 位
按照系统安全状态进行访问权限控制。一旦置 1,寄存器只能在安全状态下访问。
位域 | 名称 | 描述 |
31 | LOCK | 锁定该寄存器的设置,锁定后无法解锁,锁定只能由复位清零 |
11-8 | HIDE | 引脚状态对 GPIO 可见 |
1-0 | SELECT | 选择引脚控制来源 |
基于SDK创建GPIO工程:基于HPM6750EVK2
GPIO例程功能:检测Button对应的GPIO中断,翻转Led。
int main(void)
{
board_init();
board_init_gpio_pins();
printf("gpio example\n");
#ifdef BOARD_LED_GPIO_CTRL
test_gpio_toggle_output();
#endif
test_gpio_input_interrupt();
while (1);
return 0;
}
LED配置为IO输出
#define IOC_PB12_FUNC_CTL_GPIO_B_12 IOC_PAD_FUNC_CTL_ALT_SELECT_SET(0)
功能复用为ALT0,对应GPIO功能。
配置为GPIO输出。
Button配置为IO输入和中断
PZ为控制电池备份域IO,BIOC配置为ALT3。改为IOC控制。
#define IOC_PZ02_FUNC_CTL_GPIO_Z_02 IOC_PAD_FUNC_CTL_ALT_SELECT_SET(0)
#define IOC_PZ02_FUNC_CTL_SOC_PZ_02 IOC_PAD_FUNC_CTL_ALT_SELECT_SET(3)
配置GPIO输入:
配置GPIO输入中断
程序运行效果:
系统上电LED翻转5次,LED灯状态off。
按下SW1,LED灯状态翻转,点亮LED。
基于Pinmux Tool修改GPIO配置
此部分介绍如何通过Pinmux Tool对任意GPIO进行配置,实现所需要的功能。我们此处以将HPM6750EVK2上面的PE30配置为GPIO输出为例。
将Pinmux Tool生成的代码拷贝到gpio初始化函数。
手写电平翻转代码到中断处理函数中。
程序运行效果:通过按键SW1,翻转PE30的电平。