|
爱科技、爱创意、爱折腾、爱极致,我们都是技术控
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 lyy-cy 于 2020-9-4 00:48 编辑
一、用以下程序成功点亮了led,证明寄存器操作是正确的
- /* 例程代码--led.S */
- /* #define CTRL_BASE 0x44E10000 */
- /* #define GPIO1_BASE 0x4804C000*/
- /* TEXT_BESE 0x80800000 */
- /* SPL_BESE 0x402f0400 */
- .global _start /* 全局标号 */
- /*
- * 描述: _start 函数,程序从此函数开始执行此函数完成时钟使能、
- */
- _start:
- ldr r0, =0x44E10854 /* GPMC_A5(GPIO1_21)寄存器 */
- ldr r1, =0x00000017 /* GPMC_A5(GPIO1_21)寄存器,模式7 */
- str r1, [r0] /* GPMC_A5(GPIO1_21)寄存器,上拉[4:3]=0b11,模式7,[2:0] = 0b111 */
- ldr r0, =0x4804C134 /* GPIO1 OUT寄存器 */
- ldr r1, =0x00000000
- str r1, [r0] /* 设置为输出 , 0 为输出 */
- ldr r0, =0x4804C13C /* GPIO1 DATAOUT寄存器 */
- ldr r1, =0x00200000
- str r1, [r0] /* 设置为高电平 */
- halt:
- b halt /* 死循环 */
复制代码
二、 于是想让灯闪一闪,写了以下代码,燒进去,灯一直亮着,由于没有学过汇编,不解,请教一下万能的坛友,说不定有人会呢? 谢谢!
- /* 例程代码--led.S */
- /* #define CTRL_BASE 0x44E10000 */
- /* #define GPIO1_BASE 0x4804C000*/
- /* TEXT_BESE 0x80800000 */
- /* SPL_BESE 0x402f0400 */
- .global _start /* 全局标号 */
- /*
- * 描述: _start 函数,程序从此函数开始执行此函数完成时钟使能、
- */
- _start:
- ldr r0, =0x44E10854 /* GPMC_A5(GPIO1_21)寄存器 */
- ldr r1, =0x00000017 /* GPMC_A5(GPIO1_21)寄存器,模式7 */
- str r1, [r0] /* GPMC_A5(GPIO1_21)寄存器,上拉[4:3]=0b11,模式7,[2:0] = 0b111 */
- ldr r0, =0x4804C134 /* GPIO1 OUT寄存器 */
- ldr r1, =0x00000000
- str r1, [r0] /* 设置为输出 , 0 为输出 */
- led_loop:
- ldr r0, =0x4804C13C /* GPIO1 DATAOUT寄存器 */
- ldr r1, =0x00200000
- str r1, [r0] /* 设置为高电平 */
- bl delay
- ldr r0, =0x4804C13C /* GPIO1 DATAOUT寄存器 */
- ldr r1, =0x00000000
- str r1, [r0] /* 设置为高电平 */
- bl delay
- b led_loop /* 死循环 */
- delay: //延时函数的函数名
- ldr r2, =0x10000 //伪指令,把r3赋值为0xfffff
- ldr r3, =0x0 //伪指令,把r3赋值为0
- delay_loop: //循环标号
- sub r2, r2, #1 //r2减一,类似c语言的自减1
- cmp r2, r3 //比较r2和r3的值,内部实际上就是r2-r3的操作,用于影响cpsr的z位
- bne delay_loop //ne(not equal)条件执行后缀,当z=0时,就跳转到delay_loop标号
- mov pc, lr //返回到主调用函数,lr装载的是跳转前pc值,子函数结束后,返回到原来的执行处
复制代码
|
|