【SemiDrive E3】匯編啟動代碼添加 IO 翻轉

一、匯編啟動代碼添加 IO 翻轉代碼作用

  1. 測量代碼啟動時間

  2. 定位代碼出現 bug 問題


二、匯編啟動代碼添加 IO 翻轉代碼配置說明

概述:
這裡舉例子說明 E3430 如何配置 GPIO 引腳,使用到的 匯編指令有做解釋。
只要簡單配置 GPIO 引腳功能,輸出使能,GPIO 引腳配置輸出高低電平即可,其他的配置按照默認即可。

  1. 確定使用到的 GPIO 引腳信息

例如 :GPIO_H1 ,
查找 Pin ID list in Port_Hw_E3_PinCtrl.h 定義為 116,are in GPIO SAF
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
For Port5-7, these lO are in GPIO AP

  1. 查找 IO MUX 配置基地址和寄存器:

首先在參考手冊 memory map 中找到對應的 IO 的 MUX 的基地址地址:0xF0630000
GPIO 寄存器基地址:0xF0740000
IOMUXC_SAFETY

F063_0000F063_FFFF64KBIOMUXC_SAFETYYY
F074_0000F074_FFFF64KBGPIO_SAFETYYY
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
 
Description: pin mux config • Size: 32 • Offset: 0x2000 + (n * 0x4), (0≤n≤1)

313029[28:26][25:10][9:8][7:5]4[3:0]
DO_FORCE_VALUEDO_FORCE_ENFVRESERVEDFIN_IPFINRESERVEDODEMUX
計算 GPIO_H1 配置 MUX 寄存器的地址,主要配置 GPIO_H1 為 GPIO 功能 0x74 = 116U
基地址 + 0x2000 +(n * 0x4) = 0xF0630000 + 0x2000 +(0x74 * 0x4)
所以配置的地址為 : 0xf06321d0
配置 MUX [3:0] 為 0 即選擇 GPIO 功能

  1. 配置 GPIO 寄存器參數需要在參考手冊查找 Peripherals -> SGPIO

配置 GPIO OUTPUT ,配置 GPIO 引腳高低電平

NameOffsetDescription
GPIO_OENn (0≤n≤3)

(page 2000) 0x580 + (n * 0x10) GPIO OUTPUT ENABLE REGISTER GPIO_DATA_OUT_SETn (0≤n≤3)
(page 2003)0x684 + (n * 0x10)GPIO DATA OUTPUT SET REGISTER GPIO_DATA_OUT_CLRn (0≤n≤3)
(page 2003)0x688 + (n * 0x10)GPIO DATA OUTPUT CLEAR REGISTER
GPIO_OENn • Description: GPIO OUTPUT ENABLE REGISTER • Size: 32 • Offset: 0x580 + (n * 0x10), (0≤n≤3)

[31:0]
OEN
Table 11.859: Field Description for GPIO_OEN

BitFieldR/WResetDescription
31:0OENRW0x0Output enable
計算 GPIO_H1 配置 GPIO_OENn 寄存器的地址
基地址 + 0x584 +(inddex pin / 32 *0x10) = 0xF0740000 + 0x584 +(116 / 32 * 0x10)
所以配置的地址為 : 0xf07405b4
所以配置這個寄存器的數據為 mask = 1 << (inddex pin % 32) 即 0x100000
GPIO_DATA_OUT_SETn • Description: GPIO DATA OUTPUT SET REGISTER • Size: 32 • Offset: 0x684 + (n * 0x10), (0≤n≤3)

[31:0]
DOUT
GPIO_DATA_OUT_SET GPIO 引腳置高

BitFieldR/WResetDescription
31:0DOUTRW0x0Atomic set operation for data output
計算 GPIO_H1 配置 GPIO_DATA_OUT_SET 寄存器的地址
基地址 + 0x684 +(inddex pin / 32 *0x10) = 0xF0740000 + 0x684 +(116 / 32 * 0x10)
所以配置的地址為 : 0xf07406b4
所以配置這個寄存器的數據為 mask = 1 << (inddex pin % 32) 即 0x100000
 
GPIO_DATA_OUT_CLRn GPIO 引腳清零 置低 • Description: GPIO DATA OUTPUT CLEAR REGISTER • Size: 32 • Offset: 0x688 + (n * 0x10), (0≤n≤3)

[31:0]
DOUT
Table 11.869: Field Description for GPIO_DATA_OUT_CLR

BitFieldR/WResetDescription
31:0DOUTRW0x0Atomic clear operation for data output
計算 GPIO_H1 配置 GPIO_DATA_OUT_CLRn 寄存器的地址
基地址 + 0x688 +(inddex pin / 32 *0x10) = 0xF0740000 + 0x688 +(116 / 32 * 0x10)
所以配置的地址為 : 0xf07406b8
所以配置這個寄存器的數據為 mask = 1 << (inddex pin % 32) 即 0x100000

  1. 對應的匯編語句如下

       /*配置 mux 為 gpio*/
ldr r1, =0xf06321d0 /*把地址 0xf06321d0 放到 r1*/
ldr r0, [r1] /*R1中代表存儲器地址,在存儲器中將R1地址處的數據加載到寄存器R0中。*/
bic r0, r0, #0xffffffff/*將 r0 全部清零,運算結果放到 r0*/
orr r0, r0, #0x0 /*將 r0 或上 0x0,運算結果放到 r0*/
str r0, [r1]/*STR 將寄存器 r1 的值存儲到內存地址 0xf06321d0 上。*/

/*配置 gpio output 方向*/
ldr r1, =0xf07405b4
ldr r0, [r1]
bic r0, r0, #0x100000
orr r0, r0, #0x100000
str r0, [r1]

/*配置 gpio output high*/
ldr r1, =0xf07406b4
ldr r0, [r1]
bic r0, r0, #0x100000
orr r0, r0, #0x100000
str r0, [r1]

/*配置 gpio output low*/
ldr r1, =0xf07406b8
ldr r0, [r1]
bic r0, r0, #0x100000
orr r0, r0, #0x100000
str r0, [r1]

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

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

評論