【SemiDrive】GPIO SAFETY & AP 配置地址的计算

一、概述

E3430 GPIO 有分为 Safety & AP 阈,所以不同 GPIO 的地址也不一样,需要按照实际的的基地址进行计算,并且,GPIO 引脚的定义,是从 0 递增,对于不同基地址的 GPIO ,也需要区别计算引脚的寄存器地址。


这里介绍以 MCAL3.0 为例,结合代码和技术参考手册说明,不同阈下,GPIO 寄存器的计算方式。


二、查看手册确定地址

从芯驰官网下载最新技术参考手册,查看《E3400_E3600_MCU_TRM_Rev00.13.pdf》中的 Memory map 章节,如下图所示,可以看到 GPIO 有两个不同的基地址。

1、配置 GPIO 口,首先配置 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 寄存器的地址:不同阈的基地址 + 偏移计算公式 ,具体该寄存器的配置数据值,看参考手册的介绍即可。


2、配置 GPIO 引脚的其他具体参数

查看参考手册 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在线答疑解惑!

你可能感兴趣的:(单片机,嵌入式硬件,大大通,人工智能,服务器)