一: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。找到函数的对应地址,就可以对它进行使用了;
上一篇:Tiny4412MMU内存管理
下一篇:exynos 4412 时钟配置
推荐阅读最新更新时间:2024-11-11 12:28
推荐帖子
- 如何不影响原电路的前提下,测量电阻。我采用的方法,用了电压跟随器,测得电压有偏差
- 开始是用开关来隔绝原电路,等测试测完电阻并完成反馈使得电阻调节到需要的阻值后,再打开开关,但是这种方法要考虑开关寿命,以及响应速度问题。后来串进去电阻,测三路电压来计算阻值,用电压跟随器隔离,但是这种方法似乎有误差,是来源于偏置电流吗?各位大佬有什么好的方法吗? 如何不影响原电路的前提下,测量电阻。我采用的方法,用了电压跟随器,测得电压有偏差电压跟随器用运放,是高阻抗,应该不影响原电路啊这图画得实在是没办法看,导线把运放都盖住了。U1的同相输入端接输出端,反相输入端也接输出端?
- yangXINLONG 模拟电子
- stm32f103能采集幅值为200mv频率为1KH正弦波信号吗?
- stm32f103能采集幅值为200mv频率为1KH正弦波信号吗?我用列程能采集直流电压,把程序中的u16Get_Adc_Average(u8ch,u8times){u32temp_val=0;u8t;u8a;for(t=0;ttimes;t++){a=Get_Adc(ch);temp_val+=a;delay_ms(5);}returntemp_val/times;}改成u16Get_A
- znoanb;bna stm32/stm8
- FREESCALE单片机的C编程
- FREESCALE单片机的C编程楼主介绍少了点。酒好也怕巷子深啊现在用freescale做项目手头资料太少了。支持一下,谢谢楼主分享谢谢楼主!先看看,谢谢楼主。找了很久,谢谢分享~HC08的编程指南英文的应该说还不错的资料~~~谢谢楼主分享望介绍多一点关于内容方面的这是我写的怎么什么时候传到网上了?谢谢楼主分享...谢谢,非常感谢楼主!!哥哥,怎么是英文的?害的我翻译呀先了解很感谢楼主ilikeit!thankyou下来看看感谢楼主
- clark NXP MCU
- MSP430单片机C语言应用程序设计实例精讲-书pdf
- MSP430单片机C语言应用程序设计实例精讲-书pdfMSP430单片机C语言应用程序设计实例精讲-书pdf收藏。谢谢分享!回复楼主2iso的帖子学习一下。。。。。新人没有芯币表示压力很大回复楼主2iso的帖子学习学习收藏。谢谢分享!回复楼主2iso的帖子先搜集搜集资料,呵呵,谢了我是i新人没有芯币表示压力很大没有芯币表示压力很大谢谢楼主好资料啊免费就更好了感谢分享!顶!!!!!!!!!!!!!!下来看盾多谢好资料谢
- 2iso 微控制器 MCU
- 求一个有865GV同样功能的上DDR2内存的主板
- 请问大家一个问题,自认为在eeworld是高手如林的地方!865GV双通道(注意是865GV双通道)主板能用一条好的DDR内存带一条坏的DDR内存点亮主板,其它大部分主板都不行!请大家解析一下这其中的原因!现在想求一个有865GV同样功能的上DDR2内存的主板,也就是一条好的内存和一条坏的内存能点亮主板的支持DDR2内存的主板!谢谢,最好有个高手解析其中原因!求一个有865GV同样功能的上DDR2内存的主板友情帮顶下;同时学习下。非常失望!!!!不来eeworld了引用
- lenglx 嵌入式系统
- 为什么FREERTOS里好多例程编译通不过
- 请问高手,为什么为什么FREERTOS里好多例程编译通不过?谢谢为什么FREERTOS里好多例程编译通不过对开发环境有要求呗,甚至是版本,有的支持文件不同
- chenbingjy 实时操作系统RTOS