ARM day4 练习

汇编语言实现 实现三盏灯的流水闪烁 

.text  @声明下面内容都属于文本段内容
.global _start @声明 _start是一个全局启用的标签
_start:   @封装_start标签,汇编的标签和C中的函数类似

@LED1
	@GPIOE外设时钟使能  RCC_MP_AHB4ENSETR 0X50000A28 「4」-1
	ldr r0,=0X50000A28  @将基地址保存到r0寄存器中
	ldr r1,[r0] @将基地址里的内容保存到r1寄存器中
	orr r1,r1,#(0x1<<4)  @将「4」位置1
	str r1,[r0] @将修改后的值写回内存

	@设置PE10为输出 GPIO_MODER[21:20] --01  基地址为0x50006000
	ldr r0,=0x50006000 @基地址 
	ldr r1,[r0] @将该地址内的数据保存到r1里
	bic r1,r1,#(0x3<<20) @将[21:20]位置0
	orr r1,r1,#(0x1<<20) @将「21:20」设置成01
	str r1,[r0] @将修改后的数据写回内存中
	
	@设置PE10为推挽输出 GPIOE_OTYPER[10] --0 偏移地址为0x04
	ldr r0,=0x50006004 @基地址+偏移量
	ldr r1,[r0] @将对应内存地址的内容保存到r1中
	bic r1,r1,#(0x1<<10) @将「10」置零
	str r1,[r0] @将修改后的数据写回内存中

	@设置PE10为低速输出 GPIOE_OSPEEDR[21:20] -- 00 偏移地址为0x08
	ldr r0,=0x50006008  @指定基地址及偏移量
	ldr r1,[r0] @将内存地址里的内容载入到r1中
	bic r1,r1,#(0x3<<20) @将[21:20]位置零
	str r1,[r0]  @将修改后的数据写回内存中

	@设置PE10的上拉下拉电阻 无 GPIOE_PUPDR[21:20]----00 偏移地址为0x0C
	ldr r0,=0x5000600C @指定基地址及偏移量
	ldr r1,[r0] @将内存地址里的内容载入到r1中
	bic r1,r1,#(0x3<<20) @将[21:20]位零
	str r1,[r0] @将修改后的值写回内存

@LED2
	@GPIOF外设时钟使能  RCC_MP_AHB4ENSETR 0X50000A28 「5」-1
	ldr r0,=0X50000A28  @将基地址保存到r0寄存器中
	ldr r1,[r0] @将基地址里的内容保存到r1寄存器中
	orr r1,r1,#(0x1<<5)  @将「5」位置1
	str r1,[r0] @将修改后的值写回内存

	@设置PF10为输出 GPIO_MODER[21:20] --01  基地址为0x50007000
	ldr r0,=0x50007000 @基地址 
	ldr r1,[r0] @将该地址内的数据保存到r1里
	bic r1,r1,#(0x3<<20) @将[21:20]位置0
	orr r1,r1,#(0x1<<20) @将「21:20」设置成01
	str r1,[r0] @将修改后的数据写回内存中
	
	@设置PF10为推挽输出 GPIOF_OTYPER[10] --0 偏移地址为0x04
	ldr r0,=0x50007004 @基地址+偏移量
	ldr r1,[r0] @将对应内存地址的内容保存到r1中
	bic r1,r1,#(0x1<<10) @将「10」置零
	str r1,[r0] @将修改后的数据写回内存中

	@设置PF10为低速输出 GPIOF_OSPEEDR[21:20] -- 00 偏移地址为0x08
	ldr r0,=0x50007008  @指定基地址及偏移量
	ldr r1,[r0] @将内存地址里的内容载入到r1中
	bic r1,r1,#(0x3<<20) @将[21:20]位置零
	str r1,[r0]  @将修改后的数据写回内存中

	@设置PF10的上拉下拉电阻 无 GPIOF_PUPDR[21:20]----00 偏移地址为0x0C
	ldr r0,=0x5000700C @指定基地址及偏移量
	ldr r1,[r0] @将内存地址里的内容载入到r1中
	bic r1,r1,#(0x3<<20) @将[21:20]位零
	str r1,[r0] @将修改后的值写回内存

