cc2530串口驱动程序

使用IAR驱动CC2530的串口0,串口1,实现数据发送以及printf,中断接收数据



uart.c

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /************************************************************************************************************* 
  2.  * 文件名: uart.c 
  3.  * 功能:  CC2530 串口相关函数 
  4.  * 作者:  cp1300@139.com 
  5. * 创建时间: 2013-06-07 21:33 
  6.  * 最后修改时间:2013-06-07 
  7.  * 详细:  串口相关函数 
  8.             串口最大时钟为系统时钟的1/16 
  9. *************************************************************************************************************/  
  10. #include "system.h"  
  11. #include "uart.h"  
  12.   
  13.   
  14.   
  15. //相关UART状态结构  
  16. typedef struct  
  17. {  
  18.     u8          BuffFull;   //接收Buff满  
  19.     u8          *RxBuff;    //接收Buff指针  
  20.     u16         RxBuffSize; //接收缓冲区大小,一帧数据大小  
  21.     u16         UartRxCnt;  //接收数据计数器  
  22. } UartRx_TypeDef;  
  23.   
  24. static UartRx_TypeDef   UART_RX[2];  
  25.   
  26.   
  27.   
  28.   
  29. static const u8 BAUD_M[11] = {59, 59, 59, 216, 59, 216, 59, 216, 59, 216, 216};     //32MHZ系统时钟对应的分频器小数部分  
  30. static const u8 BAUD_E[11] = {6, 7 ,8, 8, 9, 9, 10, 10, 11, 11, 12};                //32MHZ系统时钟对应的分频器指数部分  
  31.   
  32.   
  33. /************************************************************************************************************************* 
  34. *函数        :        void UART_Init(UART_CH ch, USART_BAUD Baud, FunctionalState RxIntEn) 
  35. *功能        :        串口初始化 
  36. *参数        :        ch:通道选择,UART_CH0,UART_CH1 
  37.                     Baud:波特率控制,见USART_BAUD 
  38.                     RxIntEn:ENABLE:使能串口接收中断 
  39. *返回        :       无 
  40. *依赖        :        底层宏定义 
  41. *作者        :        cp1300@139.com 
  42. *时间        :        2013-05-20 
  43. *最后修改时间:        2013-06-11 
  44. *说明        :        一个起始位,8个数据位,一个停止位,无奇偶校验 
  45.                     需要开启全局中断 
  46. *************************************************************************************************************************/  
  47. void UART_Init(UART_CH ch, USART_BAUD Baud, FunctionalState RxIntEn)  
  48. {  
  49.     switch(ch)  
  50.     {  
  51.         case UART_CH0:  
  52.         {  
  53.             U0CSR = BIT7 + BIT6;    //UART模式,使能接收     
  54.             U0UCR = BIT1;           //无流控,无奇偶校验,8bit,1个停止位,停止位高电平,起始低电平  
  55.             U0GCR =  BAUD_E[Baud];  //波特率分频器指数部分  
  56.             U0BAUD =  BAUD_M[Baud]; //波特率分频器小数部分  
  57.             P0SEL |= BIT2 + BIT3;   //P0.3 TXD,P0.2 RXD  
  58.             IEN2 &= ~(1 << 3);        //关闭发送中断  
  59.             URX0IF = 0;             //清除串口接收中断标志  
  60.             UTX0IF = 0;             //清除串口发送中断标志  
  61.             URX0IE = (RxIntEn == ENABLE) ? 1 : 0;           //使能串口接收中断  
  62.         }break;  
  63.         case UART_CH1:  
  64.         {  
  65.             U1CSR = BIT7 + BIT6;    //UART模式,使能接收     
  66.             U1UCR = BIT1;           //无流控,无奇偶校验,8bit,1个停止位,停止位高电平,起始低电平  
  67.             U1GCR =  BAUD_E[Baud];  //波特率分频器指数部分  
  68.             U1BAUD =  BAUD_M[Baud]; //波特率分频器小数部分  
  69.             P1SEL |= BIT4 + BIT5;   //P0.5 TXD,P0.4 RXD  
  70.             URX1IF = 0;             //清除串口接收中断标志  
  71.             UTX1IF = 0;             //清除串口发送中断标志  
  72.             URX1IE = (RxIntEn == ENABLE) ? 1 : 0;           //使能串口接收中断  
  73.         }break;  
  74.         default : return;  
  75.     }  
  76.     UART_SetRxBuff(ch, NULL, 0);    //初始化串口缓冲区无效  
  77. }  
  78.   
  79.   
  80.   
  81. /************************************************************************************************************************* 
  82. *函数         :   void UART_SendByte(UART_CH ch, u8 data) 
  83. *功能         :   UART字节发送函数 
  84. *参数         :   ch:通道选择,UART_CH0,UART_CH1 
  85.                     data:需要发送的数据 
  86. *返回         :   无 
  87. *依赖         :   底层宏定义 
  88. *作者         :   cp1300@139.com 
  89. *时间         :   2013-06-11 
  90. *最后修改时间 :   2013-06-11 
  91. *说明         :   无 
  92. *************************************************************************************************************************/  
  93. void UART_SendByte(UART_CH ch, u8 data)  
  94. {  
  95.     switch(ch)  
  96.     {  
  97.         case UART_CH0:  
  98.         {  
  99.             U0DBUF = data;                  //发送字节数据  
  100.             while(!(U0CSR & BIT1));         //等待发送数据寄存器为空                 
  101.             U0CSR &= ~BIT1;  
  102.         }break;  
  103.         case UART_CH1:  
  104.         {  
  105.             U1DBUF = data;                  //发送字节数据  
  106.             while(!(U1CSR & BIT1));         //等待发送数据寄存器为空                 
  107.             U1CSR &= ~BIT1;  
  108.         }break;  
  109.         default : break;  
  110.     }  
  111. }  
  112.   
  113.   
  114.   
  115.   
  116. /************************************************************************************************************************* 
  117. *函数         :   void UART2_SendData(u8 *pbuff, u16 len) 
  118. *功能         :   串口发送任意长度数据 
  119. *参数         :   ch:通道选择,UART_CH0,UART_CH1 
  120.                     pbuff:数据缓冲区指针,len:数据长度 
  121. *返回         :   无 
  122. *依赖         :   底层宏定义 
  123. *作者         :   cp1300@139.com 
  124. *时间         :   2013-06-11 
  125. *最后修改时间 :   2013-06-11 
  126. *说明         :   无 
  127. *************************************************************************************************************************/  
  128. void UART_SendData(UART_CH ch, u8 *pbuff, u16 len)  
  129. {  
  130.     u16 i;  
  131.       
  132.     switch(ch)  
  133.     {  
  134.         case UART_CH0:  
  135.         {  
  136.             for(i = 0;i < len;i ++)  
  137.             {  
  138.                 U0DBUF = pbuff[i];                  //发送字节数据  
  139.                 while(!(U0CSR & BIT1));         //等待发送数据寄存器为空                 
  140.                 U0CSR &= ~BIT1;  
  141.             }  
  142.         }break;  
  143.         case UART_CH1:  
  144.         {  
  145.             for(i = 0;i < len;i ++)  
  146.             {  
  147.                 U1DBUF = pbuff[i];                  //发送字节数据  
  148.                 while(!(U1CSR & BIT1));         //等待发送数据寄存器为空                 
  149.                 U1CSR &= ~BIT1;  
  150.             }  
  151.         }break;  
  152.         default : break;  
  153.     }  
  154. }  
  155.   
  156.   
  157.   
  158. /************************************************************************************************************************* 
  159. * 函数            :   void UART2_SendString(UART_CH ch, const char *pStr) 
  160. * 功能            :   UART发送字符串 
  161. * 参数            :   ch:通道选择,UART_CH0,UART_CH1 
  162.                     pStr:字符串指针 
  163. * 返回            :   无 
  164. * 依赖            :   底层宏定义 
  165. * 作者            :   cp1300@139.com 
  166. * 时间            :   2013-06-11 
  167. * 最后修改时间    :   2013-06-11 
  168. * 说明            :   遇到'0\'后停止发送 
  169. *************************************************************************************************************************/  
  170. void UART_SendString(UART_CH ch, const char *pStr)  
  171. {  
  172.     while(*pStr != '\0')  
  173.     {  
  174.         UART_SendByte(ch, *pStr ++);  
  175.     }  
  176. }  
  177.   
  178.   
  179. /************************************************************************************************************************* 
  180. * 函数            :   void UART_RxEnable(UART_CH ch, FunctionalState Enable) 
  181. * 功能            :   UART接收使能 
  182. * 参数            :   ch:通道选择,UART_CH0,UART_CH1 
  183.                     Enable:ENABLE:使能接收,DISABLE:取消接收 
  184. * 返回            :   无 
  185. * 依赖            :   底层宏定义 
  186. * 作者            :   cp1300@139.com 
  187. * 时间            :   2013-06-11 
  188. * 最后修改时间    :   2013-06-11 
  189. * 说明            :   无 
  190. *************************************************************************************************************************/  
  191. void UART_RxEnable(UART_CH ch, FunctionalState Enable)  
  192. {  
  193.     switch(ch)  
  194.     {  
  195.         case UART_CH0:  
  196.         {  
  197.             U0CSR = (Enable == ENABLE) ? (U0CSR|BIT6) : (U0CSR&(~BIT6));    //使能接收  
  198.         }break;  
  199.         case UART_CH1:  
  200.         {  
  201.             U1CSR = (Enable == ENABLE) ? (U1CSR|BIT6) : (U1CSR&(~BIT6));    //使能接收  
  202.         }break;  
  203.         default : break;  
  204.     }  
  205. }  
  206.   
  207.   
  208.   
  209.   
  210. //UART0中断服务程序  
  211. #pragma vector=URX0_VECTOR  
  212. __interrupt void UART0_IRQHandler(void)  
  213. {  
  214.     if(UART_RX[0].RxBuffSize > 0)                                          
  215.     {  
  216.         UART_RX[0].RxBuff[UART_RX[0].UartRxCnt ++] = U0DBUF;          
  217.         if(UART_RX[0].UartRxCnt == UART_RX[0].RxBuffSize)                 
  218.         {  
  219.              UART_RX[0].UartRxCnt = 0;                            
  220.              UART_RX[0].BuffFull = 1;                                     
  221.         }  
  222.     }  
  223.     else  
  224.     {  
  225.         URX0IF = 0;             //清除串口接收中断标志  
  226.     }  
  227. }  
  228.   
  229.   
  230.   
  231.   
  232. //UART1中断服务程序  
  233. #pragma vector=URX1_VECTOR  
  234. __interrupt void UART1_IRQHandler(void)  
  235. {  
  236.     if(UART_RX[1].RxBuffSize > 0)                                          
  237.     {  
  238.         UART_RX[1].RxBuff[UART_RX[1].UartRxCnt ++] = U1DBUF;          
  239.         if(UART_RX[1].UartRxCnt == UART_RX[1].RxBuffSize)                 
  240.         {  
  241.              UART_RX[1].UartRxCnt = 0;                            
  242.              UART_RX[1].BuffFull = 1;                                     
  243.         }  
  244.     }  
  245.     else  
  246.     {  
  247.         URX1IF = 0;             //清除串口接收中断标志  
  248.     }  
  249. }  
  250.   
  251.   
  252.   
  253.   
  254.   
  255. /************************************************************************************************************************* 
  256. * 函数            :   bool UART_GetNewData(UART_CH ch, u8 *pData) 
  257. * 功能            :   获取串口新数据 
  258. * 参数            :   ch:通道选择,UART_CH0,UART_CH1 
  259.                     pData:数据缓冲区指针 
  260. * 返回            :   TRUE:有新数据,FALSE:无新数据 
  261. * 依赖            :   底层宏定义 
  262. * 作者            :   cp1300@139.com 
  263. * 时间            :   2013-06-11 
  264. * 最后修改时间    :   2013-06-11 
  265. * 说明            :   用于非中断模式下获取串口新数据 
  266. *************************************************************************************************************************/  
  267. bool UART_GetNewData(UART_CH ch, u8 *pData)  
  268. {  
  269.     switch(ch)  
  270.     {  
  271.         case UART_CH0:  
  272.         {  
  273.             if(U0CSR & BIT2)  
  274.             {  
  275.                 *pData = U0DBUF;  
  276.                 return TRUE;  
  277.             }  
  278.             return FALSE;  
  279.         }break;  
  280.         case UART_CH1:  
  281.         {  
  282.             if(U1CSR & BIT2)  
  283.             {  
  284.                 *pData = U1DBUF;  
  285.                 return TRUE;  
  286.             }  
  287.             return FALSE;  
  288.         }break;  
  289.         default : return FALSE;  
  290.     }  
  291. }  
  292.   
  293.   
  294. /************************************************************************************************************************* 
  295. * 函数            :   bool UART_GetRxBuffFullFlag(UART_CH ch) 
  296. * 功能            :   获取串口接收缓冲区满标志 
  297. * 参数            :   ch:通道选择,UART_CH0,UART_CH1 
  298. * 返回            :   TRUE:满,FALSE:没有满 
  299. * 依赖            :   底层宏定义 
  300. * 作者            :   cp1300@139.com 
  301. * 时间            :   2013-06-11 
  302. * 最后修改时间    :   2013-06-11 
  303. * 说明    :           用于判断接收缓冲区是否满,会清除标志 
  304. *************************************************************************************************************************/  
  305. bool UART_GetRxBuffFullFlag(UART_CH ch)  
  306. {  
  307.     if(UART_RX[ch].BuffFull)                //缓冲区已满  
  308.     {  
  309.         UART_RX[ch].BuffFull = 0;           //清除满标志  
  310.         return TRUE;  
  311.     }  
  312.     return FALSE;  
  313. }  
  314.   
  315.   
  316.   
  317.   
  318. /************************************************************************************************************************* 
  319. * 函数            :   void UART_SetRxBuff(UART_CH ch, u8 *pRxBuff, u16 BuffSize) 
  320. * 功能            :   设置串口接收缓冲区 
  321. * 参数            :   ch:通道选择,UART_CH0,UART_CH1 
  322.                     pRxBuff:缓冲区指针,BuffSize:缓冲区大小 
  323. * 返回            :   无 
  324. * 依赖            :   底层宏定义 
  325. * 作者            :   cp1300@139.com 
  326. * 时间            :   2013-06-11 
  327. * 最后修改时间    :   2013-06-11 
  328. * 说明            :   用于中断接收 
  329. *************************************************************************************************************************/  
  330. void UART_SetRxBuff(UART_CH ch, u8 *pRxBuff, u16 BuffSize)  
  331. {  
  332.     UART_RX[ch].RxBuffSize = BuffSize;              //设置缓冲区大小  
  333.     UART_RX[ch].RxBuff = pRxBuff;                   //设置缓冲区指针  
  334.     UART_RX[ch].UartRxCnt = 0;                      //计数器清零  
  335. }  
  336.   
  337.   
  338.   
  339.   
  340.   
  341. /************************************************************************************************************************* 
  342. * 函数            :   u16 UART_GetRxCnt(UART_CH ch) 
  343. * 功能            :   获取串口接收数据计数器 
  344. * 参数            :   ch:通道选择,UART_CH0,UART_CH1 
  345. * 返回            :   接收到的数据数量 
  346. * 依赖            :   底层宏定义 
  347. * 作者            :   cp1300@139.com 
  348. * 时间            :   2013-06-11 
  349. * 最后修改时间    :   2013-06-11 
  350. * 说明            :   无 
  351. *************************************************************************************************************************/  
  352. u16 UART_GetRxCnt(UART_CH ch)  
  353. {  
  354.     return UART_RX[ch].UartRxCnt;               //返回计数值  
  355. }  
  356.   
  357.   
  358.   
  359.   
  360. /************************************************************************************************************************* 
  361. * 函数            :   void UART_ClearRxCnt(UART_CH ch) 
  362. * 功能            :   清除串口接收数据计数器 
  363. * 参数            :   ch:通道选择,UART_CH0,UART_CH1 
  364. * 返回            :   无 
  365. * 依赖            :   底层宏定义 
  366. * 作者            :   cp1300@139.com 
  367. * 时间            :   2013-06-11 
  368. * 最后修改时间    :   2013-06-11 
  369. * 说明            :   无 
  370. *************************************************************************************************************************/  
  371. void UART_ClearRxCnt(UART_CH ch)  
  372. {  
  373.     UART_RX[ch].UartRxCnt = 0;              //计数器清零  
  374. }  



