GPIO
文章目录
1. 功能描述
特殊功能引脚 | 优先级 |
---|---|
HSEIN/HSEOUT | 高于 GPIO 功能 |
VRTCAFx | 高于 GPIO 功能 |
1.1 OSCI/OSCO 引脚
具备该功能引脚:【PA.15-OSCI功能 、 PA.14-OSCO功能】
打开OSCI/OSCO 功能方法:使能 OSC 时钟时,PA.15 和 PA.14 强制为 OSCI/OSCO 使用
使能 OSC 时钟方式:通过 RTC 模块的寄存器 RTCDCFG.OSC_EN来使能 OSC 时钟
# OSC_EN:OSC时钟使能控制位
0:关闭OSC时钟模块(default)
1:使能OSC时钟模块
注:在 OSC_EN 寄存器写 0 的同时,硬件会将 OSC_DET_EN 寄存器也配置为0,OSC 停振检测电路关闭。
功能
OSC_EN_A:控制 PA.15 和 PA.14 是否选择为 OSC 功能
OSC_BYPASS:屏蔽 OSC_EN_A 对 PA.14 的选择逻辑
控制信号 | 引脚状态 | ||
---|---|---|---|
OSC_EN_A | OSC_BYPASS | PA.15/OSCI | PA.14/OSCO |
0 | X | PA.15 | PA.14 |
1 | 1 | OSCI | PA.14 |
1 | 0 | OSCI | OSCO |
1.3 HSEIN/HSEOUT引脚
具备该功能引脚:【PA.10 和 PA.9】,PA.10为HSEIN功能,PA.9为HSEOUT功能
开启方式:使能HSE 时钟振荡器,通过 CMU 模块的寄存器 CLKCTRL0.HSE_EN 来使能 HSE 时钟振荡器。
若在使能 HSE 时钟振荡器时 HSE_BYP = 1,则只有 PA.10强制为 HSEIN 功能,PA.9 仍作为通用 I/O 使用,此时推荐将 PA.9 配置为模拟态。
# HSE_EN HSE 时钟振荡器使能位
0:关闭 HSE 时钟模块(Default)
1:使能 HSE 时钟模块
# HSE_BYP HSE 旁路配置
0:振荡器模式(Default)
1:旁路 HSE 振荡器,采用外部时钟输入
HSEIN/HSEOUT 引脚的说明:
说明:
# 信号控制
HSE_EN_D :是HSE 时钟的使能控制信号,用于控制PA.10 和PA.9 是否选择为HSE 功能
HSE_BYPASS_D :用于屏蔽HSE_EN_D 对PA.9 的选择逻辑
# 配置
配置HSE_EN_D = 0,HSE_BYPASS_D配置无效,此时PA.10和PA.9为通用I/O
配置HSE_EN_D = 1,HSE_BYPASS_D = 0,此时PA.10为HSEIN,PA.9为HSEOUT
配置HSE_EN_D = 1,HSE_BYPASS_D = 1,此时PA.10为HSEIN,PA.9为通用I/O
1.2 Bit-Band
位段功能是通过 两个区域 寄存器别名区(32MB)和寄存器区(1MB),通过寄存器的位与寄存器别名区地址的映射关系获取到寄存器别名区中的映射地址,将其 bit0 写 1 或置为 0 来达到相应的控制效果。
映射关系:SFR_Alias_addr = SFR_Alias_Base_addr + ( byte_offset × 32 ) + ( bit_number × 4 )
备注:计算得到 SFR_Alias_addr 后,将其 bit0 写 1 或清 0 即可达到操作对应寄存器位的效果。
示例:见SPEC
1.4 VRTCAFx引脚
具备该功能引脚:【PC.15 、 PG.15】
功能:ADCIN 使用、用来检测入侵或时间戳事件、或作为 RTC_ALARM 或 TOUT 输出
打开 VRTCAFx 功能方法:通过 RTC 模块下的控制寄存器RTCAFSEL.AFx_SEL
# RTCAFSEL.Afx_SEL[2:0]功能
000:GPIO(default)
001:ADCIN3
010:STAMP1
011:IVD1
100:TOUT (不带高频补偿)
101:ALARM_PP
110:ALARM_OD
其他:高阻
测试各RTCAFx对应的GPIO控制信号是否固定(控制来源选择是否正确),不会受到GPIO模块寄存器的影响(GPIO模块的PTDAT
和PTRD需要接收RTCAFx的电平状态,但PTDAT无控制效果)
理解:操作引脚状态的信号来源非PTDAT和PTRD操作,通过【模拟态、输入浮空、推挽输出…】来判断复用功能是否配置正确
1.5 EWKUPx引脚
# 具备功能的引脚
PD.0、PD.8、PD.9、PD.12
开启:通过 PMU 模块的寄存器控制位 SDYCFG.EWKUPx_EN 配置
1.6 QSPI0 引脚
具备该功能引脚:【PC.2、PC.3、PC.9、PD.4、PD.5 和 PD.6】
功能:扩展 Flash 控制器
开启方式:芯片通过自加载启用扩展 Flash 控制器后,用于内封的引脚将被强制锁定为 QSPI0 复用功能
1.7 LVDIN引脚
具备该功能引脚:【PE.7、PG.5、PA.11、PE.8、PG.1】
开启方式:
LVDINxP 功能:通过 PMU 模块的控制寄存器 PMUCON.LVDINx_EN 开启和关闭
LVDINxN 功能:通过 PMU 模块的控制寄存器 PMUCON.LVDINx_EN 和 LVDINSEL.LVDINNx_SEL 开启和关闭
备注:
引脚开启和关闭 LVDIN 功能时,GPIO 模块寄存器的控制效果仍然有效。因此在使用 LVDIN 功能时,应将对应引脚配置为 模拟态,避免引脚上的数字功能影响 LVDIN 功能的正常使用。
LVDIN引脚:
1)模块关闭时确认ANALOG_EN = 0
2)模块开启时确认ANALOG-EN = 1(LVDINxP需要确认还受到LVDINNx_SEL控制)
3)模拟VDD1P2掉电的状态,ANALOG-EN确认保持前序状态。
1.8 SARADC引脚
# 具备SARADC功能引脚
PD.1、PD.2、PD.3、PD.8、PD.9、PD.10、PD.11、PD.12、PD.13、PD.14、PD.15、PG.11、PG.12、PG.13、PG.14
# 同时具备SARADC功能和EWKUP功能的引脚
PD.8、PD.9、PD.12
开启方式:引脚配置为模拟态时,可通过SARADC模块下的控制寄存器(SARCON.SARON = 1)开启和关闭引脚的 SARADC 功能。
# SARON SAR ADC 模块开关控制位
0:ADC 禁止转换&掉电状态(default)
1:ADC 可以转换&上电状态
备注:
当芯片进入 STANDBY 模式或 VCC 掉电时,引脚将强制进入高阻态,SARADC功能不可用。
1.9 ADCIN引脚
具有功能的引脚:【PA.12、PA.13】
开启方式:引脚配置为模拟态,配置TBS 模块下的控制寄存器TBSCON.ADC0\1En开启和关闭的ADCIN0\1通道
备注:
当芯片进入STANDBY模式或VCC掉电时,引脚将强制进入高阻态,ADCIN0/1功能不可用。
2. 测试项描述
2.1 PAD Location
1.配置输入上拉后,依次接地, 可查询对应引脚的数据寄存器 是否从高到低,可判断引脚是否对应;
2.电源引脚:输入一个vcc,管脚3.3v,其它的vcc管脚测量应该也是3.3v,内部是连在一起的;
3.GND判断:首先电压测量0,然后测试管脚连通性,内部GND是相连接的
PIN和PAD的区别:
PIN:PIN指芯片封装好后的管脚,即用户看到的管脚;
PAD:PAD是硅片的管脚,是封装在芯片内部的,用户看不到。
PAD到PIN之间还有一段导线连接的。
2.2 LBOR和BOR复位
PMU模块:
LBOR上电
(1) 快速上电,上电时间接近 10us 量级
主要场景为电池焊接和电池可更换
(2) 慢速上电,上电时间超过 s 级
主要场景为 vcc 外挂大电容,及 vbat 外挂大电容(钜华客户,1000uF)
BOR复位
辅助 LBOR 和 POR,档位可调,可以抬高工作电压的安全范围,增加可靠性
1)快上电标准:由于POROP8会在LBOR发生后大约3ns左右释放,因此测试上电速度仅测试<100us(实测80us)
2)慢上电标准:0~3.3V,STEP=20.4969mV,SPEED=MED,上电时间约1.58s
黄线是VCC,蓝线是GPIO
PH.10:TMS/SWIO功能,引脚处于输入上拉状态
PC.12:TCK/SWCLK功能,引脚处于输入上拉状态
PC.13:TDI功能,引脚处于输入上拉状态
PB.14:TDO功能,引脚处于输出浮空状态
PB.15:NJTRST功能,SWCLK功能被禁用,引脚处于输入上拉状态
PB.13:SWIO功能被禁用,引脚处于输入上拉状态
LBOR复位前:高阻
LBOR复位后至BOR复位前:普通IO为高阻, SWD/JTAG:SWD/JTAG功能
BOR复位后:普通IO为高阻, SWD/JTAG:SWD/JTAG功能
2.3 驱动能力
基本模拟性能:
VCC供电3.3V:
状态 | 验证方式 |
---|---|
高阻态/模拟态 | IO外接0V、1.65V、3.3V,测试通过IO的电流 |
输入上拉 | IO外接0V,测试通过IO的电流 |
输入下拉 | IO外接3.3V,测试通过IO的电流 |
输入浮空 | IO外接0V、1.65V、3.3V,测试通过IO的电流 |
开漏输出高 | IO外接0V、1.65V、3.3V,测试通过IO的电流 |
开漏输出低 | IO外接0.1VCC,测试IO通过的电流 |
推挽输出高 | 该测试项在驱动能力验证时覆盖验证 |
推挽输出低 | 该测试项在驱动能力验证时覆盖验证 |
驱动能力测试:
Isource能力-拉电流(输出电流):指的是从芯片流向负载的电流
Isink能力-灌电流(吸收电流):指的是流入芯片内部的电流
2.4 模拟态\高阻态
除特别说明的I/O,其他双向I/O的默认态和复位态为模拟态。
IO 功能 | IOCFG.MODx[1:0] | AFCFGx.PTAFx[3:0] |
---|---|---|
复用功能-高阻态 | 10b | 选择没有定义复用功能 |
模拟态-模拟功能 | 11b | X |
高阻态:在配置为复用功能,但是选择没有定义复用功能时为高阻态
模拟态:通过IOCFG寄存器配置为模拟态,具备模拟功能的引脚为模拟态,若对应引脚没有模拟功能,此时引脚呈高阻态。
高阻态:数字电路常见术语,指的是电路的一种输出状态,既不是高电平也不是低电平,如果高阻态再输入下一级电路的话,对下级电路无任何影响,和没接一样,如果用万用表测的话有可能是高电平也有可能是低电平,随它后面接的东西定
2.5 SWD\JTAG
PH.10、PC.12、PC.13、PB.14、PB.15、PB.13的默认态和复位态为JTAG/SWD 功能
# 1.SWD的通信判断标准为通过Jlink获取CORE_ID,能够获取成功则说明能够进行SWD通信
@connection_required
def core_id(self):
"""Returns the identifier of the target ARM core.
Args:
self (JLink): the ``JLink`` instance
Returns:
Integer identifier of ARM core.
"""
return self._dll.JLINKARM_GetId()
# 2.Jlink的连接方式
class JLinkInterfaces(object):
"""Target interfaces for the J-Link."""
JTAG = 0
SWD = 1
FINE = 3
ICSP = 4
SPI = 5
C2 = 6
复用优先级:
- 为保证调试端口正常使用,SWIO/SWCLK 功能具有复用优先级。
- 当优先级高的引脚被配置为JTAG/SWD功能时,优先级低的引脚上对应的SWD功能会被禁用;如果想使用优先级低的引脚上的 SWD 功能,需要先将优先级高的引脚配置为非 JTAG/SWD 功能;
- TEST = 0时,PB.13和PB.15会强制为SWD引脚,PH.10 和PC.12 上的SWD功能会被禁用,此时复用优先级规则无效。(详见章节“调试引脚的说明”)
SWIO | SWCLK | |
---|---|---|
优先级高 | PH.10 | PC.12 |
优先级低 | PB.13 | PB.15 |
复用功能组合测试:
由于只测试为SWD功能,则只复用为SWIO和SWCLK,只选择了AF0的复用功能组合。
示例:
备注:当TEST=1时,PH.10和PB.13同时复用SWIO,则优先级高的可以通讯,优先级低的不可通讯
在测试CASE3的时候,Case3里,PC.12没有配置为SWD功能,所以不能通讯,PB.15可以通讯呢
仿真器功能连接图:
2.6 输出转换时间/翻转速度
翻转50MHZ的计算方式:
50Hz的周期T=1/F=0.02s。即20ms。
周期由重复性的 正脉冲+负脉冲 构成,方波 的正脉冲宽度=负脉冲宽度。所以:
方波的脉冲宽度=T/2=10ms,即 每10ms 取反一次 IO口,即可输出 50Hz方波
2.7 静态特性
在数字电路中,定义输入电压值高于某一阈值时,称之为输入高电平(VIH),当输入电压值低于某一阈值,称之为输入低电平(VIL)
# IO翻转电平
# 1.TEST和RESET
VIH = 0.8VCC,VIL = 0.2VCC
# 2.BOOT0:
VIH = 0.8VCC,VIL = 0.1VCC
# 3.通用I/O
VIH = 0.7VCC,VIL = 0.2VCC
2.8 模拟滤波
部分引脚具有50ns的模拟滤波,模拟滤波功能默认关闭,通过寄存器控制开启,该滤波为双沿滤波。
# 具备模拟滤波功能的IO
PA.3、PA.4、PA.7;
PB.3、PB.4、PB.10、PB.11、PB.12;
PC.0、PC.1、PC.4、PC.7、PC.12;
PD.2、PD.3、PD.8、PD.9、PD.10、PD.11、PD.12;
PE.0、PE.2、PE.4、PE.5、PE.10、PE.14;
PG.7、PG.9、PG.11;
PH.0、PH.4、PH.7、PH.8
手动测试方式:
1.将PC.5配置为输入模式
2.将PD.5配置为输出模式
3.将PC.5的PTDAT值赋值给PD.5,判断PD.5的引脚电平,如果低电平则滤波生效,高电平则不具备模拟滤波
// 配置脉冲方式
HT_CMU->WPREG = 0xA55A;
HT_CMU->CLKCTRLO = CMU_CLKCTRLO_HPLLEN;
HT_CMU->HPLLCFG Ox019A0002; //M=110011010b, D=000b, SRC=0b, N=000010b
HT_FLASH->FLASHCFG= 0x010F; //7T,high speed
Delay_Time (OxFFFF);
HT_CMU->SYSCLKCFG = 0x83;
2.9 复位级别测试
复位级别见复位SPEC
CMU模块相关复位寄存器:
CMU模块AHBRST寄存器(AHB 模块复位寄存器,写保护),该寄存器相关GPIOX_RST的值变为复位状态【0:不复位(Default)
1:复位】
2.10 基本模拟性能
引脚电平测试:
默认态测试说明:
除特别说明的I/O,其他双向I/O的默认态和复位态为模拟态,呈现高阻态
特殊IO:
PH.10:TMS/SWIO功能,引脚处于输入上拉状态
PC.12:TCK/SWCLK功能,引脚处于输入上拉状态
PC.13:TDI功能,引脚处于输入上拉状态
PB.14:TDO功能,引脚处于输出浮空状态
PB.15:NJTRST功能,SWCLK功能被禁用,引脚处于输入上拉状态
PB.13:SWIO功能被禁用,引脚处于输入上拉状态
TEST:输入上拉
/RST:输入上拉
测试高阻态的方法是:
对IO外灌0~VCC的电压,IO上应该不会有超过100nA的电流
同时IO浮空的时候,应该呈现一个接近0V的不稳定状态,翻转相邻的IO时,高阻态的IO可以看到一个同频的抖动,但是接到固定电平上时,第一IO上电流不超过100nA,第二IO会呈现固定电平,没有抖动
状态 | 状态 |
---|---|
输入上拉 | 默认电平=高电平,大于3V则判断成功,PTDAT=外部输入,PTRD=外部输入 |
输入下拉 | 默认电平=低电平,等于0V则判断成功,PTDAT=外部输入,PTRD=外部输入 |
输入浮空 | 默认电平=floating,无法判断,只能记录测量值用于参考 |
推挽输出高+浮空 | 默认电平=高电平,大于3V则判断成功 |
推挽输出低+浮空 | 默认电平=低电平,等于0V则判断成功 |
开漏输出高+浮空 | 默认电平=高电平,大于3V则判断成功 |
开漏输出低+浮空 | 默认电平=低电平,等于0V则判断成功 |
推挽输出高+上拉 | 默认电平=高电平,大于3V则判断成功 |
推挽输出低+上拉 | 默认电平=低电平,等于0V则判断成功 |
开漏输出高+上拉 | 默认电平=高电平,大于3V则判断成功 |
开漏输出低+上拉 | 默认电平=低电平,等于0V则判断成功 |
模拟态测试说明:
通过IOCFG寄存器配置为模拟态,具备模拟功能的引脚为模拟态,若对应引脚没有模拟功能,此时引脚呈高阻态。
具备模拟功能的IO:
0SCI/0SC0引脚: 【PA.15-OSCI功能 、 PA.14-OSCO功能】
VRTCAFx引脚:【PC.15 和PG.15】
EWKUPx引脚:【PD.0、PD.8、PD.9 和PD.12】
HSEIN/HSEOUT引脚:【PA.9、PA.10】
QSPI0(内封)引脚:【PC.2、PC.3、PC.9、PD.4、PD.5 和 PD.6】
LVDIN引脚:【PE.7、PG.5、PA.11、PE.8、PG.1】
ADCIN引脚:【PA.12、PA.13】
SARADC引脚:【PD.8 PD.9 PD.12】
3.寄存器控制
3.1 寄存器功能
寄存器名称 | 功能 | 读写 |
---|---|---|
PTDAT(端口数据寄存器) | 输入模式:读取IO高低电平 输出模式:对IO输出高低电平 | R/W |
PTRD(端口输入数据寄存器) | 读取IO高低电平 | R |
PTUD(端口上拉/下拉配置寄存器) | 00:禁止上拉/下拉(Default) 01:使能上拉 10:使能下拉 11:Reserved(To Design:禁止上拉/下拉) | R/W |
PTSET(端口置位寄存器) | 将对应的端口输出高电平 | W |
PTCLR(端口复位寄存器) | 将对应的端口输出低电平 | W |
PTTOG(端口翻转寄存器) | 使对应的端口输出电平发生翻转 | W |
PTOD(端口开漏功能配置寄存器) | 配置推挽和开漏功能 | R/W |
AFCFG0(端口复用功能选择寄存器 0) | 复用功能 | R/W |
AFCFG1(端口复用功能选择寄存器 1) | 复用功能 | R/W |
PTSPD(端口输出速度配置寄存器) | 输出速度配置为高速模式 | R/W |
PTLOCK(端口锁定寄存器) | 对目标引脚进行上锁 | R/W |
3.2 锁定寄存器
# LOCK 写序列 (上锁流程)
写入 LOCK[16] = ‘1’ + LOCK[15:0]
写入 LOCK[16] = ‘0’ + LOCK[15:0]
写入 LOCK[16] = ‘1’ + LOCK[15:0]
备注:
1.读2次 LOCK[31:0] 后才能获取锁定寄存器的相应的锁定的值
2.如果 LOCK[15:0] 都为0,则没有引脚锁定,控制位也不会置为1
3.锁定操作时,可以修改目标IO的寄存器的值
Jlink复位RST引脚的函数:
# Sets the reset pin low.
jlink.set_reset_pin_low()
# Sets the reset pin high.
jlink.set_reset_pin_high()