uart0.c
Upload User: gaoyabin
Upload Date: 2016-05-30
Package Size: 285k
Code Size: 10k
Category:

SCM

Development Platform:

Asm

  1. /****************************************Copyright (c)**************************************************
  2. **                               广州周立功单片机发展有限公司
  3. **                                     研    究    所
  4. **                                        产品一部 
  5. **
  6. **                                 http://www.zlgmcu.com
  7. **
  8. **--------------文件信息--------------------------------------------------------------------------------
  9. **文   件   名: uart0.c
  10. **创   建   人: 陈明计
  11. **最后修改日期: 2003年7月4日
  12. **描        述: μCOS-II下LPC210x的UART0底层驱动 
  13. **              
  14. **--------------历史版本信息----------------------------------------------------------------------------
  15. ** 创建人: 陈明计
  16. ** 版  本: v1.0
  17. ** 日 期: 2003年7月4日
  18. ** 描 述: 原始版本
  19. **
  20. **------------------------------------------------------------------------------------------------------
  21. ** 修改人: 陈明计
  22. ** 版  本: v1.1
  23. ** 日 期: 2003年7月21日
  24. ** 描 述: 根据正式文档更改寄存器名
  25. **
  26. **--------------当前版本修订------------------------------------------------------------------------------
  27. ** 修改人: 陈明计
  28. ** 日 期: 2004年4月30日
  29. ** 描 述: 修改数据队列空间的分配,保证其为4字节对齐
  30. **
  31. **------------------------------------------------------------------------------------------------------
  32. ********************************************************************************************************/
  33. #define IN_UART0
  34. #include "config.h"
  35. static int UART0SendBuf[(UART0_SEND_QUEUE_LENGTH + sizeof(int) - 1) / sizeof(int)];
  36. static OS_EVENT *Uart0Sem;
  37. /*********************************************************************************************************
  38. ** 函数名称: Uart0WriteFull
  39. ** 功能描述: 数据队列写满处理程序 
  40. ** 输 入: Buf:指向数据队列
  41. **        Data:将要入队的数据
  42. **        Mod: 入队方式
  43. ** 输 出:TRUE  :成功
  44. **        FALSE:失败
  45. ** 全局变量: 无
  46. ** 调用模块: 无
  47. **
  48. ** 作 者: 陈明计
  49. ** 日 期: 2003年7月4日
  50. **-------------------------------------------------------------------------------------------------------
  51. ** 修改人:
  52. ** 日 期:
  53. **------------------------------------------------------------------------------------------------------
  54. ********************************************************************************************************/
  55.     uint8 Uart0WriteFull(DataQueue *Buf, QUEUE_DATA_TYPE Data, uint8 Mod)
  56. {
  57.     uint16 temp;
  58.     
  59.     Mod = Mod;
  60.     
  61.     temp = QueueSize((void *)Buf);
  62.     while (temp <= QueueNData((void *)Buf))         /* 等待数据队列不满 */
  63.     {
  64.         OSTimeDly(2);
  65.     }
  66.     return QueueWrite((void *)Buf, Data);           /* 数据重新入队 */
  67. }
  68. /*********************************************************************************************************
  69. ** 函数名称: UART0Init
  70. ** 功能描述: 初始化UART0 
  71. ** 输 入: bps:波特率
  72. **
  73. ** 输 出:TRUE  :成功
  74. **        FALSE:失败
  75. ** 全局变量: Uart0Sem
  76. ** 调用模块: QueueCreate,OSSemCreate
  77. **
  78. ** 作 者: 陈明计
  79. ** 日 期: 2003年7月4日
  80. **-------------------------------------------------------------------------------------------------------
  81. ** 修改人: 陈明计
  82. ** 日 期: 2003年7月8日
  83. **-------------------------------------------------------------------------------------------------------
  84. ** 修改人: 陈明计
  85. ** 日 期: 2003年7月21日
  86. **------------------------------------------------------------------------------------------------------
  87. ** 修改人: 陈明计
  88. ** 日 期: 2004年4月30日
  89. **------------------------------------------------------------------------------------------------------
  90. ********************************************************************************************************/
  91.         uint8 UART0Init(uint32 bps)
  92. {
  93.     uint16 Fdiv;
  94.     
  95.     PINSEL0 = (PINSEL0 & 0xfffffff0) | 0x05;    /* 选择管脚为UART0 */
  96.     U0LCR = 0x80;                               /* 允许访问分频因子寄存器 */
  97.     Fdiv = (Fpclk / 16) / bps;                  /* 设置波特率 */
  98.     U0DLM = Fdiv / 256;
  99. U0DLL = Fdiv % 256;
  100.     U0LCR = 0x03;                               /* 禁止访问分频因子寄存器 */
  101.                                                 /* 且设置为8,1,n */
  102. U0IER = 0x05;                               /* 允许接收和发送中断 */
  103.     U0FCR = 0x87;                               /* 初始化FIFO */
  104.     if (QueueCreate((void *)UART0SendBuf,
  105.                      sizeof(UART0SendBuf),
  106.                      NULL,
  107.                      (uint8 (*)())Uart0WriteFull)
  108.                      == NOT_OK)
  109.     {
  110.         return FALSE;
  111.     }
  112.     Uart0Sem = OSSemCreate(0);
  113.     if (Uart0Sem != NULL)
  114.     {
  115.         return TRUE;
  116.     }
  117.     else
  118.     {
  119.         return FALSE;
  120.     }
  121. /*********************************************************************************************************
  122. ** 函数名称: UART0Putch
  123. ** 功能描述: 发送一个字节数据
  124. ** 输 入: Data:发送的数据数据
  125. ** 输 出:无
  126. ** 全局变量: 无
  127. ** 调用模块: 无
  128. **
  129. ** 作 者: 陈明计
  130. ** 日 期: 2003年7月4日
  131. **-------------------------------------------------------------------------------------------------------
  132. ** 修改人: 陈明计
  133. ** 日 期: 2003年7月8日
  134. **-------------------------------------------------------------------------------------------------------
  135. ** 修改人: 陈明计
  136. ** 日 期: 2003年7月21日
  137. **------------------------------------------------------------------------------------------------------
  138. ********************************************************************************************************/
  139.         void UART0Putch(uint8 Data)
  140. {
  141.     uint8 temp;
  142.     
  143.     QueueWrite((void *)UART0SendBuf, Data);         /* 数据入队 */
  144.     OS_ENTER_CRITICAL();
  145.     if ((U0LSR & 0x00000020) != 0)
  146.     {                                               /* UART0发送保持寄存器空 */
  147.         QueueRead(&temp, UART0SendBuf);             /* 发送最初入队的数据 */
  148.         U0THR = temp;
  149.         U0IER = U0IER | 0x02;                       /* 允许发送中断 */
  150.     }
  151.     OS_EXIT_CRITICAL();
  152. /*********************************************************************************************************
  153. ** 函数名称: UART0Write
  154. ** 功能描述: 发送多个字节数据
  155. ** 输 入: Data:发送数据存储位置
  156. **        NByte:发送数据个数
  157. ** 输 出:无
  158. ** 全局变量: 无
  159. ** 调用模块: UART0Putch
  160. **
  161. ** 作 者: 陈明计
  162. ** 日 期: 2003年7月4日
  163. **-------------------------------------------------------------------------------------------------------
  164. ** 修改人: 陈明计
  165. ** 日 期: 2003年7月8日
  166. **------------------------------------------------------------------------------------------------------
  167. ********************************************************************************************************/
  168.         void UART0Write(uint8 *Data, uint16 NByte)
  169. {
  170.     OS_ENTER_CRITICAL();
  171.     while (NByte-- > 0)
  172.     {
  173.         UART0Putch(*Data++);
  174.     }
  175.     OS_EXIT_CRITICAL();
  176. /*********************************************************************************************************
  177. ** 函数名称: UART0Getch
  178. ** 功能描述: 接收一个字节
  179. ** 输 入: 无
  180. ** 输 出: 接收到的数据
  181. ** 全局变量: 无
  182. ** 调用模块: 无
  183. **
  184. ** 作 者: 陈明计
  185. ** 日 期: 2003年7月4日
  186. **-------------------------------------------------------------------------------------------------------
  187. ** 修改人: 陈明计
  188. ** 日 期: 2003年7月8日
  189. **-------------------------------------------------------------------------------------------------------
  190. ** 修改人: 陈明计
  191. ** 日 期: 2003年7月21日
  192. **------------------------------------------------------------------------------------------------------
  193. ********************************************************************************************************/
  194.         uint8 UART0Getch(void)
  195. {
  196.     uint8 err;
  197.     OS_ENTER_CRITICAL();
  198.     while ((U0LSR & 0x00000001) == 0)
  199.     {                                           /* 没有收到数据 */
  200.         U0IER = U0IER | 0x01;                   /* 允许接收中断 */
  201.         OSSemPend(Uart0Sem, 0, &err);           /* 等待接收数据 */
  202.     }
  203.     err = U0RBR;                                /* 读取收到的数据 */
  204.     OS_EXIT_CRITICAL();
  205.     return err;
  206. /*********************************************************************************************************
  207. ** 函数名称: UART0_Exception
  208. ** 功能描述: UART0中断服务程序
  209. ** 输 入: 无
  210. **
  211. ** 输 出: 无
  212. **         
  213. ** 全局变量: 无
  214. ** 调用模块: QueueRead,OSSemPost
  215. **
  216. ** 作 者: 陈明计
  217. ** 日 期: 2003年7月4日
  218. **-------------------------------------------------------------------------------------------------------
  219. ** 修改人: 陈明计
  220. ** 日 期: 2003年7月21日
  221. **------------------------------------------------------------------------------------------------------
  222. ********************************************************************************************************/
  223.         void UART0_Exception(void)
  224. {
  225.     uint8 IIR, temp, i;
  226.     
  227.     VICIntEnClr = (1 << 6) | (1 << 4);
  228.     VICVectAddr = 0;            // 通知中断控制器中断结束
  229.     OS_ENTER_CRITICAL();
  230.     OS_EXIT_CRITICAL();
  231.     while(((IIR = U0IIR) & 0x01) == 0)
  232.     {                                                   /* 有中断未处理完 */
  233.         switch (IIR & 0x0e)
  234.         {
  235.             case 0x02:                                  /* THRE中断    */
  236.                 for (i = 0; i < UART0_FIFO_LENGTH; i++) /* 向发送FIFO填充数据 */
  237.                 {
  238.                     if (QueueRead(&temp, UART0SendBuf) == QUEUE_OK)
  239.                     {
  240.                         U0THR = temp;
  241.                     }
  242.                     else
  243.                     {
  244.                         U0IER = U0IER & (~0x02);        /* 队列空,则禁止发送中断 */
  245.                     }
  246.                 }
  247.                 break;
  248.             case 0x04:                                  /* 接收数据可用 */
  249.                 OSSemPost(Uart0Sem);                    /* 通知接收任务 */
  250.                 U0IER = U0IER & (~0x01);                /* 禁止接收及字符超时中断 */
  251.                 break;
  252.             case 0x06:                                  /* 接收线状态   */
  253.                 temp = U0LSR;
  254.                 break;
  255.             case 0x0c:                                  /* 字符超时指示 */
  256.                 OSSemPost(Uart0Sem);                    /* 通知接收任务 */
  257.                 U0IER = U0IER & (~0x01);                /* 禁止接收及字符超时中断 */
  258.                 break;
  259.             default :
  260.                 break;
  261.         }
  262.     } 
  263.     VICIntEnable = (1 << 6) | (1 << 4);
  264. }
  265. /*********************************************************************************************************
  266. **                            End Of File
  267. ********************************************************************************************************/