sp3220.c
上传用户:xs588588
上传日期:2021-03-30
资源大小:242k
文件大小:4k
源码类别:

DSP编程

开发平台:

C/C++

  1. #include <msp430x14x.h>
  2. #include "sp3220.h"
  3. //定义串口操作变量
  4. // 串口 1 的接收标志
  5. char nRev_UART1;
  6. // 串口 1 的发送缓冲区
  7. char UART1_TX_BUF[60];
  8. // 串口 1 的接收缓冲区
  9. char UART1_RX_BUF[60];
  10. int nTX1_Len;
  11. char nRX1_Len;
  12. char nRX1_Len_temp;
  13. char nTX1_Flag;
  14. int nSend_TX1;
  15. void Init_UART1(void)
  16. {
  17. //将寄存器的内容清零
  18.     U1CTL = 0X00;
  19. //数据位为8bit
  20.     U1CTL += CHAR;
  21.     
  22. //将寄存器的内容清零
  23.     U1TCTL = 0X00;
  24. //波特率发生器选择SMCLK
  25.     U1TCTL += SSEL1;
  26.     
  27. //波特率为57600
  28.     UBR0_1 = 0X8B;
  29.     UBR1_1 = 0X00;
  30. //调整寄存器
  31.     UMCTL_1 = 0X00;
  32. //使能UART1的TXD和RXD
  33.     ME2 |= UTXE1 + URXE1; 
  34. //使能UART1的RX中断
  35.     IE2 |= URXIE1;
  36. //使能UART1的TX中断
  37.     IE2 |= UTXIE1;
  38.     
  39. //设置P3.6为UART1的TXD
  40.     P3SEL |= BIT6;
  41. //设置P3.7为UART1的RXD
  42.     P3SEL |= BIT7;
  43.     
  44. //P3.6为输出管脚
  45.     P3DIR |= BIT6;
  46.     return;
  47. }
  48. void Init_Port(void)
  49. {
  50.     //将所有的管脚在初始化的时候设置为输入方式
  51.     P3DIR = 0;
  52.     //将所有的管脚设置为一般I/O口
  53.     P3SEL = 0;
  54.     return;
  55. }
  56. void Init_CLK(void)
  57. {
  58.     unsigned int i;
  59. //将寄存器的内容清零
  60. //XT2震荡器开启
  61. //LFTX1工作在低频模式
  62. //ACLK的分频因子为1
  63.     BCSCTL1 = 0X00;
  64.     do 
  65.     {
  66. IFG1 &= ~OFIFG;                       // 清除OSCFault标志
  67. for (i = 0x20; i > 0; i--);                
  68.     }
  69.     while ((IFG1 & OFIFG) == OFIFG);      // 如果OSCFault =1   
  70.     BCSCTL2 = 0X00; //将寄存器的内容清零
  71.     BCSCTL2 += SELM1; //MCLK的时钟源为TX2CLK,分频因子为1
  72.     BCSCTL2 += SELS; //SMCLK的时钟源为TX2CLK,分频因子为1
  73. }
  74. ///////////////////////////////////////
  75. // 处理来自串口 1 的接收中断
  76. interrupt [UART1RX_VECTOR] void UART1_RX_ISR(void)
  77. {
  78.     
  79.     UART1_RX_BUF[nRX1_Len_temp] = RXBUF1; //接收来自的数据
  80.     
  81.     nRX1_Len_temp += 1;
  82.         
  83.     if(UART1_RX_BUF[nRX1_Len_temp - 1] == 13)
  84.     {
  85.      nRX1_Len = nRX1_Len_temp;
  86.      nRev_UART1 = 1;
  87.      nRX1_Len_temp = 0;
  88.     }
  89. }
  90. ///////////////////////////////////////
  91. // 处理来自串口 1 的发送中断
  92. interrupt [UART1TX_VECTOR] void UART1_TX_ISR(void)
  93. {
  94.     if(nTX1_Len != 0)
  95.     {
  96.      nTX1_Flag = 0; // 表示缓冲区里的数据没有发送完
  97.     
  98.      TXBUF1 = UART1_TX_BUF[nSend_TX1];
  99.      nSend_TX1 += 1;
  100.     
  101.      if(nSend_TX1 >= nTX1_Len)
  102.      {
  103.          nSend_TX1 = 0;
  104.          nTX1_Len = 0;
  105.          nTX1_Flag = 1;
  106.      }
  107.     }
  108. }
  109. void main(void)
  110. {
  111. int nRes_UART1;
  112.     int nRes = 0;
  113.     char UART1_RX_Temp[60];
  114.     int i;
  115.     int n;
  116. // 关闭看门狗
  117. WDTCTL = WDTPW + WDTHOLD;   
  118.     
  119. // 关闭中断
  120.     _DINT();
  121. // 初始化时钟
  122.     Init_CLK();
  123. // 初始化端口
  124.     Init_Port();
  125. // 初始化串口1
  126.     Init_UART1();
  127. // 打开中断
  128. _EINT();
  129.  
  130. // 进入处理循环
  131. for(;;)
  132.     {
  133.      if(nRev_UART1 == 1)
  134.      {
  135.          nRev_UART1 = 0;
  136. // 将接收到的数据拷贝到临时缓冲区
  137. for(i = 0;i < nRX1_Len;i++) 
  138. UART1_RX_Temp[i] = UART1_RX_BUF[i];
  139. nRes = ProcessCMD(UART1_RX_Temp,nRX1_Len);
  140. switch(nRes)
  141. {
  142. case 1:
  143. UART1_TX_BUF[0] = 'O';
  144.           UART1_TX_BUF[1] = 'K';
  145.           UART1_TX_BUF[2] = 13;
  146.           nTX1_Len = 3;
  147. // 设置中断标志,进入发送中断程序
  148. IFG2 |= UTXIFG1;
  149.          nRX1_Len = 0;
  150. break;
  151. case 2:
  152. for(n = 0;n < nRX1_Len;n++) 
  153. UART1_TX_BUF[n] = UART1_RX_Temp[n];
  154.           UART1_TX_BUF[nRX1_Len] = 'O';
  155.           UART1_TX_BUF[nRX1_Len+1] = 'K';
  156.           UART1_TX_BUF[nRX1_Len+2] = 13;
  157.           nTX1_Len = nRX1_Len + 3;
  158. // 设置中断标志,进入发送中断程序
  159. IFG2 |= UTXIFG1;
  160.          nRX1_Len = 0;
  161. break;
  162. case -1:
  163. UART1_TX_BUF[0] = 'E';
  164.           UART1_TX_BUF[1] = 'R';
  165. UART1_TX_BUF[2] = 'R';
  166.           UART1_TX_BUF[3] = 'O';
  167. UART1_TX_BUF[4] = 'R';
  168.           UART1_TX_BUF[5] = 13;
  169.           nTX1_Len = 6;
  170. // 设置中断标志,进入发送中断程序
  171. IFG2 |= UTXIFG1;
  172.          nRX1_Len = 0;
  173. break;
  174. }
  175. }
  176. }
  177. }
  178. int ProcessCMD(char pBuf[],int nLen)
  179. {
  180.     int nTemp = -1;
  181.     int i;
  182.     
  183.     if(nLen <= 2) return -1;
  184.     
  185. if (nLen == 5)
  186. {
  187. if((pBuf[0] == 'A') && (pBuf[1] == 'T') 
  188. && (pBuf[2] == 'E') && (pBuf[3] == '0')) 
  189. nTemp = 1;
  190. if((pBuf[0] == 'A') && (pBuf[1] == 'T') 
  191. && (pBuf[2] == 'E') && (pBuf[3] == '1')) 
  192. nTemp = 2;
  193. }
  194.     
  195.     return nTemp;
  196. }