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

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

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


通过手册我们可以看出:GPM4CON 置一输出,表示控制,置零输入,表示检测,GPM4DAT表示它的值和引脚的电压状态对于,值为一时表示高电平,值为零时表示底电平,下面贴出代码:
.global main
main:
mov ip, sp
sub sp, sp, #
stmdb sp!, {fp, ip, lr}
add fp, sp, # ldr r3, gpmcon
ldr r0, =0x1
str r0, [r3] ldr r3, gpmdat
ldr r0, =0x0
str r0, [r3] add sp, fp, #
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() {
GPM4DAT |= 0xf;//led off
udelay();
GPM4DAT &= ~0xf;
udelay();//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() { if((tmp & 0xf) == ) {
tmp = 0xf;
} GPM4DAT = tmp << ;
tmp = GPM4DAT;
udelay(); } }
流水灯:
#define GPM4CON (*(unsigned long *)0x110002e0)
#define GPM4DAT (*(unsigned long *)0x110002e4) void (*udelay)(int) = 0xc3e25f90; int main()
{ GPM4CON &= ~0xffff;
GPM4CON |= 0x1111;
unsigned long i = ;
while() {
GPM4DAT = 0xf;
GPM4DAT &= ~( << i);//流水
udelay();//延时
i++;
if(i == ) {
i = ;
}
} }
上面程序总用到的延时函数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为高电平:下面贴出汇编代码:
.global main
main:
mov ip, sp
sub sp, sp, #
stmdb sp!, {fp, ip, lr}
add fp, sp, # ldr r3, gpdcon
ldr r0, =0x1
str r0, [r3] ldr r3, gpmdat
ldr r0, =0x1
str r0, [r3] add sp, fp, #
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(){
GPD0DAT = 0x1;
udelay();
GPD0DAT = 0x0;
udelay();//延时
} return ;
}
Tiny4412之蜂鸣器驱动与led灯驱动的更多相关文章
- linux模块驱动之led(ioremap)
一:led内核驱动 (1)在编写led内核驱动时,我们首先要进行内核裁剪,因为友善之臂将LED灯的驱动默认加载到内核中,所以编写模块驱动程序前就要先把原先的LED灯驱动裁剪掉: led驱动在源码里面的 ...
- Linux内核的LED设备驱动框架【转】
/************************************************************************************ *本文为个人学习记录,如有错 ...
- TMS320VC5509总线驱动LED灯
1. 重新建立的工程,需要添加宏定义才行 CHIP_5509 2. 驱动LED用的是74LVC573锁存器,LE高电平时,Q1=D0,LE低电平时,Q1=之前的状态,下面是数据总线 看下地址总线 看下 ...
- stm32开发笔记(三):stm32系列的GPIO基本功能之输出驱动LED灯、输入按键KEY以及Demo
前言 stm32系列是最常用的单片机之一,不同的版本对应除了引脚.外设.频率.容量等'不同之外,其开发的方法是一样的. 本章讲解使用GPIO引脚功能驱动LED灯和接收Key按钮输入. STM ...
- 灵动微电子ARM Cortex M0 MM32F0010 GPIO 的配置驱动LED灯
灵动微电子ARM Cortex M0 MM32F0010 GPIO的配置 目录: 1.前言 2.学习方法简要说明 3.要点提示 4.注意事项 5.MM32F0010系统时钟的配置 6.MM32F001 ...
- MM32F0020 GPIO驱动LED灯(MM32F0020 GPIO Toggle)
目录: 1.MM32F0020简介 2.MM32F0020系统时钟配置 3.MM32F0020的GPIO外设配置及其初始化 4.使用官网的Systick定时器做延时 5.MM32F0020 GPIO驱 ...
- MM32F0140 GPIO驱动LED灯(MM32F0140 GPIO)
目录: 1.MM32F0140简介 2.MM32F0140系统时钟配置 3.MM32F0140的GPIO外设配置及其初始化 4.使用官网的Systick定时器做延时 5.MM32F0140 GPIO驱 ...
- 基于tiny4412的Linux内核移植 -- DM9621NP网卡驱动移植(四)
作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...
- 嵌入式linux驱动开发之点亮led(驱动编程思想之初体验)
这节我们就开始开始进行实战啦!这里顺便说一下啊,出来做开发的基础很重要啊,基础不好,迟早是要恶补的.个人深刻觉得像这种嵌入式的开发对C语言和微机接口与原理是非常依赖的,必须要有深厚的基础才能hold的 ...
随机推荐
- Hibernate统计表中的条数
/** * 判断积分日志表中是否有某个用户的注册日志 */@Transactional(propagation = Propagation.REQUIRED)public boolean isE ...
- Linux本地网络脚本配置(内网与外网)
脚本位于: /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 //网卡的名字 BOOTPROTO=static // none静态IP ...
- Android监听自身卸载,弹出用户反馈调查
1,情景分析 在上上篇博客中我写了一下NDK开发实践项目,使用开源的LAME库转码MP3,作为前面几篇基础博客的加深理解使用的,但是这样的项目用处不大,除了练练NDK功底.这篇博客,我将讲述一下一个各 ...
- 【Android 应用开发】Android 开发错误集锦
1. eclipse的Device中不显示手机 在eclipse中连接不上手机,出现adb server didn't ACK fail to start daemon 错误. 出现这种原因是因为a ...
- linux内核中的排序接口--sort函数
linux内核中的sort函数,其实跟我们所说的qsort函数很像,我们来看看qsort: qsort 的函数原型是 void qsort(void*base,size_t num,size_t wi ...
- How to configure ODBC DSN in Client to access remote DB2 for Windows
How to configure ODBC DSN in Client to access remote DB2 for Windows MA Gen feng (Guangdong Unito ...
- JSP指令与动作
Jsp基本指令和动作 (2011-08-18 16:25:13) 转载▼ 标签: 杂谈 分类: java JSP基本指令 jsp命令指令用来设置与整个jsp页面相关的属性,它并不直接产生任何可见的输出 ...
- Visual Studio 2013创建自定义多项目模版
首先附上效果图: 可以看到输入解决方案名称后,自动创建了我事先写好的架构,并且项目名及Server层名称都变了,并且依然保持了引用关系. 下面讲具体步骤: 第一步:建立解决方案,并将需要的代码全部写好 ...
- spring 配置多数据源(mysql读写分离)
前段时间刚换了家新公司,然后看项目代码里用了数据库读写分离的架构,然后好奇扒了代码简单看了下,总体来说就是运用spring aop切面方式来实现的.看明白后就在自己的个人小项目里运用了下,测试OK,所 ...
- Oracle100w数据大表割接
[现网问题] 最近在给咪咕做视频后台管理,移动那边希望页面上,码流字段可以支持1位小数,如8.0.自己查看数据库,发现码流字段是Number整型,也就是要换类型,打算直接换成varchar2.因为自己 ...