数码之家

 找回密码
 立即注册
搜索
查看: 2645|回复: 6

[ARM] 求助 :LED闪烁的实现(已经解决,感谢热心坛友)

[复制链接]
发表于 2020-9-3 01:21:40 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 lyy-cy 于 2020-9-4 00:48 编辑

一、用以下程序成功点亮了led,证明寄存器操作是正确的

  1. /* 例程代码--led.S */
  2. /* #define CTRL_BASE         0x44E10000   */
  3. /* #define GPIO1_BASE        0x4804C000*/

  4. /* TEXT_BESE                 0x80800000 */
  5. /* SPL_BESE                  0x402f0400  */


  6. .global _start /* 全局标号 */
  7. /*
  8. * 描述: _start 函数,程序从此函数开始执行此函数完成时钟使能、
  9. */
  10. _start:
  11.     ldr r0, =0x44E10854        /* GPMC_A5(GPIO1_21)寄存器 */
  12.     ldr r1, =0x00000017        /* GPMC_A5(GPIO1_21)寄存器,模式7 */
  13.     str r1, [r0]               /* GPMC_A5(GPIO1_21)寄存器,上拉[4:3]=0b11,模式7,[2:0] = 0b111 */

  14.     ldr r0, =0x4804C134        /* GPIO1 OUT寄存器 */
  15.     ldr r1, =0x00000000         
  16.     str r1, [r0]            /* 设置为输出 , 0 为输出 */

  17.     ldr r0, =0x4804C13C        /* GPIO1 DATAOUT寄存器 */
  18.     ldr r1, =0x00200000        
  19.     str r1, [r0]            /* 设置为高电平 */
  20. halt:
  21.     b halt                    /* 死循环 */

复制代码



二、 于是想让灯闪一闪,写了以下代码,燒进去,灯一直亮着,由于没有学过汇编,不解,请教一下万能的坛友,说不定有人会呢? 谢谢!

  1. /* 例程代码--led.S */
  2. /* #define CTRL_BASE         0x44E10000   */
  3. /* #define GPIO1_BASE        0x4804C000*/

  4. /* TEXT_BESE                 0x80800000 */
  5. /* SPL_BESE                  0x402f0400  */


  6. .global _start /* 全局标号 */
  7. /*
  8. * 描述: _start 函数,程序从此函数开始执行此函数完成时钟使能、
  9. */
  10. _start:
  11.     ldr r0, =0x44E10854        /* GPMC_A5(GPIO1_21)寄存器 */
  12.     ldr r1, =0x00000017        /* GPMC_A5(GPIO1_21)寄存器,模式7 */
  13.     str r1, [r0]               /* GPMC_A5(GPIO1_21)寄存器,上拉[4:3]=0b11,模式7,[2:0] = 0b111 */

  14.     ldr r0, =0x4804C134        /* GPIO1 OUT寄存器 */
  15.     ldr r1, =0x00000000         
  16.     str r1, [r0]            /* 设置为输出 , 0 为输出 */


  17. led_loop:
  18.     ldr r0, =0x4804C13C        /* GPIO1 DATAOUT寄存器 */
  19.     ldr r1, =0x00200000        
  20.     str r1, [r0]            /* 设置为高电平 */
  21.     bl delay

  22.     ldr r0, =0x4804C13C        /* GPIO1 DATAOUT寄存器 */
  23.     ldr r1, =0x00000000        
  24.     str r1, [r0]            /* 设置为高电平 */
  25.     bl delay
  26.     b led_loop                   /* 死循环 */

  27. delay:                //延时函数的函数名
  28.     ldr r2, =0x10000  //伪指令,把r3赋值为0xfffff
  29.     ldr r3, =0x0      //伪指令,把r3赋值为0
  30. delay_loop:           //循环标号
  31.     sub r2, r2, #1    //r2减一,类似c语言的自减1
  32.     cmp r2, r3        //比较r2和r3的值,内部实际上就是r2-r3的操作,用于影响cpsr的z位
  33.     bne delay_loop    //ne(not equal)条件执行后缀,当z=0时,就跳转到delay_loop标号
  34.     mov pc, lr  //返回到主调用函数,lr装载的是跳转前pc值,子函数结束后,返回到原来的执行处



复制代码


发表于 2020-9-3 06:38:04 | 显示全部楼层
奇葩
五个汉字
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-3 07:43:55 | 显示全部楼层
amo73 发表于 2020-9-3 06:38
奇葩
五个汉字

这位网友,为什么这么说呢?能再具体一点谈谈你的意见么?
欢迎指教。:handshake:
回复 支持 反对

使用道具 举报

发表于 2020-9-3 10:21:44 | 显示全部楼层
lyy-cy 发表于 2020-9-3 07:43
这位网友,为什么这么说呢?能再具体一点谈谈你的意见么?
欢迎指教。 ...

为什么要整汇编呢???
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-3 15:39:30 | 显示全部楼层
真情永存 发表于 2020-9-3 10:21
为什么要整汇编呢???

这要从根上说:

在咸鱼上买了个20元的beagleboneblack板子,也就是蚂蚁矿机的矿渣;
于是要学armlinux;
想学系统移植就必须知道uboot;
想了解uboot就必须知道操作系统管理内存的方法,
而了解程序的加载地址、运行地址等知识,就得知道编译和链接  gcc  Makefile等
一般网上的教程:原子、韦东山、讯为等课程都是通过一个汇编的案例来讲解的
网上的uboot加载原理、编译等都能理解
也能根据教程用汇编写到特定地址点灯了
但是顺便就想:让灯闪烁一下,现在卡在这里了,因为不是科班出身、没有学过汇编
只会 c  c++ 和Python 这些。
回复 支持 反对

使用道具 举报

发表于 2020-9-3 22:14:23 | 显示全部楼层
如果是主频12MHZ的12T 51,执行一条指令耗时1us,0x10000就是65ms,闪起来你也看不清。何况是主频高达1G的A8 :titter: ,所以你得试下再嵌套一次0x10000。仿照你的思路改一下:
  1. delay:                //延时函数的函数名
  2.     ldr r2, =0x10000  //伪指令,把r3赋值为0xfffff
  3.     ldr r3, =0x0      //伪指令,把r3赋值为0
  4. delay1:
  5.     ldr r4, =0x10000  //伪指令,把r4赋值为0
  6. delay_loop:           //循环标号
  7.     sub r4, r4, #1    //r4减一,类似c语言的自减1
  8.     cmp r4, r3        //比较r4和r3的值,内部实际上就是r4-r3的操作,用于影响cpsr的z位
  9.     bne delay_loop    //ne(not equal)条件执行后缀,当z=0时,就跳转到delay_loop标号
  10.     sub r2, r2, #1    //r2减一
  11.     cmp r2, r3        //r2不等于0就跳转到delay1
  12.     bne delay1
  13.     mov pc, lr  //返回到主调用函数,lr装载的是跳转前pc值,子函数结束后,返回到原来的执行处
复制代码

打赏

参与人数 1家元 +30 收起 理由
lyy-cy + 30 表示下感谢

查看全部打赏

回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-4 00:47:49 | 显示全部楼层
elecfunwb 发表于 2020-9-3 22:14
如果是主频12MHZ的12T 51,执行一条指令耗时1us,0x10000就是65ms,闪起来你也看不清。何况是主频高达1G的A ...

果真论坛有高手啊!
能说出A8我就已经信你了。

感谢老铁,小灯已经在欢快的闪烁了。
:handshake:
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-3-29 13:19 , Processed in 0.171600 second(s), 14 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

快速回复 返回顶部 返回列表