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

DSP编程

开发平台:

C/C++

  1. #include <msp430x14x.h>
  2. //定义串口操作变量
  3. // 串口 1 的接收标志
  4. char nRev_UART1;
  5. // 串口 1 的发送缓冲区
  6. char UART1_TX_BUF[60];
  7. // 串口 1 的接收缓冲区
  8. char UART1_RX_BUF[60];
  9. int nTX1_Len;
  10. char nRX1_Len;
  11. char nRX1_Len_temp;
  12. char nTX1_Flag;
  13. char nTime_Flag;
  14. int nSend_TX1;
  15. char GetChar(void);
  16. typedef enum  
  17. { BAUD115200, BAUD57600,BAUD38400, BAUD19200,
  18.   BAUD14400,  BAUD9600, BAUD4800,  BAUD2400, 
  19.   BAUD1200       
  20. } baudrates;
  21. typedef struct {
  22.   char ubr00;
  23.   char ubr01;
  24.   char umctl0;
  25.   char *desc;
  26. } baudreg;
  27. // 串口寄存器的值 (UBR0_1, UBR1_1, UMCTL_1, Descr)
  28. const baudreg baudregs[] =
  29. {
  30.     0x45, 0x00, 0x00, "115200",    // BAUD115K
  31.     0x8b, 0x00, 0x00, "57600",     // BAUD57600
  32.     0xd0, 0x00, 0x00, "38400",     // BAUD38400
  33.     0xa0, 0x01, 0x00, "19200",     // BAUD19200
  34.     0x2c, 0x02, 0x00, "14400",     // BAUD14400
  35.     0x41, 0x03, 0x00, "9600",      // BAUD9600
  36.     0x83, 0x06, 0x00, "4800",      // BAUD4800
  37.     0x05, 0x0d, 0x00, "2400",      // BAUD2400
  38.     0x0b, 0x1a, 0x00, "1200"       // BAUD1200
  39. };
  40. void SetBaud(int baud);
  41. void Delay_8_33ms(void);
  42. void Init_UART1(void);
  43. void Init_CLK(void);
  44. void Init_TimerA(void);
  45. void Init_UART1(void)
  46. {
  47. //将寄存器的内容清零
  48.     U1CTL = 0X00;
  49. //数据位为8bit
  50.     U1CTL += CHAR;
  51.     
  52. //将寄存器的内容清零
  53.     U1TCTL = 0X00;
  54. //波特率发生器选择SMCLK
  55.     U1TCTL += SSEL1;     
  56. //波特率为115200
  57.     UBR0_1 = 0X45;
  58.     UBR1_1 = 0X00;
  59. //调整寄存器
  60.     UMCTL_1 = 0X00;
  61. //使能UART1的TXD和RXD
  62.     ME2 |= UTXE1 + URXE1; 
  63. //使能UART1的RX中断
  64.     IE2 |= URXIE1;
  65. //使能UART1的TX中断
  66.     IE2 |= UTXIE1;
  67.     
  68. //设置P3.6为UART1的TXD
  69.     P3SEL |= BIT6;
  70. //设置P3.7为UART1的RXD
  71.     P3SEL |= BIT7;     
  72. //P3.6为输出管脚
  73.     P3DIR |= BIT6;
  74.     return;
  75. }
  76. void Init_Port(void)
  77. {
  78.     //将所有的管脚在初始化的时候设置为输入方式
  79.     P3DIR = 0;
  80.     //将所有的管脚设置为一般I/O口
  81.     P3SEL = 0;
  82.     return;
  83. }
  84. // 初始定时器模块
  85. void Init_TimerA(void)
  86. {
  87. // 选择SMCLK,清除TAR
  88.     TACTL = TASSEL1 + TACLR;  
  89. // 1/8 SMCLK
  90.     TACTL += ID1;
  91.     TACTL += ID0; 
  92. // CCR0 中断允许
  93.     CCTL0 = CCIE;
  94. // 时间间隔为 33.8ms
  95.     CCR0 = 33800;
  96. // 增记数模式
  97.     TACTL |= MC0;     
  98. }
  99. void Init_CLK(void)
  100. {
  101.     unsigned int i;
  102. //将寄存器的内容清零
  103. //XT2震荡器开启
  104. //LFTX1工作在低频模式
  105. //ACLK的分频因子为1
  106.     BCSCTL1 = 0X00;
  107.     do 
  108.     {
  109. IFG1 &= ~OFIFG;                       // 清除OSCFault标志
  110. for (i = 0x20; i > 0; i--);                
  111.     }
  112.     while ((IFG1 & OFIFG) == OFIFG);      // 如果OSCFault =1   
  113.     BCSCTL2 = 0X00; //将寄存器的内容清零
  114.     BCSCTL2 += SELM1; //MCLK的时钟源为TX2CLK,分频因子为1
  115.     BCSCTL2 += SELS; //SMCLK的时钟源为TX2CLK,分频因子为1
  116. }
  117. ///////////////////////////////////////
  118. // 处理来自串口 1 的接收中断
  119. interrupt [UART1RX_VECTOR] void UART1_RX_ISR(void)
  120. {
  121.     //接收来自的数据 
  122.     UART1_RX_BUF[nRX1_Len_temp] = RXBUF1;
  123.     nRX1_Len_temp += 1;        
  124.     if(UART1_RX_BUF[nRX1_Len_temp - 1] == 13)
  125.     {
  126.      nRX1_Len = nRX1_Len_temp;
  127.      nRev_UART1 = 1;
  128.      nRX1_Len_temp = 0;
  129.     }
  130. }
  131. ///////////////////////////////////////
  132. // 处理来自串口 1 的发送中断
  133. interrupt [UART1TX_VECTOR] void UART1_TX_ISR(void)
  134. {
  135.     if(nTX1_Len != 0)
  136.     {
  137. // 表示缓冲区里的数据没有发送完
  138.      nTX1_Flag = 0;     
  139.      TXBUF1 = UART1_TX_BUF[nSend_TX1];
  140.      nSend_TX1 += 1;    
  141.      if(nSend_TX1 >= nTX1_Len)
  142.      {
  143.          nSend_TX1 = 0;
  144.          nTX1_Len = 0;
  145.          nTX1_Flag = 1;
  146.      }
  147.     }
  148. }
  149. // 定时器中断
  150. interrupt [TIMERA0_VECTOR] void TimerA_ISR(void)
  151. {
  152.     nTime_Flag = 1;
  153. // CCR0 不中断允许
  154.     CCTL0 &= ~CCIE;
  155. }
  156. void SetBaud(int baud)
  157. {
  158. //停止UART
  159. U1CTL |= SWRST;
  160. //禁止中断
  161. ME2 &= ~(UTXE0 + URXE0); 
  162. //设置寄存器
  163. UBR0_1 = baudregs[baud].ubr00;
  164. UBR1_1 = baudregs[baud].ubr01;
  165. UMCTL_1 = baudregs[baud].umctl0;
  166. //使能中断
  167. ME2 |= UTXE0 + URXE0;
  168. //UART模块允许
  169. U1CTL &= ~SWRST;
  170. }
  171. int AutoBaud(void)
  172. {
  173. baudrates rate;
  174. //UART复位
  175. U1CTL |= SWRST;
  176. //接收出错中断允许位
  177. URCTL1 = URXEIE; 
  178. //UART模块允许
  179. U1CTL &= ~SWRST; 
  180. //设置速率位115200
  181. SetBaud(BAUD115200);
  182. //接收字符
  183. switch (GetChar()) 
  184. {
  185. case 0x0d :
  186. rate = BAUD115200;
  187. break;
  188. case 0xe6 :
  189. rate = BAUD57600;
  190. break;
  191. case 0x1c :
  192. rate = BAUD38400;
  193. break;
  194. case 0xe0 :
  195. rate = BAUD19200;
  196. break;
  197. case 0x80 :
  198. rate = BAUD14400;
  199. break;
  200. case 0x00 :
  201. {
  202. // CCR0 中断允许
  203.         CCTL0 = CCIE;
  204. //延时33.8ms
  205. while(1)
  206. {
  207. if(nTime_Flag == 1)
  208. {
  209. nTime_Flag = 0;
  210. break;
  211. }
  212. }
  213. //设置速率位9600
  214. SetBaud(BAUD9600);
  215. //接收字符
  216. switch (GetChar())  
  217. {
  218. case 0x0d : 
  219. rate = BAUD9600;
  220. break;
  221. case 0xe6 :
  222. rate = BAUD4800;
  223. break;
  224. case 0x78 :
  225. rate = BAUD2400;
  226. break;
  227. case 0x80 :
  228. rate = BAUD1200;
  229. break;
  230. default :
  231. return -1;
  232. }
  233. break;
  234. }
  235. default :
  236. return -1;
  237. }
  238. // CCR0 中断允许
  239.     CCTL0 = CCIE;
  240. //延时33.8ms
  241. while(1)
  242. {
  243. if(nTime_Flag == 1)
  244. {
  245. nTime_Flag = 0;
  246. break;
  247. }
  248. }
  249. SetBaud(rate);
  250. return 0;
  251. }
  252. char GetChar(void)
  253. {
  254.   while (!(IFG2 & URXIFG1));
  255.   return RXBUF1;
  256. }