作业:
01_cortex-A7核LED灯实验
让LD1、LD2、LD3轮流亮起
汇编语言实现
asm-led.S:
.text
.global _start
_start:
/LED1点灯****/
/初始化RCC章节/
RCC_INIT:
@通过RCC_MP_AHB4ENSETR寄存器,使能GPIOE组控制器
@1.准备一块地址0x50000A28空间
ldr r0,=0x50000A28
@2.将地址0x50000A28空间内容读出来
ldr r1,[r0]
@3.使能GPIOE组控制器,将地址0x50000A28空间第4位写1
orr r1,r1,#(0x1<<4)
@4.修改后的值,写回地址0x50000A28空间
str r1,[r0]
@通过RCC_MP_AHB4ENSETR寄存器,使能GPIOF组控制器
@1.准备一块地址0x50000A28空间
ldr r0,=0x50000A28
@2.将地址0x50000A28空间内容读出来
ldr r1,[r0]
@3.使能GPIOE组控制器,将地址0x50000A28空间第5位写1
orr r1,r1,#(0x1<<5)
@4.修改后的值,写回地址0x50000A28空间
str r1,[r0]
/初始化GPIO章节/
MODER_GPIO:
@1.设置GPIO引脚为输出模式
/*LD1 ------> SOC ------> PE10 ------>
GPIOE_MODER[21:20] = 01 ------>0x50006000[21:20] = 01 */
ldr r0,=0x50006000
ldr r1,[r0]
bic r1,r1,#(0x3<<20)
orr r1,r1,#(0x1<<20)
str r1,[r0]
/*LD2 ------> SOC ------> PF10 ------>
GPIOF_MODER[21:20] = 01 ------> 0x50007000 [21:20] = 01*/
ldr r0,=0x50007000
ldr r1,[r0]
bic r1,r1,#(0x3<<20)
orr r1,r1,#(0x1<<20)
str r1,[r0]
/*LD3 ------> SOC ------> PE8 ------>
GPIOE_MODER[17:16] = 01 ------> 0x50006000 [17:16] = 01*/
ldr r0,=0x50006000
ldr r1,[r0]
bic r1,r1,#(0x3<<16)
orr r1,r1,#(0x1<<16)
str r1,[r0]
@2.设置GPIO引脚为推挽输出模式
/*LD1 ------> SOC ------> PE10 ------>
GPIOE_OTYPER[10] = 0 ------> 0x50006004[10] = 0 */
ldr r0,=0x50006004
ldr r1,[r0]
bic r1,r1,#(0x1<<10)
str r1,[r0]
/*LD2 ------> SOC ------> PF10 ------>
GPIOF_OTYPER[10] = 0 ------> 0x50007004[10] = 0 */
ldr r0,=0x50007004
ldr r1,[r0]
bic r1,r1,#(0x1<<10)
str r1,[r0]
/*LD3 ------> SOC ------> PE8 ------>
GPIOE_OTYPER[8] = 0 ------> 0x50006004[8] = 0 */
ldr r0,=0x50006004
ldr r1,[r0]
bic r1,r1,#(0x1<<8)
str r1,[r0]
@3.设置GPIO引脚为低速
/*LD1 ------> SOC ------> PE10 ------>
GPIOE_OSPEEDR[21:20] = 00 ------> 0x50006008[21:20] = 00*/
ldr r0,=0x50006008
ldr r1,[r0]
bic r1,r1,#(0x3<<20)
str r1,[r0]
/*LD2 ------> SOC ------> PF10 ------>
GPIOF_OSPEEDR[21:20] = 00 ------> 0x50007008[21:20] = 00*/
ldr r0,=0x50007008
ldr r1,[r0]
bic r1,r1,#(0x3<<20)
str r1,[r0]
/*LD3 ------> SOC ------> PE8 ------>
GPIOE_OSPEEDR[17:16] = 00 ------> 0x50006008[17:16] = 00*/
ldr r0,=0x50006008
ldr r1,[r0]
bic r1,r1,#(0x3<<16)
str r1,[r0]
@4.设置GPIO引脚为禁止上下拉电阻
/*LD1 ------> SOC ------> PE10 ------>
GPIOE_PUPDR[21:20] = 00 ------> 0x5000600C[21:20] = 00*/
ldr r0,=0x5000600c
ldr r1,[r0]
bic r1,r1,#(0x3<<20)
str r1,[r0]
/*LD2 ------> SOC ------> PF10 ------>
GPIOF_PUPDR[21:20] = 00 ------> 0x5000700C[21:20] = 00*/
ldr r0,=0x5000700c
ldr r1,[r0]
bic r1,r1,#(0x3<<20)
str r1,[r0]
/*LD3 ------> SOC ------> PE8 ------>
GPIOE_PUPDR[17:16] = 00 ------> 0x5000600C[17:16] = 00*/
ldr r0,=0x5000600c
ldr r1,[r0]
bic r1,r1,#(0x3<<16)
str r1,[r0]
LOOP:
bl LD1_ON
bl delay_1s
bl LD1_OFF
bl delay_1s
bl LD2_ON
bl delay_1s
bl LD2_OFF
bl delay_1s
bl LD3_ON
bl delay_1s
bl LD3_OFF
bl delay_1s
b LOOP
LD1_ON:
@GPIOE_ODR输出高电平
/*LD1 ------> SOC ------> PE10 ------>
GPIOE_ODR[10] =1(点亮) ------> 0x50006014[10] */
ldr r0,=0x50006014
ldr r1,[r0]
orr r1,r1,#(0x1<<10)
str r1,[r0]
@函数返回
mov pc,lr
LD1_OFF:
@GPIOE_ODR输出低电平
/*LD1 ------> SOC ------> PE10 ------>
GPIOE_ODR[10] =0(熄灭) ------> 0x50006014[10] */
ldr r0,=0x50006014
ldr r1,[r0]
bic r1,r1,#(0x1<<10)
str r1,[r0]
@函数返回
mov pc,lr
LD2_ON:
@GPIOE_ODR输出高电平
/*LD2 ------> SOC ------> PF10 ------>
GPIOE_ODR[10] =1(点亮) ------> 0x50007014[10] */
ldr r0,=0x50007014
ldr r1,[r0]
orr r1,r1,#(0x1<<10)
str r1,[r0]
@函数返回
mov pc,lr
LD2_OFF:
@GPIOE_ODR输出低电平
/*LD2 ------> SOC ------> PF10 ------>
GPIOE_ODR[10] =0(熄灭) ------> 0x50006014[10] */
ldr r0,=0x50007014
ldr r1,[r0]
bic r1,r1,#(0x1<<10)
str r1,[r0]
@函数返回
mov pc,lr
LD3_ON:
@GPIOE_ODR输出高电平
/*LD3 ------> SOC ------> PE8 ------>
GPIOE_ODR[8] =1(点亮) ------> 0x50006014[10] */
ldr r0,=0x50006014
ldr r1,[r0]
orr r1,r1,#(0x1<<8)
str r1,[r0]
@函数返回
mov pc,lr
LD3_OFF:
@GPIOE_ODR输出低电平
/*LD1 ------> SOC ------> PE8 ------>
GPIOE_ODR[8] =0(熄灭) ------> 0x50006014[10] */
ldr r0,=0x50006014
ldr r1,[r0]
bic r1,r1,#(0x1<<8)
str r1,[r0]
@函数返回
mov pc,lr
@ 大概1s的延时函数
delay_1s:
mov r3, #0x10000000
mm:
cmp r3, #0
subne r3, r3, #1
bne mm
mov pc, lr
.end
LED实验