




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、LED驱动程序设计分类: ARM系统进阶班(arm裸机程序)2012-08-24 13:23 1561人阅读 评论(0) 收藏 举报 首先声明,此文章是基于对国嵌视频教程中tiny6410有关视频教程的总结,为方便大家的复习。再次予以感谢,感谢国嵌各位老师为我们提供如此好的视频教程,为对于想要迈入嵌入式大门却迟迟找不到合适方法的学子们指引一条光明的方向。好了,接下来步入正题,此处将介绍tiny6410 LED驱动程序的设计。2 下面来看看tiny6410关于LED的原理图如图(1)所示:
2、
3、 图1 LED原理图3 LED实例,代码如下所示:(代码摘自光盘4实验代码3-3-1srcmain.c) main.ccpp view plaincopy1. /* 2. *实验要求: 用Tiny6410上的4个LED资源实现跑马灯程序。 3. *功能描述: Ti
4、ny6410用下面4个引脚连接了LED发光二极管,分别是 4. * GPK4-LED1 5. * GPK5-LED2 6. *
5、160; GPK6-LED3 7. * GPK7-LED4 8. * 本程序将控制这四个管脚的输出电平,实现跑马灯的效果 9. *日 期: 2011-3-10&
6、#160;10. *作 者: 国嵌 11. */ 12. #include "def.h" 13. #include "gpio.h" 14. 15. #define LED1_ON (1<<4) 16. #define LED2_ON
7、(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)
8、 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
9、160; (0x7F008000) 28. /oGPIO_REGS类型在 gpio.h 中定义 29. #define GPIO ( volatile oGPIO_REGS *)GPIO_BASE) 30. 31. /函数声明 32. void
10、0;delay(int times); 33. void LedPortInit(void); 34. void LedRun(void); 35. 36. /* 37. * 程序入口 38. * */ 39. int main(void) 40. 41.
11、0;LedPortInit(); 42. LedRun(); 43. 44. 45. /* 46. * 延时函数 47. * */ 48. void delay(int times) 49. 50. int i; 51.
12、60; for(;times>0;times-) 52. for(i=0;i<3000;i+); 53. 54. 55. /* 56. * 初始化连接LED灯的管脚资源 57. * 通过将GPIO_BASE强制转化为(volatile oGPIO_REGS*)型的指针可以很方便&
13、#160;58. * 的访问各个GPIO寄存器的值,这种方法比通过使用寄存器地址的宏定义访问 59. * 寄存器单元更加规范和科学。 60. * */ 61. void LedPortInit(void) 62. 63. u32 uConValue; 64. uConValue
14、60;= GPIO->rGPIOKCON0; 65. uConValue &= (0xffff<<16); 66. uConValue |= 0x1111<<16; 67. GPIO->rGPIOKCON0 = uConValue;
15、0; 68. 69. 70. /* 71. * 跑马灯的实现函数 72. * 通过控制连接LED的管脚的输出电平点亮和熄灭各个LED。 73. * 逐个循环点亮各个LED。在每点亮一个后保持一定时间再熄灭它,接着 74. * 点亮下一个LED,这样就形成了一
16、个跑马灯的效果。 75. * 这是一个需要改善的跑马灯程序,想想怎么优化这段代码。 76. * */ 77. void LedRun(void) 78. 79. GPIO->rGPIOKDAT |= LEDALL_OFF; 80. while(1) 81.
17、; 82. GPIO->rGPIOKDAT &= LED1_ON; 83. delay(1000); 84. GPIO->rGPIOKDAT
18、60;|= LEDALL_OFF; 85. 86. GPIO->rGPIOKDAT &= LED2_ON; 87. delay(1000); 88. GPIO->rGPIO
19、KDAT |= LEDALL_OFF; 89. 90. GPIO->rGPIOKDAT &= LED3_ON; 91. delay(1000); 92. GPIO-&g
20、t;rGPIOKDAT |= LEDALL_OFF; 93. 94. GPIO->rGPIOKDAT &= LED4_ON; 95. delay(1000); 96.
21、GPIO->rGPIOKDAT |= LEDALL_OFF; 97. 98. 4 程序代码分析: 首先来看一下宏定义部分:#define GPIO_BASE (0x7F008000) ,此处定义了GPIO所有相关寄存器的初始地址,由芯片手册S3C6410X.pdf,第308页可以得到此地址。以下为手册截图。由下图2可以看出,GPIO相关寄存器的初始地址即为GPACON的地址0x7F008000。
22、;
23、; 图2 GPIO的内存映射地址 了解#define GPIO ( volatile oGPIO_REGS *)GPIO_BASE)之前我们先来看看oGPIO_REGS的定义(代码摘自光盘4实验代码3-3-1srcperipheralgpio.h)gpio.hcpp view plaincopy1. #ifndef _GPIO_H_ 2. #define _GPIO_H_ 3.
24、 4. #ifdef _cplusplus 5. extern "C" 6. #endif 7. 8. #include "def.h" 9. 10. typedef struct tag_GPIO_REGS 11. 12. u32
25、rGPIOACON; /0x7F008000 13. u32 rGPIOADAT; 14. u32 rGPIOAPUD; 15. u32 rGPIOACONSLP; 16.
26、;u32 rGPIOAPUDSLP; 17. u32 reserved13; 18. 19. u32 rGPIOBCON; /0x7F008020 20. u32
27、0;rGPIOBDAT; 21. u32 rGPIOBPUD; 22. u32 rGPIOBCONSLP; 23. u32 rGPIOBPUDSLP; 24. u32 reserved23; 25.
28、; 26. u32 rGPIOCCON; /0x7F008040 27. u32 rGPIOCDAT; 28. u32 rGPIOCPUD; 29.
29、 u32 rGPIOCCONSLP; 30. u32 rGPIOCPUDSLP; 31. u32 reserved33; 32. 33. u32
30、rGPIODCON; /0x7F008060 34. u32 rGPIODDAT; 35. u32 rGPIODPUD; 36. u32 rGPIODCONSLP; 37.
31、;u32 rGPIODPUDSLP; 38. u32 reserved43; 39. 40. u32 rGPIOECON; /0x7F008080
32、; 41. u32 rGPIOEDAT; 42. u32 rGPIOEPUD; 43. u32 rGPIOECONSLP; 44. u32 rGPIOEPUDSLP; 45. u32
33、160;reserved53; 46. 47. u32 rGPIOFCON; /0x7F0080A0 48. u32 rGPIOFDAT; 49.
34、0; u32 rGPIOFPUD; 50. u32 rGPIOFCONSLP; 51. u32 rGPIOFPUDSLP; 52. u32 reserved63; 53. &
35、#160;54. u32 rGPIOGCON; /0x7F0080C0 55. u32 rGPIOGDAT; 56. u32 rGPIOGPUD; 57. u32 rGPIOGCONS
36、LP; 58. u32 rGPIOGPUDSLP; 59. u32 reserved73; 60. 61. u32 rGPIOHCON0; /0x
37、7F0080E0 62. u32 rGPIOHCON1; 63. u32 rGPIOHDAT; 64. u32 rGPIOHPUD; 65. u32 rGPIOHCONSLP; 66. u32 rGP
38、IOHPUDSLP; 67. u32 reserved82; 68. 69. u32 rGPIOICON; /0x7F008100 70. u32 rGPIOIDAT; &
39、#160;71. u32 rGPIOIPUD; 72. u32 rGPIOICONSLP; 73. u32 rGPIOIPUDSLP; 74. u32 reserved93; 75. 76.
40、160; u32 rGPIOJCON; /0x7F008120 77. u32 rGPIOJDAT; 78. u32 rGPIOJPUD; 79. u32 rGPIOJCONSLP; 80.
41、0; u32 rGPIOJPUDSLP; 81. u32 reserved103; 82. 83. u32 rGPIOOCON; /0x7F008140
42、60;84. u32 rGPIOODAT; 85. u32 rGPIOOPUD; 86. u32 rGPIOOCONSLP; 87. u32 rGPIOOPUDSLP; 88. u32
43、reserved113; 89. 90. u32 rGPIOPCON; /0x7F008160 91. u32 rGPIOPDAT; 92. u32 rGPIOPPUD;
44、93. u32 rGPIOPCONSLP; 94. u32 rGPIOPPUDSLP; 95. u32 reserved123; 96. 97. u32 rGPIOQCON;
45、0; /0x7F008180 98. u32 rGPIOQDAT; 99. u32 rGPIOQPUD; 100. u32 rGPIOQCONSLP; 101. u32 rGPIOQPUDSLP; &
46、#160; 102. u32 reserved133; 103. 104. u32 rSPCON; /0x7F0081A0 105. u32 reserved143;
47、160; 106. u32 rMEM0CONSTOP; /0x7F0081B0 107. u32 rMEM1CONSTOP; /0x7F0081B4 108. u32 reserved152;
48、160;109. u32 rMEM0CONSLP0; /0x7F0081C0 110. u32 rMEM0CONSLP1; /0x7F0081C4 111. u32 rMEM1CONSLP;
49、160; /0x7F0081C8 112. u32 reserved; 113. u32 rMEM0DRVCON; /0x7F0081D0 114. u32 rMEM1DRVCON; &
50、#160; /0x7F0081D4 115. u32 reserved1610; 116. 117. u32 rEINT12CON; /0x7f008200 118. u32
51、0;rEINT34CON; /0x7f008204 119. u32 rEINT56CON; /0x7f008208 120. u32 rEINT78CON;
52、; /0x7f00820C 121. u32 rEINT9CON; /0x7f008210 122. u32 reserved173; 123. 124. u32 rEINT12FLT
53、CON; /0x7f008220 125. u32 rEINT34FLTCON; /0x7f008224 126. u32 rEINT56FLTCON; /0x7f008228 127.
54、0; u32 rEINT78FLTCON; /0x7f00822C 128. u32 rEINT9FLTCON; /0x7f008230 129. u32 reserved183; 130. 131.
55、0; u32 rEINT12MASK; /0x7f008240 132. u32 rEINT34MASK; /0x7f008244 133. u32 rEINT56MASK;
56、; /0x7f008248 134. u32 rEINT78MASK; /0x7f00824C 135. u32 rEINT9MASK; /0x7f008250
57、;136. u32 reserved193; 137. 138. u32 rEINT12PEND; /0x7f008260 139. u32 rEINT34PEND; &
58、#160; /0x7f008264 140. u32 rEINT56PEND; /0x7f008268 141. u32 rEINT78PEND; /0x7f00826C 142. &
59、#160;u32 rEINT9PEND; /0x7f008270 143. u32 reserved203; 144. 145. u32 rPRIORITY;
60、; /0x7f008280 146. u32 rSERVICE; /0x7f008284 147. u32 rSERVICEPEND;
61、;/0x7f008288 148. u32 reserved21; 149. 150. u32 reserved22348; 151. 152. u32 rGPIOKCON0;
62、160; /0x7f008800 153. u32 rGPIOKCON1; /0x7f008804 154. u32 rGPIOKDAT; /0x7f008808 155.
63、; u32 rGPIOKPUD; /0x7f00880c 156. 157. u32 rGPIOLCON0; /0x7f008810 158. u32
64、0;rGPIOLCON1; /0x7f008814 159. u32 rGPIOLDAT; /0x7f008818 160. u32 rGPIOLPUD; &
65、#160; /0x7f00881c 161. 162. u32 rGPIOMCON; /0x7f008820 163. u32 rGPIOMDAT;
66、0; /0x7f008824 164. u32 rGPIOMPUD; /0x7f008828 165. u32 reserved23; 166. 167. u32
67、0;rGPIONCON; /0x7f008830 168. u32 rGPIONDAT; /0x7f008834 169. u32 rGPIONPUD;
68、160; /0x7f008838 170. u32 reserved24; 171. 172. u32 reserved2516; 173. 174. u32 rSPCONSLP; &
69、#160; /0x7f008880 175. 176. u32 reserved2631; 177. 178. u32 rEINT0CON0;
70、/0x7f008900 179. u32 rEINT0CON1; /0x7f008904 180. u32 reserved272; 181. 182. u32 rEINT0FLTCON0;
71、160; /0x7f008910 183. u32 rEINT0FLTCON1; /0x7f008914 184. u32 rEINT0FLTCON2; /0x7f008918 185. u32 r
72、EINT0FLTCON3; /0x7f00891c 186. u32 rEINT0MASK; /0x7f008920 187. u32 rEINT0PEND;
73、;/0x7f008924 188. u32 reserved282; 189. u32 rSLPEN; /0x7f008930 190. 191. 192. oGPIO_REGS;
74、193. 194. #ifdef _cplusplus 195. 196. #endif 197. 198. #endif /_GPIO_H_ 由此可以看出oGPIO_REGS为一结构体,( volatile oGPIO_REGS *)GPIO_BASE)为指向此结构体的指针,该指针即GPIO指向的初始地址为GPIO_BASE(0x7F008000),通过使用此指针,可以遍历到从GPIO_
75、BASE地址(0x7F008000)开始到0x7F008930地址处的所有寄存器。注意:上面结构体中所有元素,类型都是u32类型的,刚好四个字节,同时,由图2可知,如GPACON和GPADAT等寄存器地址都相差4,对于这段连续地址,如若中间没有对应某个寄存器,则用某些u32类型的数组填充,如u32 reserved13等等。下面开始看main.c中的main函数,main函数主要完成两个步骤,(1)LED初始化(LedPortInit()),(2)点亮LED(LedRun(). LED初始化:GPK总共有16个引脚,而每个引脚需要GPIO控制寄存器(GP*CO
76、N)使用4位来控制IO管脚的功能,即4*16=64位来控制所有GPK组的16个引脚。所以需要GPK使用了两个控制寄存器,GPKCON0和GPKCON1,从图1所示,我们使用的是GPK4,GPK5,GPK6,GPK7来控制LED灯的点亮与熄灭,所以此处我们只需使用GPKCON0来将GPK4,GPK5,GPK6,GPK7设置成输出功能。如图3所示,GPKCON寄存器配置如下:
77、;
78、; 图3 GPKCON寄存器配置图配置代码如下:1 . u32 uConValue;2 . uConValue = GPIO->rGPIOKCON0;3 . uConValue &= (0xffff<<16); 0000 0000 0000
79、0000 1111 1111 1111 11114 . uConValue |= 0x1111<<16;5 . GPIO->rGPIOKCON0 = uConValue; 首先我们要知道,在控制某个管脚的时候,我们不能去改变其它不使用管脚的状态,第二行获得GPKCON此时的状态将其赋给uConValue,第三行用于将GPKCON的高16位清零,低16位不变;第四行用于将
80、GPKCON的高16为变为0001 0001 0001 0001(即GPK4,GPK5,GPK6,GPK7管脚都设置为输出模式),低16为仍然不变。最后将此值赋回到GPKCON寄存器当中。至此,完成整个LED的初始化工作。点亮LED:注意GPKDAT为16位寄存器,虽然由gpio.h中看到rGPIOKDAT为32位,只是相当于我们忽略了其中的高16位,因为数据是从低地址往高地址处依次存放的。GPIO->rGPIOKDAT |= LEDALL_OFF; /4个灯全灭
81、60; while(1) GPIO->rGPIOKDAT &= LED1_ON; /GPK4管脚的灯亮
82、160; delay(1000); GPIO->rGPIOKDAT |= LEDALL_OFF; /GPK4管脚的灯灭
83、; GPIO->rGPIOKDAT &= LED2_ON; /GPK5管脚的灯亮 delay(1000); GPIO->rGPIOKDAT |= LEDALL_OFF; /GPK4管脚的灯灭 &
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 疫苗研发的新技术、新材料考核试卷
- 淀粉行业的市场销售与销售管理考核试卷
- 自然资源在幼儿园课程中的有效运用
- 重症医学科护理教学计划
- 臀部塑形操课件
- 2025保险公司借款合同样本
- 2025办公场所租赁合同范本
- 2025装饰合同范文
- 2025建筑工程合同范本3
- 2025YY经济适用房买卖合同
- GB/T 3785.3-2018电声学声级计第3部分:周期试验
- GB/T 28462-2012机织起绒合成革基布
- 接触网工复习题库及答案
- 儿童泌尿道感染(课堂PPT)
- 全国压力容器设计单位名录
- 特变电工-财务报表分析课件
- 人民医院人才队伍建设规划人才队伍建设五年规划
- 一年级语文下册课件-21 小壁虎借尾巴24-部编版(15张PPT)
- 患者随访率低原因分析以及对策
- 计量认证实验室程序文件(全套)
- DGC型瓦斯含量直接测定装置使用说明书
评论
0/150
提交评论