ARM的学习
点亮流水灯
.text
.global _start
_start: @使能GPIOE的外设时钟 RCC_MP_AHB4ENSETR 0x50000a28 [4]->1LDR R0,=0X50000A28 @指定基地址LDR R1,[R0] @将寄存器数据读取出来保存到R1中ORR R1,R1,#(0x3<<4) @[4]设置为1ORR R1,R1,#(0x3<<5) @[5]设置为1STR R1,[R0] @将修改之后的值写回去@设置PE10为输出 GPIOE_MODER [21:20]->01 0X50006000LDR R0,=0X50006000 @指定基地址LDR R1,[R0] @将寄存器数据读取出来保存到R1中BIC R1,R1,#(0x3<<20) @[21:20]设置为00ORR R1,R1,#(0x1<<20) @[21:20]设置为01BIC R1,R1,#(0x3<<16) @[17:16]设置为00ORR R1,R1,#(0x1<<16) @[17:16]设置为01STR R1,[R0] @将修改之后的值写回去@设置PE10为推挽输出 GPIOE_OTYPER[10]->0 0X50006004LDR R0,=0X50006004 @指定基地址LDR R1,[R0] @将寄存器数据读取出来保存到R1中BIC R1,R1,#(0x1<<10) @[10]设置为0BIC R1,R1,#(0x1<<8) @[8]设置为0STR R1,[R0] @将修改之后的值写回去@设置PE10低速输出 GPIOE_OSPEEDR[21:20]->00 0X50006008LDR R0,=0X50006008 @指定基地址LDR R1,[R0] @将寄存器数据读取出来保存到R1中BIC R1,R1,#(0x3<<20) @[21:20]设置为0BIC R1,R1,#(0x3<<16) @[17:16]设置为0STR R1,[R0] @将修改之后的值写回去@设置PE10无上拉下拉电阻 GPIOx_PUPDRLDR R0,=0X5000600C @指定基地址LDR R1,[R0] @将寄存器数据读取出来保存到R1中BIC R1,R1,#(0x3<<20) @[21:20]设置为0BIC R1,R1,#(0x3<<16) @[17:16]设置为0STR R1,[R0] @将修改之后的值写回去@设置PF10为输出 GPIOF_MODER [21:20]->01 0X50007000LDR R0,=0X50007000 @指定基地址LDR R1,[R0] @将寄存器数据读取出来保存到R1中BIC R1,R1,#(0x3<<20) @[21:20]设置为00ORR R1,R1,#(0x1<<20) @[17:16]设置为01STR R1,[R0] @将修改之后的值写回去@设置PF10为推挽输出 GPIOF_OTYPER[10]->0 0X5000F004LDR R0,=0X50007004 @指定基地址LDR R1,[R0] @将寄存器数据读取出来保存到R1中BIC R1,R1,#(0x1<<10) @[10]设置为0STR R1,[R0] @将修改之后的值写回去@设置PF10低速输出 GPIOF_OSPEEDR[21:20]->00 0X5000F008LDR R0,=0X50007008 @指定基地址LDR R1,[R0] @将寄存器数据读取出来保存到R1中BIC R1,R1,#(0x3<<20) @[21:20]设置为0STR R1,[R0] @将修改之后的值写回去@设置PF10无上拉下拉电阻 GPIOx_PUPDRLDR R0,=0X5000700C @指定基地址LDR R1,[R0] @将寄存器数据读取出来保存到R1中BIC R1,R1,#(0x3<<20) @[21:20]设置为0STR R1,[R0] @将修改之后的值写回去LOOP: @B不让程序结束bl LED1_ONbl DELAYbl LED1_OFFbl DELAYbl LED2_ONbl DELAYbl LED1_OFFbl DELAYbl LED3_ONbl DELAYbl LED1_OFFbl DELAYB LOOP@亮灯
LED1_ON:@点灯 GPIOE_ODR[10]->1 0向0006014LDR R0,=0X50006014 @指定基地址LDR R1,[R0] @将寄存器数据读取出来保存到R1中 ORR R1,R1,#(0x1<<10) @[10]设置为0STR R1,[R0] @将修改之后的值写回去MOV PC,LR @程序返回LED2_ON:@点灯 GPIOE_ODR[10]->1 0向0006014LDR R0,=0X50006014 @指定基地址LDR R1,[R0] @将寄存器数据读取出来保存到R1中ORR R1,R1,#(0x1<<8) @[8]设置为0STR R1,[R0] @将修改之后的值写回去MOV PC,LR @程序返回@亮灯
LED3_ON:LDR R2,=0X50007014 @指定基地址LDR R3,[R2] @将寄存器数据读取出来保存到R3中ORR R3,R3,#(0x1<<10) @[10]设置为0STR R3,[R2] @将修改之后的值写回去MOV PC,LR @程序返回@灭灯
LED_OFF:LDR R0,=0X50006014 @指定基地址LDR R1,[R0] @将寄存器数据读取出来保存到R1中LDR R2,=0X50007014 @指定基地址LDR R3,[R2] @将寄存器数据读取出来保存到R3中BIC R3,R3,#(0x1<<10) @[10]设置为0BIC R1,R1,#(0x1<<10) @[10]设置为0BIC R1,R1,#(0x1<<8) @[8]设置为0STR R1,[R0] @将修改之后的值写回去STR R3,[R2] @将修改之后的值写回去MOV PC,LR @程序返回@延时函数
DELAY:LDR R4,=0X10000000
MM:CMP R4,#0SUBNE R4,R4,#1BNE MMMOV PC,LR @程序返回.end
效果演示
流水灯