Tiny4412之蜂鸣器驱动与led灯驱动
2015-08-29 16:55
267 查看
一:LED驱动编写
要编写LED驱动,首先的知道开发板的构造;开发板分为核心板与底板;编写驱动的第一步就是要看开发板,找到LED灯在开发板上的位置及所对应的名字;第一步就要查看核心板电路图,以及底板电路图;最后就是查看开发板手册,然后进行程序编写:
通过看开发板我们可以知道LED灯的位置的核心板上,在核心板上找到LED的电路图,Ctrl+F可以在文档中快捷查找:
通过电路图我们可以看出:LED灯的一端已经接高电平,只要给另一端加低电平LED就会被点亮。
然后查看LED在核心板上的引脚:
由上图我们可以看出,LED1对应的是GPM4_0
然后通过芯片数据手册可以查到它的具体用法:
通过手册我们可以看出:GPM4CON 置一输出,表示控制,置零输入,表示检测,GPM4DAT表示它的值和引脚的电压状态对于,值为一时表示高电平,值为零时表示底电平,下面贴出代码:
下面的用C语言代码是实现四个LED灯的闪烁
跑马灯:
流水灯:
上面程序总用到的延时函数udelay(),由于U-Boot作为嵌入式Linux系统的引导,不具有标准C库中的内容。要使用像printf函数,延时函数udelay(),就需要u-boot中提供的。u-boot函数内容在u-boot源码文件中就需要u-boot中提供的。u-boot函数内容在u-boot源码文件中的System.map文件中。[b]System.map文件是被内核所使用的符号表。符号表是一个在符号名称与它们的存储器位置间的查询表格。符号名称可能是变量的名称或是函数名称。当要查询符号名称的位置或是特定位置的符号名称时,就会需要System.map。找到函数的对应地址,就可以对它进行使用了;
[/b]
二:蜂鸣器驱动编写:
通过开发板我们可以看出蜂鸣器位于底板:
查看电路图:
通过查看底板手册可知,当XpwmTOUT0处于高电平是蜂鸣器就会响起;通过XpwmTOUT0我们在核心板上找到它的引脚
然后查看芯片手册:
由图我们可以看出GPD0CON为0x1时控制控制:GPD0DAT为1为高电平:下面贴出汇编代码:
C语言的代码:
要编写LED驱动,首先的知道开发板的构造;开发板分为核心板与底板;编写驱动的第一步就是要看开发板,找到LED灯在开发板上的位置及所对应的名字;第一步就要查看核心板电路图,以及底板电路图;最后就是查看开发板手册,然后进行程序编写:
通过看开发板我们可以知道LED灯的位置的核心板上,在核心板上找到LED的电路图,Ctrl+F可以在文档中快捷查找:
通过电路图我们可以看出:LED灯的一端已经接高电平,只要给另一端加低电平LED就会被点亮。
然后查看LED在核心板上的引脚:
由上图我们可以看出,LED1对应的是GPM4_0
然后通过芯片数据手册可以查到它的具体用法:
通过手册我们可以看出:GPM4CON 置一输出,表示控制,置零输入,表示检测,GPM4DAT表示它的值和引脚的电压状态对于,值为一时表示高电平,值为零时表示底电平,下面贴出代码:
.global main main: mov ip, sp sub sp, sp, #12 stmdb sp!, {fp, ip, lr} add fp, sp, #8 ldr r3, gpmcon ldr r0, =0x1 str r0, [r3] ldr r3, gpmdat ldr r0, =0x0 str r0, [r3] add sp, fp, #4 ldmdb sp, {fp, sp, pc} gpmcon: .word 0x110002e0 gpmdat: .word 0x110002e4
下面的用C语言代码是实现四个LED灯的闪烁
#define GPM4CON (*(unsigned long *)0x110002e0)//宏定义 #define GPM4DAT (*(unsigned long *)0x110002e4) void (*udelay)(int) = 0xc3e25f90; int main() { GPM4CON &= ~0xffff; GPM4CON |= 0x1111; while(1) { GPM4DAT |= 0xf;//led off udelay(250000); GPM4DAT &= ~0xf; udelay(250000);//led on } }
跑马灯:
#define GPM4CON (*(unsigned long *)0x110002e0) #define GPM4DAT (*(unsigned long *)0x110002e4) void (*udelay)(int) = 0xc3e25f90; int main() { GPM4CON &= ~0xffff; GPM4CON |= 0x1111; unsigned long tmp = 0xf; while(1) { if((tmp & 0xf) == 0) { tmp = 0xf; } GPM4DAT = tmp << 1; tmp = GPM4DAT; udelay(250000); } }
流水灯:
#define GPM4CON (*(unsigned long *)0x110002e0) #define GPM4DAT (*(unsigned long *)0x110002e4) void (*udelay)(int) = 0xc3e25f90; int main() { GPM4CON &= ~0xffff; GPM4CON |= 0x1111; unsigned long i = 0; while(1) { GPM4DAT = 0xf; GPM4DAT &= ~(1 << i);//流水 udelay(500000);//延时 i++; if(i == 4) { i = 0; } } }
上面程序总用到的延时函数udelay(),由于U-Boot作为嵌入式Linux系统的引导,不具有标准C库中的内容。要使用像printf函数,延时函数udelay(),就需要u-boot中提供的。u-boot函数内容在u-boot源码文件中就需要u-boot中提供的。u-boot函数内容在u-boot源码文件中的System.map文件中。[b]System.map文件是被内核所使用的符号表。符号表是一个在符号名称与它们的存储器位置间的查询表格。符号名称可能是变量的名称或是函数名称。当要查询符号名称的位置或是特定位置的符号名称时,就会需要System.map。找到函数的对应地址,就可以对它进行使用了;
[/b]
二:蜂鸣器驱动编写:
通过开发板我们可以看出蜂鸣器位于底板:
查看电路图:
通过查看底板手册可知,当XpwmTOUT0处于高电平是蜂鸣器就会响起;通过XpwmTOUT0我们在核心板上找到它的引脚
然后查看芯片手册:
由图我们可以看出GPD0CON为0x1时控制控制:GPD0DAT为1为高电平:下面贴出汇编代码:
.global main main: mov ip, sp sub sp, sp, #12 stmdb sp!, {fp, ip, lr} add fp, sp, #8 ldr r3, gpdcon ldr r0, =0x1 str r0, [r3] ldr r3, gpmdat ldr r0, =0x1 str r0, [r3] add sp, fp, #4 ldmdb sp, {fp, sp, pc} gpdcon: .word 0x114000a0 gpmdat: .word 0x114000a4
C语言的代码:
#define GPD0CON (*(volatile unsigned long*)0x114000a0) #define GPD0DAT (*(volatile unsigned long*)0x114000a4) void (*udelay)(int) = 0xc3e25f90; int main(void) { GPD0CON = 0x0001; while(1){ GPD0DAT = 0x1; udelay(250000); GPD0DAT = 0x0; udelay(250000);//延时 } return 0; }
相关文章推荐
- JavaScript 设计模式之----单体(单例)模式
- btrfs的使用(案例讲解)
- LeetCode Missing Number
- 学习笔记 五 css
- Django最佳实践(中文版)
- bp神经网络算法中的权值修改问题
- 友元,虚函数,纯虚函数,静态函数
- ubuntu下安装国际版QQ
- js的replaceAll() (转)
- STM32之定时器prescaler
- [机器学习实战]--朴素贝叶斯过滤垃圾邮件
- Leetcode 222: Count Complete Tree Nodes
- 软件静默安装命令大全
- Javascript、Jquery获取浏览器和屏幕各种高度宽度
- 常量、字段、方法、属性和索引器(C#)
- Long CLick 和Long Press区别
- 【前端学习笔记】JS学习基础
- 飞思卡尔智能车准备篇
- 常量、字段、方法、属性和索引器(C#)
- 技术之路的三大模块+常用软件+常见问题