• Tiny4412之蜂鸣器驱动与led灯驱动


      一:LED驱动编写

      要编写LED驱动,首先的知道开发板的构造;开发板分为核心板与底板;编写驱动的第一步就是要看开发板,找到LED灯在开发板上的位置及所对应的名字;第一步就要查看核心板电路图,以及底板电路图;最后就是查看开发板手册,然后进行程序编写:

      通过看开发板我们可以知道LED灯的位置的核心板上,在核心板上找到LED的电路图,Ctrl+F可以在文档中快捷查找:

      

    通过电路图我们可以看出:LED灯的一端已经接高电平,只要给另一端加低电平LED就会被点亮。

    然后查看LED在核心板上的引脚:

    由上图我们可以看出,LED1对应的是GPM4_0

    然后通过芯片数据手册可以查到它的具体用法:

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

     1     .global main
     2 main:
     3     mov ip, sp
     4     sub sp, sp, #12
     5     stmdb sp!, {fp, ip, lr}
     6     add fp, sp, #8
     7 
     8     ldr r3, gpmcon
     9     ldr r0, =0x1
    10     str r0, [r3]
    11 
    12     ldr r3, gpmdat
    13     ldr r0, =0x0
    14     str r0, [r3]
    15 
    16     add sp, fp, #4
    17     ldmdb sp, {fp, sp, pc}    
    18 
    19 gpmcon:
    20     .word 0x110002e0
    21 
    22 gpmdat:
    23     .word 0x110002e4

    下面的用C语言代码是实现四个LED灯的闪烁

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

     跑马灯:

     1 #define GPM4CON (*(unsigned long *)0x110002e0)
     2 #define GPM4DAT (*(unsigned long *)0x110002e4)
     3 
     4 void (*udelay)(int) = 0xc3e25f90;
     5 
     6 int main()
     7 {
     8     
     9     GPM4CON &= ~0xffff;
    10     GPM4CON |= 0x1111;
    11     unsigned long tmp = 0xf;
    12 
    13     while(1) {
    14 
    15         if((tmp & 0xf) == 0) {
    16             tmp = 0xf;
    17         }
    18 
    19         GPM4DAT = tmp << 1;
    20         tmp = GPM4DAT;
    21         udelay(250000);
    22 
    23     }
    24 
    25 }

    流水灯:

     1 #define GPM4CON (*(unsigned long *)0x110002e0)
     2 #define GPM4DAT (*(unsigned long *)0x110002e4)
     3 
     4 void (*udelay)(int) = 0xc3e25f90;
     5 
     6 int main()
     7 {
     8     
     9     GPM4CON &= ~0xffff;
    10     GPM4CON |= 0x1111;
    11     unsigned long i = 0;
    12     while(1) {
    13         GPM4DAT = 0xf;
    14         GPM4DAT &= ~(1 << i);//流水
    15         udelay(500000);//延时
    16         i++;
    17         if(i == 4) {
    18             i = 0;
    19         } 
    20     }
    21 
    22 }

    上面程序总用到的延时函数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     .global main
     2 main:
     3     mov ip, sp
     4     sub sp, sp, #12
     5     stmdb sp!, {fp, ip, lr}
     6     add fp, sp, #8
     7 
     8     ldr r3, gpdcon
     9     ldr r0, =0x1
    10     str r0, [r3]
    11 
    12     ldr r3, gpmdat
    13     ldr r0, =0x1
    14     str r0, [r3]
    15 
    16     add sp, fp, #4
    17     ldmdb sp, {fp, sp, pc}    
    18 
    19 gpdcon:
    20     .word 0x114000a0
    21 
    22 gpmdat:
    23     .word 0x114000a4

    C语言的代码:

     1 #define GPD0CON (*(volatile unsigned long*)0x114000a0)
     2 #define GPD0DAT (*(volatile unsigned long*)0x114000a4)
     3 
     4 void (*udelay)(int) = 0xc3e25f90;
     5 int main(void)
     6 {   
     7     GPD0CON =  0x0001;
     8     while(1){
     9         GPD0DAT = 0x1;
    10         udelay(250000);
    11         GPD0DAT = 0x0;
    12         udelay(250000);//延时
    13     }
    14     
    15     return 0;
    16 }
  • 相关阅读:
    [HDU6793] Tokitsukaze and Colorful Tree
    [NOI2020]命运
    [NOI2020]美食家
    模拟9
    晚测2
    模拟8
    联考4
    模拟7
    模拟6
    关于数论
  • 原文地址:https://www.cnblogs.com/wenqiang/p/4769384.html
Copyright © 2020-2023  润新知