【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次,发文人进小黑屋喔~

评论