【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 AddrEnd AddrSizeAllocationE3648E3640
F063_0000F063_FFFF64KBIOMUXC_SAFETYYY

IOMUXC_AP

Start AddrEnd AddrSizeAllocationE3648E3640
F30E_0000F30E_FFFF64KBIOMUXC_APYY

其中 IOMUX 相關的寄存器如下:

NameOffsetDescription
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 AddrEnd AddrSizeAllocationE3648E3640
F074_0000F074_FFFF64KBGPIO_SAFETYYY
F312_0000F312_FFFF64KBGPIO_APYY
 

其中 GPIO 相關的寄存器如下:(部分,未寫全)

NameOffsetDescription
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

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論