当前位置:文档之家› LED驱动程序设计

LED驱动程序设计

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 plaincopy1./**********************************************************2.*实验要求:用Tiny6410上的4个LED资源实现跑马灯程序。

3.*功能描述: Tiny6410用下面4个引脚连接了LED发光二极管,分别是4.* GPK4--LED15.* GPK5--LED26.* GPK6--LED37.* GPK7--LED48.* 本程序将控制这四个管脚的输出电平,实现跑马灯的效果9.*日期: 2011-3-1010.*作者:国嵌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.//GPIO27.#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。

图2 GPIO的内存映射地址了解#define GPIO (( volatile oGPIO_REGS *)GPIO_BASE)之前我们先来看看oGPIO_REGS的定义(代码摘自\光盘4\实验代码\3-3-1\src\peripheral\gpio.h)gpio.h[cpp]view plaincopy1.#ifndef __GPIO_H__2.#define __GPIO_H__3.4.#ifdef __cplusplus5.extern"C" {6.#endif7.8.#include "def.h"9.10.typedef struct tag_GPIO_REGS11.{12. u32 rGPIOACON; //0x7F00800013. u32 rGPIOADAT;14. u32 rGPIOAPUD;15. u32 rGPIOACONSLP;16. u32 rGPIOAPUDSLP;17. u32 reserved1[3];18.19. u32 rGPIOBCON; //0x7F00802020. u32 rGPIOBDAT;22. u32 rGPIOBCONSLP;23. u32 rGPIOBPUDSLP;24. u32 reserved2[3];25.26. u32 rGPIOCCON; //0x7F00804027. u32 rGPIOCDAT;28. u32 rGPIOCPUD;29. u32 rGPIOCCONSLP;30. u32 rGPIOCPUDSLP;31. u32 reserved3[3];32.33. u32 rGPIODCON; //0x7F00806034. u32 rGPIODDAT;35. u32 rGPIODPUD;36. u32 rGPIODCONSLP;37. u32 rGPIODPUDSLP;38. u32 reserved4[3];39.40. u32 rGPIOECON; //0x7F00808041. u32 rGPIOEDAT;42. u32 rGPIOEPUD;43. u32 rGPIOECONSLP;44. u32 rGPIOEPUDSLP;45. u32 reserved5[3];46.47. u32 rGPIOFCON; //0x7F0080A048. u32 rGPIOFDAT;49. u32 rGPIOFPUD;50. u32 rGPIOFCONSLP;51. u32 rGPIOFPUDSLP;52. u32 reserved6[3];53.54. u32 rGPIOGCON; //0x7F0080C055. u32 rGPIOGDAT;56. u32 rGPIOGPUD;57. u32 rGPIOGCONSLP;58. u32 rGPIOGPUDSLP;59. u32 reserved7[3];60.61. u32 rGPIOHCON0; //0x7F0080E062. u32 rGPIOHCON1;63. u32 rGPIOHDAT;64. u32 rGPIOHPUD;66. u32 rGPIOHPUDSLP;67. u32 reserved8[2];68.69. u32 rGPIOICON; //0x7F00810070. u32 rGPIOIDAT;71. u32 rGPIOIPUD;72. u32 rGPIOICONSLP;73. u32 rGPIOIPUDSLP;74. u32 reserved9[3];75.76. u32 rGPIOJCON; //0x7F00812077. u32 rGPIOJDAT;78. u32 rGPIOJPUD;79. u32 rGPIOJCONSLP;80. u32 rGPIOJPUDSLP;81. u32 reserved10[3];82.83. u32 rGPIOOCON; //0x7F00814084. u32 rGPIOODAT;85. u32 rGPIOOPUD;86. u32 rGPIOOCONSLP;87. u32 rGPIOOPUDSLP;88. u32 reserved11[3];89.90. u32 rGPIOPCON; //0x7F00816091. u32 rGPIOPDAT;92. u32 rGPIOPPUD;93. u32 rGPIOPCONSLP;94. u32 rGPIOPPUDSLP;95. u32 reserved12[3];96.97. u32 rGPIOQCON; //0x7F00818098. u32 rGPIOQDAT;99. u32 rGPIOQPUD;100. u32 rGPIOQCONSLP;101. u32 rGPIOQPUDSLP;102. u32 reserved13[3];103.104. u32 rSPCON; //0x7F0081A0 105. u32 reserved14[3];106. u32 rMEM0CONSTOP; //0x7F0081B0 107. u32 rMEM1CONSTOP; //0x7F0081B4 108. u32 reserved15[2];110. u32 rMEM0CONSLP1; //0x7F0081C4 111. u32 rMEM1CONSLP; //0x7F0081C8 112. u32 reserved;113. u32 rMEM0DRVCON; //0x7F0081D0 114. u32 rMEM1DRVCON; //0x7F0081D4 115. u32 reserved16[10];116.117. u32 rEINT12CON; //0x7f008200 118. u32 rEINT34CON; //0x7f008204 119. u32 rEINT56CON; //0x7f008208 120. u32 rEINT78CON; //0x7f00820C 121. u32 rEINT9CON; //0x7f008210 122. u32 reserved17[3];123.124. u32 rEINT12FLTCON; //0x7f008220 125. u32 rEINT34FLTCON; //0x7f008224 126. u32 rEINT56FLTCON; //0x7f008228 127. u32 rEINT78FLTCON; //0x7f00822C 128. u32 rEINT9FLTCON; //0x7f008230 129. u32 reserved18[3];130.131. u32 rEINT12MASK; //0x7f008240 132. u32 rEINT34MASK; //0x7f008244 133. u32 rEINT56MASK; //0x7f008248 134. u32 rEINT78MASK; //0x7f00824C 135. u32 rEINT9MASK; //0x7f008250 136. u32 reserved19[3];137.138. u32 rEINT12PEND; //0x7f008260 139. u32 rEINT34PEND; //0x7f008264 140. u32 rEINT56PEND; //0x7f008268 141. u32 rEINT78PEND; //0x7f00826C 142. u32 rEINT9PEND; //0x7f008270 143. u32 reserved20[3];144.145. u32 rPRIORITY; //0x7f008280 146. u32 rSERVICE; //0x7f008284 147. u32 rSERVICEPEND; //0x7f008288 148. u32 reserved21;149.150. u32 reserved22[348];151.152. u32 rGPIOKCON0; //0x7f008800154. u32 rGPIOKDAT; //0x7f008808 155. u32 rGPIOKPUD; //0x7f00880c 156.157. u32 rGPIOLCON0; //0x7f008810 158. u32 rGPIOLCON1; //0x7f008814 159. u32 rGPIOLDAT; //0x7f008818 160. u32 rGPIOLPUD; //0x7f00881c 161.162. u32 rGPIOMCON; //0x7f008820 163. u32 rGPIOMDAT; //0x7f008824 164. u32 rGPIOMPUD; //0x7f008828 165. u32 reserved23;166.167. u32 rGPIONCON; //0x7f008830 168. u32 rGPIONDAT; //0x7f008834 169. u32 rGPIONPUD; //0x7f008838 170. u32 reserved24;171.172. u32 reserved25[16];173.174. u32 rSPCONSLP; //0x7f008880 175.176. u32 reserved26[31];177.178. u32 rEINT0CON0; //0x7f008900 179. u32 rEINT0CON1; //0x7f008904 180. u32 reserved27[2];181.182. u32 rEINT0FLTCON0; //0x7f008910 183. u32 rEINT0FLTCON1; //0x7f008914 184. u32 rEINT0FLTCON2; //0x7f008918 185. u32 rEINT0FLTCON3; //0x7f00891c 186. u32 rEINT0MASK; //0x7f008920 187. u32 rEINT0PEND; //0x7f008924 188. u32 reserved28[2];189. u32 rSLPEN; //0x7f008930 190.191.}192.oGPIO_REGS;193.194.#ifdef __cplusplus195.}196.#endif197.198.#endif //__GPIO_H__由此可以看出oGPIO_REGS为一结构体,(( volatile oGPIO_REGS *)GPIO_BASE)为指向此结构体的指针,该指针即GPIO指向的初始地址为GPIO_BASE(0x7F008000),通过使用此指针,可以遍历到从GPIO_BASE地址(0x7F008000)开始到0x7F008930地址处的所有寄存器。

相关主题