使用汇编语言点亮流水灯

在点灯前,需要做好充足准备

1、先在原理图上找LD1、LD2、LD3所用的引脚口

 2、在接口连接的原理图上找LD1、LD2、LD3所对应的网络标签

3、找到RCC和GPIO对应的总线,为AHB4

 

4、找到GPIOE和GPIOF和RCC的起始地址
 5、找到所有需要修改的位,及其偏移量

代码总览
.text 
.global _start
_start: 
/*------------------------------------------------GPIOE时钟设置--------------------------------------------*/
@将RCC_MP_AHB4ENSETR寄存器第[4]设置为1,使能GPIOE外设时钟
	LDR R0,=0x50000a28  	@指定操作的寄存器地址
	LDR R1,[R0]  			@将寄存器数据取出来保存到R1中
	ORR R1,R1,#(0x1<<4)  	@将第4位设置为1
	STR R1,[R0]  			@将修改后的数值写回
/*------------------------------------------------GPIOF时钟设置--------------------------------------------*/
@将RCC_MP_AHB4ENSETR寄存器第[5]设置为1,使能GPIOF外设时钟
	LDR R0,=0x50000a28  	@指定操作的寄存器地址
	LDR R1,[R0]  			@将寄存器数据取出来保存到R1中
	ORR R1,R1,#(0x1<<5)  	@将第5位设置为1
	STR R1,[R0]  			@将修改后的数值写回

/*--------------------------------LED1:PE10-----------------------------------------*/
@LED1:PE10 GPIOE_MODER[21:20]设置为01,PE10管脚为输出模式
	LDR R0,=0x50006000 	 	@指定操作的寄存器地址
	LDR R1,[R0]  			@将寄存器数据取出来保存到R1中
	BIC R1,R1,#(0x3<<20)  	@将第[21:20]位设置0
	ORR R1,R1,#(0x1<<20)  	@将第20位设置为1
	STR R1,[R0]  			@将修改后的数值写回

@LED1:PE10 GPIOE_OTYPER[10]设置为0,PE10推挽输出
	LDR R0,=0x50006004  	@指定操作的寄存器地址
	LDR R1,[R0]  			@将寄存器数据取出来保存到R1中
	BIC R1,R1,#(0x1<<10)  	@将第[10]位设置0
	STR R1,[R0]  			@将修改后的数值写回

@LED1:PE10 GPIOE_OSPEEDR[21:20]设置为00,PE10低速输出
	LDR R0,=0x50006008  	@指定操作的寄存器地址
	LDR R1,[R0]  			@将寄存器数据取出来保存到R1中
	BIC R1,R1,#(0x3<<20)  	@将第[21:20]位设置0
	STR R1,[R0]  			@将修改后的数值写回

@LED1:PE10 GPIOE_PUPDR[21:20]设置为00,PE10输出无上拉下拉电阻
	LDR R0,=0x5000600C  	@指定操作的寄存器地址
	LDR R1,[R0]  			@将寄存器数据取出来保存到R1中
	BIC R1,R1,#(0x3<<20)  	@将第[21:20]位设置0
	STR R1,[R0]  			@将修改后的数值写回

/*--------------------------------LED2:PF10-----------------------------------------*/
@LED2:PF10 GPIOE_MODER[21:20]设置为01,PF10管脚为输出模式
	LDR R0,=0x50007000 	 	@指定操作的寄存器地址
	LDR R1,[R0]  			@将寄存器数据取出来保存到R1中
	BIC R1,R1,#(0x3<<20)  	@将第[21:20]位设置0
	ORR R1,R1,#(0x1<<20)  	@将第20位设置为1
	STR R1,[R0]  			@将修改后的数值写回

@LED2:PF10 GPIOE_OTYPER[10]设置为0,PF10推挽输出
	LDR R0,=0x50007004  	@指定操作的寄存器地址
	LDR R1,[R0]  			@将寄存器数据取出来保存到R1中
	BIC R1,R1,#(0x1<<10)  	@将第[10]位设置0
	STR R1,[R0]  			@将修改后的数值写回

@LED2:PF10 GPIOE_OSPEEDR[21:20]设置为00,PF10低速输出
	LDR R0,=0x50007008  	@指定操作的寄存器地址
	LDR R1,[R0]  			@将寄存器数据取出来保存到R1中
	BIC R1,R1,#(0x3<<20)  	@将第[21:20]位设置0
	STR R1,[R0]  			@将修改后的数值写回

@LED2:PF10 GPIOE_PUPDR[21:20]设置为00,PF10输出无上拉下拉电阻
	LDR R0,=0x5000700C  	@指定操作的寄存器地址
	LDR R1,[R0]  			@将寄存器数据取出来保存到R1中
	BIC R1,R1,#(0x3<<20)  	@将第[21:20]位设置0
	STR R1,[R0]  			@将修改后的数值写回