@LED3
	@GPIOE外设时钟使能  RCC_MP_AHB4ENSETR 0X50000A28 「4」-1
	ldr r0,=0X50000A28  @将基地址保存到r0寄存器中
	ldr r1,[r0] @将基地址里的内容保存到r1寄存器中
	orr r1,r1,#(0x1<<4)  @将「4」位置1
	str r1,[r0] @将修改后的值写回内存

	@设置PE8为输出 GPIO_MODER[17:16] --01  基地址为0x50006000
	ldr r0,=0x50006000 @基地址 
	ldr r1,[r0] @将该地址内的数据保存到r1里
	bic r1,r1,#(0x3<<16) @将[17:16]位置0
	orr r1,r1,#(0x1<<16) @将「17:16」设置成01
	str r1,[r0] @将修改后的数据写回内存中
	
	@设置PE10为推挽输出 GPIOE_OTYPER[8] --0 偏移地址为0x04
	ldr r0,=0x50006004 @基地址+偏移量
	ldr r1,[r0] @将对应内存地址的内容保存到r1中
	bic r1,r1,#(0x1<<8) @将「8」置零
	str r1,[r0] @将修改后的数据写回内存中

	@设置PE8为低速输出 GPIOE_OSPEEDR[17:16] -- 00 偏移地址为0x08
	ldr r0,=0x50006008  @指定基地址及偏移量
	ldr r1,[r0] @将内存地址里的内容载入到r1中
	bic r1,r1,#(0x3<<16) @将[17:16]位置零
	str r1,[r0]  @将修改后的数据写回内存中

	@设置PE8的上拉下拉电阻 无 GPIOE_PUPDR[17:16]----00 偏移地址为0x0C
	ldr r0,=0x5000600C @指定基地址及偏移量
	ldr r1,[r0] @将内存地址里的内容载入到r1中
	bic r1,r1,#(0x3<<16) @将[17:16]位零
	str r1,[r0] @将修改后的值写回内存

loop:     @B不让程序结束
    bl led1_on
    bl delay
    bl led1_off
    bl delay
 
    bl led2_on
    bl delay
    bl led2_off
    bl delay
 
    bl led3_on
    bl delay
    bl led3_off
    bl delay
    B loop




@led1 点灯 GPIOE_ODR[10]-1  0X50006014
@设置PE10的管脚输出高低电平GPIOE_ODR[10]偏移地址为 0x14
led1_on:
	ldr r0,=0x50006014 
	ldr r1,[r0]  @将内存地址内的内容保存到r1中
	orr r1,r1,#(0x1<<10)
	str r1,[r0] 
	mov pc,lr

@led1 关灯 GPIOE_ODR[10]-0 0X50006014
led1_off:
	ldr r0,=0x50006014 
	ldr r1,[r0]  @将内存地址内的内容保存到r1中
	bic r1,r1,#(0x1<<10)
	str r1,[r0] 
	mov pc,lr
	
@led2 点灯 GPIOF_ODR[10]-1  0X50007014
@设置PF10的管脚输出高低电平GPIOF_ODR[10]偏移地址为 0x14
led2_on:
	ldr r0,=0x50007014 
	ldr r1,[r0]  @将内存地址内的内容保存到r1中
	orr r1,r1,#(0x1<<10)
	str r1,[r0] 
	mov pc,lr

@led2 关灯 GPIOF_ODR[10]-0 0X50007014
led2_off:
	ldr r0,=0x50007014 
	ldr r1,[r0]  @将内存地址内的内容保存到r1中
	bic r1,r1,#(0x1<<10)
	str r1,[r0] 
	mov pc,lr
	
@点灯    GPIOE_ODR[8]->1    0x0006014
led3_on:
    LDR R0,=0x50006014   @指定基地址
    LDR R1,[R0]   @将寄存器数据读取出来保存到R1中
    ORR R1,R1,#(0x1<<8)  @将[8]设置为0
    STR R1,[R0]   @将修改后的值写回去
    mov pc,lr  @程序返回
 
@灭灯    GPIOE_ODR[8]->0    0x0006014
led3_off:
    LDR R0,=0x50006014   @指定基地址
    LDR R1,[R0]   @将寄存器数据读取出来保存到R1中
    bic R1,R1,#(0x1<<8)  @将[8]设置为0
    STR R1,[R0]   @将修改后的值写回去
    mov pc,lr  @程序返回

@延时:
delay:
    LDR r3,=0x5000000
 
MIN:
    cmp r3,#0
    subne r3,r3,#1
    bne MIN
    mov pc,lr  @程序返回
.end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值