一、匯編啟動代碼添加 IO 翻轉代碼作用
-
測量代碼啟動時間
-
定位代碼出現 bug 問題
二、匯編啟動代碼添加 IO 翻轉代碼配置說明
概述:
這裡舉例子說明 E3430 如何配置 GPIO 引腳,使用到的 匯編指令有做解釋。
只要簡單配置 GPIO 引腳功能,輸出使能,GPIO 引腳配置輸出高低電平即可,其他的配置按照默認即可。
-
確定使用到的 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
-
查找 IO MUX 配置基地址和寄存器:
首先在參考手冊 memory map 中找到對應的 IO 的 MUX 的基地址地址:0xF0630000
GPIO 寄存器基地址:0xF0740000
IOMUXC_SAFETY
F063_0000 | F063_FFFF | 64KB | IOMUXC_SAFETY | Y | Y |
F074_0000 | F074_FFFF | 64KB | GPIO_SAFETY | Y | Y |
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 |
Description: pin mux config • Size: 32 • Offset: 0x2000 + (n * 0x4), (0≤n≤1)
31 | 30 | 29 | [28:26] | [25:10] | [9:8] | [7:5] | 4 | [3:0] |
DO_FORCE_VALUE | DO_FORCE_EN | FV | RESERVED | FIN_IP | FIN | RESERVED | ODE | MUX |
計算 GPIO_H1 配置 MUX 寄存器的地址,主要配置 GPIO_H1 為 GPIO 功能 0x74 = 116U
基地址 + 0x2000 +(n * 0x4) = 0xF0630000 + 0x2000 +(0x74 * 0x4)
所以配置的地址為 : 0xf06321d0
配置 MUX [3:0] 為 0 即選擇 GPIO 功能
-
配置 GPIO 寄存器參數需要在參考手冊查找 Peripherals -> SGPIO
配置 GPIO OUTPUT ,配置 GPIO 引腳高低電平
Name | Offset | Description |
GPIO_OENn (0≤n≤3) |
(page 2000)
(page 2003)
(page 2003)
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
Bit | Field | R/W | Reset | Description |
31:0 | OEN | RW | 0x0 | Output 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 引腳置高
Bit | Field | R/W | Reset | Description |
31:0 | DOUT | RW | 0x0 | Atomic 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
Bit | Field | R/W | Reset | Description |
31:0 | DOUT | RW | 0x0 | Atomic 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
-
對應的匯編語句如下
/*配置 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]
評論