LED驱动程序设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
LED驱动程序设计
分类:ARM系统进阶班(arm裸机程序)2012-08-24 13:23 1561人阅读评论(0) 收藏举报
首先声明,此文章是基于对国嵌视频教程中tiny6410有关视频教程的总结,为方便大家的复习。再次予以感谢,感谢国嵌各位老师为我们提供如此好的视频教程,为对于想要迈入嵌入式大门却迟迟找不到合适方法的学子们指引一条光明的方向。好了,接下来步入正题,此处将介绍tiny6410 LED驱动程序的设计。
2 下面来看看tiny6410关于LED 的原理图如图(1)所示:
图1 LED原理图
3 LED实例,代码如下所示:(代码摘自\光盘4\实验代码\3-3-1\src\main.c) main.c
[cpp]view plaincopy
1./**********************************************************
2.*实验要求:用Tiny6410上的4个LED资源实现跑马灯程序。
3.*功能描述: Tiny6410用下面4个引脚连接了LED发光二极管,分别是
4.* GPK4--LED1
5.* GPK5--LED2
6.* GPK6--LED3
7.* GPK7--LED4
8.* 本程序将控制这四个管脚的输出电平,实现跑马灯的效果
9.*日期: 2011-3-10
10.*作者:国嵌
11.**********************************************************/
12.#include "def.h"
13.#include "gpio.h"
14.
15.#define LED1_ON ~(1<<4)
16.#define LED2_ON ~(1<<5)
17.#define LED3_ON ~(1<<6)
18.#define LED4_ON ~(1<<7)
19.
20.#define LED1_OFF (1<<4)
21.#define LED2_OFF (1<<5)
22.#define LED3_OFF (1<<6)
23.#define LED4_OFF (1<<7)
24.#define LEDALL_OFF (0xf<<4)
25.
26.//GPIO
27.#define GPIO_BASE (0x7F008000)
28.//oGPIO_REGS类型在 gpio.h 中定义
29.#define GPIO (( volatile oGPIO_REGS *)GPIO_BASE)
30.
31.//函数声明
32.void delay(int times);
33.void LedPortInit(void);
34.void LedRun(void);
35.
36./*
37. * 程序入口
38. * */
39.int main(void)
40.{
41. LedPortInit();
42. LedRun();
43.}
44.
45./*
46. * 延时函数
47. * */
48.void delay(int times)
49.{
50.int i;
51.for(;times>0;times--)
52.for(i=0;i<3000;i++);
53.}
54.
55./*
56. * 初始化连接LED灯的管脚资源
57. * @ 通过将GPIO_BASE强制转化为(volatile oGPIO_REGS*)型的指针可以很方便
58. * 的访问各个GPIO寄存器的值,这种方法比通过使用寄存器地址的宏定义访问
59. * 寄存器单元更加规范和科学。
60. * */
61.void LedPortInit(void)
62.{
63. u32 uConValue;
64. uConValue = GPIO->rGPIOKCON0;
65. uConValue &= ~(0xffff<<16);
66. uConValue |= 0x1111<<16;
67. GPIO->rGPIOKCON0 = uConValue;
68.}
69.
70./*
71. * 跑马灯的实现函数
72. * @ 通过控制连接LED的管脚的输出电平点亮和熄灭各个LED。
73. * @ 逐个循环点亮各个LED。在每点亮一个后保持一定时间再熄灭它,接着
74. * 点亮下一个LED,这样就形成了一个跑马灯的效果。
75. * @ 这是一个需要改善的跑马灯程序,想想怎么优化这段代码。
76. * */
77.void LedRun(void)
78.{
79. GPIO->rGPIOKDAT |= LEDALL_OFF;
80.while(1)
81. {
82. GPIO->rGPIOKDAT &= LED1_ON;
83. delay(1000);
84. GPIO->rGPIOKDAT |= LEDALL_OFF;
85.
86. GPIO->rGPIOKDAT &= LED2_ON;
87. delay(1000);
88. GPIO->rGPIOKDAT |= LEDALL_OFF;
89.
90. GPIO->rGPIOKDAT &= LED3_ON;
91. delay(1000);
92. GPIO->rGPIOKDAT |= LEDALL_OFF;
93.
94. GPIO->rGPIOKDAT &= LED4_ON;
95. delay(1000);
96. GPIO->rGPIOKDAT |= LEDALL_OFF;
97. }
98.}
4 程序代码分析:
首先来看一下宏定义部分:#define GPIO_BASE (0x7F008000) ,此处定义了GPIO所有相关寄存器的初始地址,由芯片手册S3C6410X.pdf,第308页可以得到此地址。以下为手册截图。由下图2可以看出,GPIO相关寄存器的初始地址即为GPACON的地址
0x7F008000。