uart.h

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /************************************************************************************************************* 
  2.  * 文件名: uart.h 
  3.  * 功能:  CC2530 串口相关函数 
  4.  * 作者:  cp1300@139.com 
  5. * 创建时间: 2013-06-07 21:33 
  6.  * 最后修改时间:2013-06-07 
  7.  * 详细:  串口相关函数 
  8. *************************************************************************************************************/  
  9. #ifndef _UART_H_  
  10. #define _UART_H_  
  11.   
  12. #include "system.h"  
  13. #include "stdio.h"  
  14.   
  15. //串口波特率定义  
  16. typedef enum  
  17. {  
  18.     BAUD_2400   = 0,        //2400  
  19.     BAUD_4800   = 1,        //4800  
  20.     BAUD_9600   = 2,        //9600  
  21.     BAUD_14400  = 3,        //14400  
  22.     BAUD_19200  = 4,        //19200  
  23.     BAUD_28800  = 5,        //28800  
  24.     BAUD_38400  = 6,        //38400  
  25.     BAUD_57600  = 7,        //57600  
  26.     BAUD_76800  = 8,        //76800  
  27.     BAUD_115200 = 9,        //115200  
  28.     BAUD_230400 = 10,       //230400  
  29. } USART_BAUD;  
  30.   
  31.   
  32.   
  33.   
  34. //串口通道选择  
  35. typedef enum  
  36. {  
  37.     UART_CH0    =   0,      //通道0,串口0  
  38.     UART_CH1    =   1,      //通道1,串口1  
  39. } UART_CH;  
  40.   
  41.   
  42.   
  43. //UAR  
  44. void UART_Init(UART_CH ch, USART_BAUD Baud, FunctionalState RxIntEn);   //UART初始化  
  45. void UART_SendByte(UART_CH ch, u8 data);  
  46. void UART_SendData(UART_CH ch, u8 *pbuff, u16 len);                     //串口发送任意长度数据  
  47. void UART_SendString(UART_CH ch, const char *pStr);                     //UART发送字符串  
  48. void UART_RxEnable(UART_CH ch, FunctionalState Enable);                 //UART接收使能  
  49. bool UART_GetNewData(UART_CH ch, u8 *pData);                            //获取串口新数据  
  50. bool UART_GetRxBuffFullFlag(UART_CH ch);                                //获取串口接收缓冲区满标志  
  51. void UART_SetRxBuff(UART_CH ch, u8 *pRxBuff, u16 BuffSize);             //设置串口接收缓冲区  
  52. u16 UART_GetRxCnt(UART_CH ch);                                          //获取串口接收数据计数器  
  53. void UART_ClearRxCnt(UART_CH ch);                                       //清除串口接收数据计数器  
  54.   
  55.     
  56.   
  57.   
  58.   
  59.   
  60.   
  61.   
  62. #endif //_UART_H_  


//重定义printf到串口

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #if _PRINTF_EN_  
  2. #include "uart.h"  
  3. #include "stdio.h"  
  4. //#define __CODE_MODEL__ = __CM_BANKED__  
  5. __near_func int putchar(int ch)  
  6. {  
  7.     UART_SendByte(UART_CH0, ch);  
  8.     return ch;  
  9. }  
  10. #endif  



初始化

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. //主函数  
  2. int main(void)  
  3. {  
  4.     SYS_ClockInit();  
  5.     UART_Init(UART_CH0, BAUD_115200,ENABLE);  
  6.     LED_Init();  
  7.     clock_init();  
  8.     SYS_EnableInt();  
  9.     process_init();  
  10.     process_start(&etimer_process, NULL);  
  11.     autostart_start(autostart_processes);  
  12.     printf("Processes running\n");  
  13.     while(1)  
  14.     {  
  15.         do  
  16.         {  
  17.   
  18.         } while(process_run()> 0);  
  19.         SYS_PowerIdle();            //空闲模式  
  20.     }  
  21. }  
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值