一、汇编启动代码添加 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]
评论