msp430x43x的串口通信例程

2019-07-25 13:49发布

#include "msp430x43x.h"void init_uart(void);void uart_start(void);void uart_send(void);void uart_receive(void); unsigned char RXDATA_BUF[10];const unsigned char TXDATA_BUF[10]={0xbd,0x77,0x3d,0xc5,0xc6,0xf5,0x68,0x0d,0x6b,0xff};unsigned int RX_count=0,TX_count=0,TXBUF_num=10,RXBUT_num=10,FLAG; void main(void){       init_uart();    uart_start();    while(1)    {      _BIS_SR(CPUOFF);      _NOP();    }} void init_uart(void)                    //初始化UART{       unsigned int i;    WDTCTL=WDTPW+WDTHOLD;      FLL_CTL1|=XT2OFF+SELM_XT2+SELS;            do                                  //等待时钟稳定    {           IFG1&=~OFIFG;                   //清除OSCFault        for(i=0;i<0xff;i++);            //延时    }    while((FLL_CTL0&XT2OF)==XT2OF);    UCTL0|=SWRST;                       //控制寄存器位    UCTL0|=CHAR;    UTCTL0=SSEL0+SSEL1;                 //选择发送时钟源复位    UBR00=0XA0;                         //波特率9600    UBR10=0X01;    UMCTL0=0X5E;    UCTL0&=~SWRST;                      //选择发送时钟源置位    ME1|=URXE0+UTXE0;                   //使能TXD  RXD    IE1|=URXIE0;    IFG1=0X00;    P2SEL|=0X30;                        //模块选用,p2.4,5USART0收发    P2DIR|=0X10;    for(i=0;i<10;i++)     RXDATA_BUF=0;                    //    清接收缓存    _EINT();} void uart_start(void)                   //启动发送{       IE1|=UTXIE0;    while((UTCTL0&BIT0)!=BIT0);    TXBUF0=TXDATA_BUF[0];    TX_count=1;} void uart_receive(void)                 //接收{       RXDATA_BUF[RX_count]=RXBUF0;    RX_count+=1;    if(RX_count>=RXBUT_num) {RX_count=0;}} void uart_send(void)                    //发送{      TXBUF_num-=1;    if(TXBUF_num>0)      {             TXBUF0=TXDATA_BUF[TX_count];          TX_count+=1;               }    else     {           FLAG+=1;        if(FLAG>10)          {IE1&=~UTXIE0;}         else           {              TXBUF_num=10;           TX_count=0;           uart_start();         }     }} #pragma vector=USART0RX_VECTOR__interrupt void UartRx(void)//发送中断响应{       uart_send();} #pragma vector=USART0TX_VECTOR__interrupt void UartTx(void)//接收中断响应{    uart_receive();}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
哆来咪
1楼-- · 2019-07-25 16:20
不是都有库了么?还用的都是寄存器
月正浓
2楼-- · 2019-07-25 20:34
 精彩回答 2  元偷偷看……
豆腐块
3楼-- · 2019-07-26 00:42
const unsigned char TXDATA_BUF[10]
前边加上const ,是不是就把数组放到flash里了
android2
4楼-- · 2019-07-26 01:00
感谢分享
李香兰
5楼-- · 2019-07-26 01:18
  1. #include "msp430x43x.h"
  2. void init_uart(void);
  3. void uart_start(void);
  4. void uart_send(void);
  5. void uart_receive(void);
  6. unsigned char RXDATA_BUF[10];
  7. const unsigned char TXDATA_BUF[10]={0xbd,0x77,0x3d,0xc5,0xc6,0xf5,0x68,0x0d,0x6b,0xff};
  8. unsigned int RX_count=0,TX_count=0,TXBUF_num=10,RXBUT_num=10,FLAG;
  9. void main(void)
  10. {   
  11.     init_uart();
  12.     uart_start();
  13.     while(1)
  14.     {
  15.       _BIS_SR(CPUOFF);
  16.       _NOP();
  17.     }
  18. }
  19. void init_uart(void)                    //初始化UART
  20. {   
  21.     unsigned int i;
  22.     WDTCTL=WDTPW+WDTHOLD;  
  23.     FLL_CTL1|=XT2OFF+SELM_XT2+SELS;        
  24.     do                                  //等待时钟稳定
  25.     {   
  26.         IFG1&=~OFIFG;                   //清除OSCFault
  27.         for(i=0;i<0xff;i++);            //延时
  28.     }
  29.     while((FLL_CTL0&XT2OF)==XT2OF);
  30.     UCTL0|=SWRST;                       //控制寄存器位
  31.     UCTL0|=CHAR;
  32.     UTCTL0=SSEL0+SSEL1;                 //选择发送时钟源复位
  33.     UBR00=0XA0;                         //波特率9600
  34.     UBR10=0X01;
  35.     UMCTL0=0X5E;
  36.     UCTL0&=~SWRST;                      //选择发送时钟源置位
  37.     ME1|=URXE0+UTXE0;                   //使能TXD  RXD
  38.     IE1|=URXIE0;
  39.     IFG1=0X00;
  40.     P2SEL|=0X30;                        //模块选用,p2.4,5为USART0收发
  41.     P2DIR|=0X10;
  42.     for(i=0;i<10;i++)
  43.     RXDATA_BUF=0;                    //    清接收缓存
  44.     _EINT();
  45. }
  46. void uart_start(void)                   //启动发送
  47. {   
  48.     IE1|=UTXIE0;
  49.     while((UTCTL0&BIT0)!=BIT0);
  50.     TXBUF0=TXDATA_BUF[0];
  51.     TX_count=1;
  52. }
  53. void uart_receive(void)                 //接收
  54. {   
  55.     RXDATA_BUF[RX_count]=RXBUF0;
  56.     RX_count+=1;
  57.     if(RX_count>=RXBUT_num) {RX_count=0;}
  58. }
  59. void uart_send(void)                    //发送
  60. {  
  61.     TXBUF_num-=1;
  62.     if(TXBUF_num>0)
  63.       {   
  64.           TXBUF0=TXDATA_BUF[TX_count];
  65.           TX_count+=1;
  66.          
  67.       }
  68.     else
  69.      {   
  70.         FLAG+=1;
  71.         if(FLAG>10)  
  72.         {IE1&=~UTXIE0;}
  73.          else  
  74.          {   
  75.            TXBUF_num=10;
  76.            TX_count=0;
  77.            uart_start();
  78.          }
  79.      }
  80. }
  81. #pragma vector=USART0RX_VECTOR
  82. __interrupt void UartRx(void)//发送中断响应
  83. {   
  84.     uart_send();
  85. }
  86. #pragma vector=USART0TX_VECTOR
  87. __interrupt void UartTx(void)//接收中断响应
  88. {
  89.     uart_receive();
  90. }
复制代码
STM32初学者
6楼-- · 2019-07-26 03:34
好久没有配置过寄存器了

一周热门 更多>