一: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灯驱动的更多相关文章

  1. linux模块驱动之led(ioremap)

    一:led内核驱动 (1)在编写led内核驱动时,我们首先要进行内核裁剪,因为友善之臂将LED灯的驱动默认加载到内核中,所以编写模块驱动程序前就要先把原先的LED灯驱动裁剪掉: led驱动在源码里面的 ...

  2. Linux内核的LED设备驱动框架【转】

    /************************************************************************************ *本文为个人学习记录,如有错 ...

  3. TMS320VC5509总线驱动LED灯

    1. 重新建立的工程,需要添加宏定义才行 CHIP_5509 2. 驱动LED用的是74LVC573锁存器,LE高电平时,Q1=D0,LE低电平时,Q1=之前的状态,下面是数据总线 看下地址总线 看下 ...

  4. stm32开发笔记(三):stm32系列的GPIO基本功能之输出驱动LED灯、输入按键KEY以及Demo

    前言   stm32系列是最常用的单片机之一,不同的版本对应除了引脚.外设.频率.容量等'不同之外,其开发的方法是一样的.  本章讲解使用GPIO引脚功能驱动LED灯和接收Key按钮输入.   STM ...

  5. 灵动微电子ARM Cortex M0 MM32F0010 GPIO 的配置驱动LED灯

    灵动微电子ARM Cortex M0 MM32F0010 GPIO的配置 目录: 1.前言 2.学习方法简要说明 3.要点提示 4.注意事项 5.MM32F0010系统时钟的配置 6.MM32F001 ...

  6. MM32F0020 GPIO驱动LED灯(MM32F0020 GPIO Toggle)

    目录: 1.MM32F0020简介 2.MM32F0020系统时钟配置 3.MM32F0020的GPIO外设配置及其初始化 4.使用官网的Systick定时器做延时 5.MM32F0020 GPIO驱 ...

  7. MM32F0140 GPIO驱动LED灯(MM32F0140 GPIO)

    目录: 1.MM32F0140简介 2.MM32F0140系统时钟配置 3.MM32F0140的GPIO外设配置及其初始化 4.使用官网的Systick定时器做延时 5.MM32F0140 GPIO驱 ...

  8. 基于tiny4412的Linux内核移植 -- DM9621NP网卡驱动移植(四)

    作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...

  9. 嵌入式linux驱动开发之点亮led(驱动编程思想之初体验)

    这节我们就开始开始进行实战啦!这里顺便说一下啊,出来做开发的基础很重要啊,基础不好,迟早是要恶补的.个人深刻觉得像这种嵌入式的开发对C语言和微机接口与原理是非常依赖的,必须要有深厚的基础才能hold的 ...

随机推荐

  1. Java学习笔记(三)Java2D组件

    一  概述 Java2D的一切都基于java.awt包中的Graphics2D类,它是Graphics的子类. 为了绘制图形,需要使用面板作为画布,例如使用JPanel作为画布,面板有一个paintC ...

  2. ARC时代的内存管理

    什么是ARC Automatic Reference Counting (ARC) is a compiler feature that provides automatic memory manag ...

  3. Java-ServletRequestWrapper

    /** * * Provides a convenient implementation of the ServletRequest interface that * can be subclasse ...

  4. ERP-非财务人员的财务培训教(一.二)------财务基础知识

    二.基本财务管理知识 第一节 财务管理基础知识(一) 财务与会计的关系 会计的基础知识 (一) 财务与会计的关系 财务与会计的内涵 1.会计 会计工作主要是解决三个环节的问题: 会计凭证 会计账簿 会 ...

  5. FFmpeg与VS2010

    编译FFmpeg是一件痛苦的事情,一般都直接使用Zeranoe FFmpeg Builds. 如果使用这个版本,需要注意ffmpeg的帮助里的一段话: To create import librari ...

  6. 【Android 应用开发】Android之Bluetooth编程

    Android Bluetopth 编程大牛文章 http://my.oschina.net/u/994235/blog?catalog=313604 ViewGroup 相关资料 : http:// ...

  7. 【39】FlexboxLayout使用介绍

    FlexboxLayout介绍: Flexbox 也称为弹性盒子模型 或伸缩盒子模型,广泛用于前端开发,做过前端 web 的都知道Bootstrap 中有一套强大的 CSS Grid网格样式.Boot ...

  8. uc伯克利人工分割图像.seg文件解析

    之前看到  http://www.eecs.berkeley.edu/Research/Projects/CS/vision/grouping/segbench/ 提供的人工图像分割的.seg格式 ...

  9. error C3872: '0x3000': this character is not allowed in an identifier

    问题描述:这个字符不允许在标示符中使用 一般出这种错是因为你复制代码的时候,把不支持的字符复制进来了,这个字符就是中文空格,坑啊 解决: 把空格都删了,替换成英文的空格,就好了.

  10. iOS开发常用第三方库

    UI 动画 网络相关 Model 其他 数据库 缓存处理 PDF 图像浏览及处理 摄像照相视频音频处理 响应式框架 消息相关 版本新API的Demo 代码安全与密码 测试及调试 AppleWatch ...