一、匯編啟動代碼添加 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) 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)
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)
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)
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]
|