找回密码
 立即注册
搜索
0赞
赞赏
手机版
扫码打开手机版
把文字装进口袋

一文解析蜂鸣器驱动及LED驱动编写

朱婆婆老 2022-8-5 13:57:48
一:LED驱动编写
        要编写LED驱动,首先的知道开发板的构造;开发板分为核心板与底板;编写驱动的第一步就是要看开发板,找到LED灯在开发板上的位置及所对应的名字;第一步就要查看核心板电路图,以及底板电路图;最后就是查看开发板手册,然后进行程序编写:
        通过看开发板我们可以知道LED灯的位置的核心板上,在核心板上找到LED的电路图,Ctrl+F可以在文档中快捷查找:
       

        通过电路图我们可以看出:LED灯的一端已经接高电平,只要给另一端加低电平LED就会被点亮。
        然后查看LED在核心板上的引脚:
       

        由上图我们可以看出,LED1对应的是GPM4_0
        然后通过芯片数据手册可以查到它的具体用法:
       

        通过手册我们可以看出:GPM4CON 置一输出,表示控制,置零输入,表示检测,GPM4DAT表示它的值和引脚的电压状态对于,值为一时表示高电平,值为零时表示底电平,下面贴出代码:

  1. 1     .global main
  2. 2 main:
  3. 3     mov ip, sp
  4. 4     sub sp, sp, #12
  5. 5     stmdb sp!, {fp, ip, lr}
  6. 6     add fp, sp, #8
  7. 7
  8. 8     ldr r3, gpmcon
  9. 9     ldr r0, =0x1
  10. 10     str r0, [r3]
  11. 11
  12. 12     ldr r3, gpmdat
  13. 13     ldr r0, =0x0
  14. 14     str r0, [r3]
  15. 15
  16. 16     add sp, fp, #4
  17. 17     ldmdb sp, {fp, sp, pc}   
  18. 18
  19. 19 gpmcon:
  20. 20     .word 0x110002e0
  21. 21
  22. 22 gpmdat:
  23. 23     .word 0x110002e4
复制代码
下面的用C语言代码是实现四个LED灯的闪烁

  1. 1 #define GPM4CON (*(unsigned long *)0x110002e0)//宏定义
  2. 2 #define GPM4DAT (*(unsigned long *)0x110002e4)
  3. 3
  4. 4 void (*udelay)(int) = 0xc3e25f90;
  5. 5 int main()
  6. 6 {
  7. 7     GPM4CON &= ~0xffff;
  8. 8     GPM4CON |= 0x1111;
  9. 9     
  10. 10     while(1) {
  11. 11         GPM4DAT |= 0xf;//led off
  12. 12         udelay(250000);
  13. 13         GPM4DAT &= ~0xf;
  14. 14         udelay(250000);//led on
  15. 15     }   
  16. 16 }
复制代码
跑马灯:

  1. 1 #define GPM4CON (*(unsigned long *)0x110002e0)
  2. 2 #define GPM4DAT (*(unsigned long *)0x110002e4)
  3. 3
  4. 4 void (*udelay)(int) = 0xc3e25f90;
  5. 5
  6. 6 int main()
  7. 7 {
  8. 8     
  9. 9     GPM4CON &= ~0xffff;
  10. 10     GPM4CON |= 0x1111;
  11. 11     unsigned long tmp = 0xf;
  12. 12
  13. 13     while(1) {
  14. 14
  15. 15         if((tmp & 0xf) == 0) {
  16. 16             tmp = 0xf;
  17. 17         }
  18. 18
  19. 19         GPM4DAT = tmp
复制代码
流水灯:

  1. 1 #define GPM4CON (*(unsigned long *)0x110002e0)
  2. 2 #define GPM4DAT (*(unsigned long *)0x110002e4)
  3. 3
  4. 4 void (*udelay)(int) = 0xc3e25f90;
  5. 5
  6. 6 int main()
  7. 7 {
  8. 8     
  9. 9     GPM4CON &= ~0xffff;
  10. 10     GPM4CON |= 0x1111;
  11. 11     unsigned long i = 0;
  12. 12     while(1) {
  13. 13         GPM4DAT = 0xf;
  14. 14         GPM4DAT &= ~(1
复制代码
上面程序总用到的延时函数udelay(),由于U-Boot作为嵌入式Linux系统的引导,不具有标准C库中的内容。要使用像printf函数,延时函数udelay(),就需要u-boot中提供的。u-boot函数内容在u-boot源码文件中就需要u-boot中提供的。u-boot函数内容在u-boot源码文件中的System.map文件中。System.map文件是被内核所使用的符号表。符号表是一个在符号名称与它们的存储器位置间的查询表格。符号名称可能是变量的名称或是函数名称。当要查询符号名称的位置或是特定位置的符号名称时,就会需要System.map。找到函数的对应地址,就可以对它进行使用了;
       

        二:蜂鸣器驱动编写:
        通过开发板我们可以看出蜂鸣器位于底板:
        查看电路图:
       

        通过查看底板手册可知,当XpwmTOUT0处于高电平是蜂鸣器就会响起;通过XpwmTOUT0我们在核心板上找到它的引脚
        然后查看芯片手册:
       

        由图我们可以看出GPD0CON为0x1时控制控制:GPD0DAT为1为高电平:下面贴出汇编代码:

  1. 1     .global main
  2. 2 main:
  3. 3     mov ip, sp
  4. 4     sub sp, sp, #12
  5. 5     stmdb sp!, {fp, ip, lr}
  6. 6     add fp, sp, #8
  7. 7
  8. 8     ldr r3, gpdcon
  9. 9     ldr r0, =0x1
  10. 10     str r0, [r3]
  11. 11
  12. 12     ldr r3, gpmdat
  13. 13     ldr r0, =0x1
  14. 14     str r0, [r3]
  15. 15
  16. 16     add sp, fp, #4
  17. 17     ldmdb sp, {fp, sp, pc}   
  18. 18
  19. 19 gpdcon:
  20. 20     .word 0x114000a0
  21. 21
  22. 22 gpmdat:
  23. 23     .word 0x114000a4
复制代码
C语言的代码:

  1. 1 #define GPD0CON (*(volatile unsigned long*)0x114000a0)
  2. 2 #define GPD0DAT (*(volatile unsigned long*)0x114000a4)
  3. 3
  4. 4 void (*udelay)(int) = 0xc3e25f90;
  5. 5 int main(void)
  6. 6 {   
  7. 7     GPD0CON =  0x0001;
  8. 8     while(1){
  9. 9         GPD0DAT = 0x1;
  10. 10         udelay(250000);
  11. 11         GPD0DAT = 0x0;
  12. 12         udelay(250000);//延时
  13. 13     }
  14. 14     
  15. 15     return 0;
  16. 16 }
复制代码

本帖子中包含更多资源

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

x

使用道具 举报

您需要登录后才可以回帖 立即登录
2022-8-5 16:35:03
不错
2022-8-5 16:38:44
太赞了
2022-8-5 21:09:39
顶一个了
2022-8-7 05:10:25
碉堡了!
2022-8-8 13:11:11
学习一下!十分感谢
2022-8-9 03:45:21
不错哦  喜欢 嘿嘿
2022-8-9 18:19:30
感谢您的无私精神...
2022-8-11 22:11:06
看帖子的要发表下看法
2022-8-14 02:02:41
1234下一页
返回顶部