/*--------------------------------LED3:PE8-----------------------------------------*/
@LED3:PE8 GPIOE_MODER[17:16]设置为01,PE8管脚为输出模式
	LDR R0,=0x50006000 	 	@指定操作的寄存器地址
	LDR R1,[R0]  			@将寄存器数据取出来保存到R1中
	BIC R1,R1,#(0x3<<16)  	@将第[17:16]位设置0
	ORR R1,R1,#(0x1<<16)  	@将第16位设置为1
	STR R1,[R0]  			@将修改后的数值写回

@LED3:PE8 GPIOE_OTYPER[8]设置为0,PE8推挽输出
	LDR R0,=0x50006004  	@指定操作的寄存器地址
	LDR R1,[R0]  			@将寄存器数据取出来保存到R1中
	BIC R1,R1,#(0x1<<8)  	@将第[8]位设置0
	STR R1,[R0]  			@将修改后的数值写回
@LED3:PE8 GPIOE_OSPEEDR[17:16]设置为00,PE8低速输出
	LDR R0,=0x50006008  	@指定操作的寄存器地址
	LDR R1,[R0]  			@将寄存器数据取出来保存到R1中
	BIC R1,R1,#(0x3<<16)  	@将第[17:16]位设置0
	STR R1,[R0]  			@将修改后的数值写回

@LED3:PE8 GPIOE_PUPDR[17:16]设置为00,PE8输出无上拉下拉电阻
	LDR R0,=0x5000600C  	@指定操作的寄存器地址
	LDR R1,[R0]  			@将寄存器数据取出来保存到R1中
	BIC R1,R1,#(0x3<<16)  	@将第[21:20]位设置0
	STR R1,[R0]  			@将修改后的数值写回

loop:
	BL led1_on
	BL Delay
	BL led1_off
	BL led2_on
	BL Delay
	BL led2_off
	BL led3_on
	BL Delay
	BL led3_off
	B loop

/*-----------------------延时-----------------------------*/
Delay:
    LDR r3,=0X10000000
MM:
    CMP R3,#0
    subne r3,r3,#1
    bne MM
    MOV PC,LR

/*-------------------------------------led1的开关----------------------------------------*/
led1_on:
@LED1:PE10 GPIOE_ODR[10]设置为1,PE10输出高电平;设置为0,PE10输出低电平
	LDR R0,=0x50006014  	@指定操作的寄存器地址
	LDR R1,[R0]  			@将寄存器数据取出来保存到R1中
	ORR R1,R1,#(0x1<<10)  	@将第[10]位设置1
	STR R1,[R0]  			@将修改后的数值写回
	MOV PC,LR 				@函数返回

led1_off:
@LED1:PE10 GPIOE_ODR[10]设置为1,PE10输出高电平;设置为0,PE10输出低电平
	LDR R0,=0x50006014  	@指定操作的寄存器地址
	LDR R1,[R0]  			@将寄存器数据取出来保存到R1中
	BIC R1,R1,#(0x1<<10)  	@将第[10]位设置0
	STR R1,[R0]  			@将修改后的数值写回
	MOV PC,LR 				@函数返回


/*-------------------------------------led2的开关----------------------------------------*/
led2_on:
@LED2:PF10 GPIOE_ODR[10]设置为1,PF10输出高电平;设置为0,PF10输出低电平
	LDR R0,=0x50007014  	@指定操作的寄存器地址
	LDR R1,[R0]  			@将寄存器数据取出来保存到R1中
	ORR R1,R1,#(0x1<<10)  	@将第[10]位设置1
	STR R1,[R0]  			@将修改后的数值写回
	MOV PC,LR 				@函数返回

led2_off:
@LED2:PF10 GPIOE_ODR[10]设置为1,PF10输出高电平;设置为0,PF10输出低电平
	LDR R0,=0x50007014  	@指定操作的寄存器地址
	LDR R1,[R0]  			@将寄存器数据取出来保存到R1中
	BIC R1,R1,#(0x1<<10)  	@将第[10]位设置0
	STR R1,[R0]  			@将修改后的数值写回
	MOV PC,LR 				@函数返回

/*-------------------------------------led3的开关----------------------------------------*/
led3_on:
@LED3:PE8 GPIOE_ODR[8]设置为1,PE8输出高电平;设置为0,PE8输出低电平
	LDR R0,=0x50006014  	@指定操作的寄存器地址
	LDR R1,[R0]  			@将寄存器数据取出来保存到R1中
	ORR R1,R1,#(0x1<<8)  	@将第[10]位设置1
	STR R1,[R0]  			@将修改后的数值写回
	MOV PC,LR 				@函数返回

led3_off:
@LED3:PE8 GPIOE_ODR[8]设置为1,PE8输出高电平;设置为0,PE8输出低电平
	LDR R0,=0x50006014  	@指定操作的寄存器地址
	LDR R1,[R0]  			@将寄存器数据取出来保存到R1中
	BIC R1,R1,#(0x1<<8)  	@将第[10]位设置0
	STR R1,[R0]  			@将修改后的数值写回
	MOV PC,LR 				@函数返回

.end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值