E3430 GPIO 有分为 Safety & AP 阈,所以不同 GPIO 的地址也不一样,需要按照实际的的基地址进行计算,并且,GPIO 引脚的定义,是从 0 递增,对于不同基地址的 GPIO ,也需要区别计算引脚的寄存器地址。
这里介绍以 MCAL3.0 为例,结合代码和技术参考手册说明,不同阈下,GPIO 寄存器的计算方式。
从芯驰官网下载最新技术参考手册,查看《E3400_E3600_MCU_TRM_Rev00.13.pdf》中的 Memory map 章节,如下图所示,可以看到 GPIO 有两个不同的基地址。
查看参考手册,确认 IO 口功能复用的基地址:如下图
IOMUXC_SAFETY
Start Addr | End Addr | Size | Allocation | E3648 | E3640 |
F063_0000 | F063_FFFF | 64KB | IOMUXC_SAFETY | Y | Y |
IOMUXC_AP
Start Addr | End Addr | Size | Allocation | E3648 | E3640 |
F30E_0000 | F30E_FFFF | 64KB | IOMUXC_AP | Y | Y |
其中 IOMUX 相关的寄存器如下:
Name | Offset | Description |
PAD_CONFIGn (0≤n≤1) (page 5508) |
0x1000 + (n * 0x4) | IO PAD config register |
MUX_CONFIGn (0≤n≤1) (page 5509) |
0x2000 + (n * 0x4) | pin mux config |
INPUT_SELECTn (0≤n≤1) (page 5510) |
0x3000 + (n * 0x4) | input source select |
从上表中可以看到有计算公式,那么 其中的 n 的数据是多少呢 ?
这里的 n 代表的是具体的某个引脚的定义数值计算得来,需要通过这个引脚的定义进行计算:如下:
查找 Pin ID list in Port_Hw_E3_PinCtrl.h 定义 GPIO 的具体数值 Channel ID,因此用户知道需要配置的 GPIO 具体引脚的定义值 Channel ID,那么根据代码中的配置计算公式:可以很快计算出 n = Channel ID - SF_PinStart 或者 n = Channel ID - AP_PinStart , 其中 PinStart 是 0 ; AP_PinStart 是 135,这两个阈开始的引脚定义参考下面罗列的定义。
Port0: channel ID 0-31 (32 bit)
Port1: channel ID 32-63 (32 bit)
Port2: channel ID 64-95 (32 bit)
Port3: channel ID 96-127 (32 bit)
Port4: channel ID 128-134 (7 bit)
Port5: channel ID 135-166 (32 bit)
Port6: channel ID 167-198 (32 bit)
Port7: channel ID 199-213 (15bit)
Note:
For Port0-4, these lO are in GPIO SAF
For Port5-7, these lO are in GPIO AP
因此 配置 IO_MUX 寄存器的地址:不同阈的基地址 + 偏移计算公式 ,具体该寄存器的配置数据值,看参考手册的介绍即可。
查看参考手册 Memory map 章节,找到 GPIO 引脚参数的寄存器基地址如下:
GPIO_SAFETY & GPIO_AP
Start Addr | End Addr | Size | Allocation | E3648 | E3640 |
F074_0000 | F074_FFFF | 64KB | GPIO_SAFETY | Y | Y |
F312_0000 | F312_FFFF | 64KB | GPIO_AP | Y | Y |
其中 GPIO 相关的寄存器如下:(部分,未写全)
Name | Offset | Description |
DOM_PER0n (0≤n≤7) (page 1995) |
0x0 + (n * 0xc) | This register is used for to control domain0~3 secure and priviledge access permission. |
DOM_PER1n (0≤n≤7) (page 1997) |
0x4 + (n * 0xc) | This register is used for to control domain4~7 secure and priviledge access permission. |
DOM_PER_LOCKn (0≤n≤7) (page 1999) |
0x8 + (n * 0xc) | This register is used to lock domain access permission setting. |
SGPIO_GPIO_DGSELn (0≤n≤127) (page 2000) |
0x140 + (n * 0x4) | SGPIO GPIO DGPIO ALLOCATION REGISTER |
GPIO_OENn (0≤n≤3) (page 2000) |
0x580 + (n * 0x10) | GPIO OUTPUT ENABLE REGISTER |
GPIO_OEN_SETn (0≤n≤3) (page 2000) |
0x584 + (n * 0x10) | GPIO OUTPUT ENABLE SET REGISTER |
GPIO_OEN_CLRn (0≤n≤3) (page 2001) |
0x588 + (n * 0x10) | GPIO OUTPUT ENABLE CLEAR REGISTER |
GPIO_OEN_TGLn (0≤n≤3) (page 2001) |
0x58C + (n * 0x10) | GPIO OUTPUT ENABLE TOGGLE REGISTER |
用户需要配置 GPIO 引脚的参数,涉及到的寄存器地址的计算公式,主要就是偏移量的计算,其中上表中的 n 与之前的计算稍微有差别,
这里的 n = (Channel ID - SF_PinStart)/32 或者 n = (Channel ID - AP_PinStart)/32 , 其中 PinStart 是 0 ; AP_PinStart 是 135。
注意:
GPIO 的各个配置寄存器中,里面存在配置引脚输入输出电平信号的,整个寄存器 32 位,对应的是相应的引脚,此时,对于具体某个引脚,该引脚的电平信号是位于那寄存器的哪一位,还是存在计算的公式去计算 MASK 的数值。
MASK = 1 << (Channel ID - SF_PinStart)% 32) , 其中 PinStart 是 0 ; AP_PinStart 是 135 ;
其他外设的地址查找方法也是同上,先查找 Memory map 的基地址,再者查找具体的寄存器,寄存器就存在偏移地址的计算,以及寄存器需要配置的数值,数值同样按照参考手册的介绍或者存在计算公式进行计算即可。
1、手册《E3400_E3600_MCU_TRM_Rev00.13.pdf》
2、代码 SemiDrive_E3_MCAL_Pkg_v3.0_01_19.exe
登录大大通,了解更多详情,解锁1500+完整应用方案,更有大联大700+FAE在线答疑解惑!