发新帖我要提问
123
返回列表
打印
[MCU]

USCI模块例程

[复制链接]
楼主: zhanghqi
手机看帖
扫描二维码
随时随地手机跟帖
41
chuxh| | 2020-6-29 23:48 | 只看该作者 回帖奖励 |倒序浏览
430的波特率设置用三个寄存器实现:
    UxBR0:波特率发生器分频系数低8位;
    UxBR1:波特率发生器分频系数高8位;
    UxMCTL:波特率发生器分频系数的小数部分实现;

使用特权

评论回复
42
spark周| | 2020-6-29 23:49 | 只看该作者

void InitUARTA1(void)
{
  UCA1CTL1 |= UCSWRST;// PUC后,UCSWRST位自动置位,这使 USCI保持在复位状态
  UCA1CTL0 = 0x00;                        
  UCA1CTL1 |= UCSSEL_2;                     // SMCLK
  UCA1BR0 = 216;                            // 24MHz 115200
  UCA1BR1 = 0;                              // 24MHz 115200
  UCA1MCTL = UCBRS_2 + UCBRF_0;             // 0x04+0x00
  P5SEL = 0xC0;                             // P5.6/7 = USCI_A0 TXD/RXD
  UCA1CTL1 &= ~UCSWRST;    // **Initialize USCI state machine**,。清除UCSWRST 将释放 USCI,         UCA1IE |= UCRXIE;                          // Enable USCI_A1 RX interrupt
}
#pragma vector = USCI_A1_VECTOR
__interrupt void USCI_A1_ISR(void)
{
  switch (__even_in_range(UCA1IV,4))
  {
  case 0:break;                             
  case 2:
   g_uartBufA[g_bufALen] = UCA1RXBUF;
   if (g_uartBufA[g_bufALen]==0xFF)
   {
    }
   if (g_uartBufA[g_bufALen++]==0xFD) //判断PC机发送的命令帧是否已完
   {
     g_bufALen=0;
     g_uartReceive = 1;// 置位
   }
  break;
  case 4:break;                             // Vector 4 - TXIFG
  default: break;
  }
}
void USciSend( )
{
  unsigned char i;
  for (i = 0; i < g_bufALen; i++)
  {
    while (!(UCA1IFG & UCTXIFG));
    UCA1TXBUF = g_uartBufA[uartBuf1];
  }
}// UCA1MCTL 是UCA1的调制控制寄存器

使用特权

评论回复
43
zhaoxqi| | 2020-6-29 23:51 | 只看该作者

在低频模式下,分频因子的整数部分通过预分频器实现 UCBRx = INT(N);
    小数部分由带有下面nominal公式的调制器实现: UCBRSx = round((N–INT(N))× 8),(round表示舍入)

使用特权

评论回复
44
午夜粪车| | 2020-6-29 23:53 | 只看该作者
UCA1CTL1 |= UCSSEL_2;                     // SMCLK
  UCA1BR0 = 216;                            // 24MHz 115200
  UCA1BR1 = 0;                              // 24MHz 115200
  UCA1MCTL = UCBRS_2 + UCBRF_0;             // 0x04+0x00

使用特权

评论回复
45
zhenykun| | 2020-6-29 23:54 | 只看该作者

//   HW UART(J4)!!!!!! 特别注意,板子上J4有2个跳线要竖放,设为HW UART模式
//   MSP430G2xx3 Demo - USCI_A0, 9600 UART Echo ISR, DCO SMCLK
//
//   Description: Echo a received character, RX ISR used. Normal mode is LPM0.
//   USCI_A0 RX interrupt triggers TX Echo.
//   Baud rate divider with 16MHz
//   ACLK = n/a, MCLK = SMCLK = CALxxx_16MHZ = 16MHz
//
//                MSP430G2xx3
//             -----------------
//         /|\|              XIN|-
//          | |                 |
//          --|RST          XOUT|-
//            |                 |
//            |     P1.2/UCA0TXD|------------>
//            |                 | 9600 - 8N1
//            |     P1.1/UCA0RXD|<------------
//
//   修改http://jiwm.blog.163.com

//串口调试助手,下载地址:http://www.sudt.com/download/AccessPort137.zip
//   Texas Instruments Inc.
//   February 2011
//   Built with  IAR Embedded Workbench Version: 5.40
//******************************************************************************
#include  "msp430g2553.h"

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  BCSCTL1 = CALBC1_16MHZ;                    // Set DCO
  DCOCTL = CALDCO_16MHZ;
  P1SEL = BIT1 + BIT2 ;                     // P1.1 = RXD, P1.2=TXD
  P1SEL2 = BIT1 + BIT2;                     
  UCA0CTL1 |= UCSSEL_2;                     // SMCLK
  UCA0BR0 = 0x82;                              // 16MHz 9600 UCA0BRX=1666=0x0682
  UCA0BR1 = 0x06;                              // 16MHz 9600
  UCA0MCTL = UCBRS2 + UCBRS1;               // Modulation UCBRSx = 6
  UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
  IE2 |= UCA0RXIE;                          // Enable USCI_A0 RX interrupt

  __bis_SR_register(LPM0_bits + GIE);       // Enter LPM0, interrupts enabled
}

// Echo back RXed character, confirm TX buffer is ready first
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
  while (!(IFG2&UCA0TXIFG));                // USCI_A0 TX buffer ready?
  UCA0TXBUF = UCA0RXBUF;                    // TX -> RXed character
}

使用特权

评论回复
46
zhenykun| | 2020-6-29 23:55 | 只看该作者

#include "MSP430G2553.h"





   #define LED1_ON P1DIR|=BIT0; P1OUT|=BIT0



   #define LED1_OFF P1DIR|=BIT0; P1OUT&=~BIT0



   #define LED2_ON P1DIR|=BIT6; P1OUT|=BIT6



   #define LED2_OFF P1DIR|=BIT6; P1OUT&=~BIT6

   #define RX_FIFO_SIZE   16                      //接收缓冲区大小宏定义



   #define TX_FIFO_SIZE   64                      //发送缓冲区大小宏定义

   unsigned char Rx_FIFO[RX_FIFO_SIZE]={0};     //UART接收FIFO数组



   unsigned int Rx_FIFO_DataNum=0;              //UART接收FIFO的“空满”指示变量



   unsigned int Rx_FIFO_IndexR=0;               //UART接收FIFO的模拟“读指针”变量



   unsigned int Rx_FIFO_IndexW=0;               //UART接收FIFO的模拟“写指针”变量



   unsigned char Tx_FIFO[TX_FIFO_SIZE]={0};     //UART发送FIFO数组



   unsigned int Tx_FIFO_DataNum=0;              //UART发送FIFO的“空满”指示变量



   unsigned int Tx_FIFO_IndexR=0;               //UART发送FIFO的模拟“读指针”变量



   unsigned int Tx_FIFO_IndexW=0;               //UART 发送FIFO 的模拟“写指针”变量

   extern  unsigned char  Rx_FIFO[RX_FIFO_SIZE];



   extern  unsigned int  Rx_FIFO_DataNum;



   extern  unsigned int  Rx_FIFO_IndexR;



   extern  unsigned int  Rx_FIFO_IndexW;



   extern  unsigned char  Tx_FIFO[TX_FIFO_SIZE];



   extern  unsigned int  Tx_FIFO_DataNum;



   extern  unsigned int  Tx_FIFO_IndexR;



   extern  unsigned int Tx_FIFO_IndexW;

   const unsigned char Out_DELETE[]= "\x8  \x8";     /* VT100 backspace and clear */



   const unsigned char String1[]="命令:LED1_ON LED1_OFF LED2_ON LED2_OFF\r\n";



   const unsigned char String2[]="Please input Command:\r\n";



   const   unsigned char String3[]="Are you crazy?\r\n";



   const   unsigned char String4[]="I was born for these!\r\n";



   const   unsigned char String5[]="I have got it!\r\n";



   const   unsigned char String6[]="It is easy for me!\r\n";



   const   unsigned char String7[]="As your wish!\r\n";

void  UART_OnTx(void);

void  UART_OnRx(void);

void  UART_SendString(const  unsigned char *Ptr);

void  Command_match();



   /******************************************************************************************************



    *  名  称:Rx_FIFO_WriteChar()



    *  功   能:往Rx接收FIFO中写1字节



    *  入口参数:Data:待写入FIFO的数据



    * 出口参数:1:写入数据成功,0 :写入数据失败



    *  说   明:操作FIFO时需要关闭总中断



    * 范  例:无



   ******************************************************************************************************/



   char Rx_FIFO_WriteChar(unsigned  char Data)



   {



       if(Rx_FIFO_DataNum==RX_FIFO_SIZE)  return(0);



                                    //判断FIFO是否已装满未读数据,如果装满返回0



       _DINT();                 //操作FIFO前一定要关总中断



       Rx_FIFO_DataNum++;                      //未读取数据个数加一



       Rx_FIFO[Rx_FIFO_IndexW]=Data;           //将数据写入写读指针位置的FIFO数组



       Rx_FIFO_IndexW++;                        //写指针移位



       if (Rx_FIFO_IndexW>=RX_FIFO_SIZE)       //判断指针是否越界



            Rx_FIFO_IndexW=0;                  //写指针循环归零



       _EINT();                   //恢复总中断使能



       return(1);                              //返回成功



   }



   char Rx_FIFO_ReadChar(unsigned  char *Chr)



   {



       if(Rx_FIFO_DataNum==0) return(0);   //判断FIFO是是否有未读数据,如果没有返回0



       _DINT();             //操作FIFO前一定要关总中断



       Rx_FIFO_DataNum--;                  //待读取数据个数减一



       *Chr=Rx_FIFO[Rx_FIFO_IndexR];        //将读指针位置的FIFO数据赋给指针所指变量



       Rx_FIFO_IndexR++;                    //读指针移位



       if (Rx_FIFO_IndexR>=RX_FIFO_SIZE)    //判断指针是否越界



            Rx_FIFO_IndexR=0;               //读指针循环归零



       _EINT();              //恢复总中断使能



       return(1);



   }

   void  Rx_FIFO_Clear()



   {



       _DINT();                  //操作FIFO前一定要关总中断



       Rx_FIFO_DataNum=0;                       //FIFO 中未读取数据数目清零

            Rx_FIFO_IndexR=0;                  //FIFO 中模拟读指针清零



      Rx_FIFO_IndexW=0;                 //FIFO 中模拟写指针清零



      _EINT ();            //恢复总中断使能



  }

   char Tx_FIFO_WriteChar(unsigned  char Data)



   {



       if(Tx_FIFO_DataNum==TX_FIFO_SIZE)  return(0);



                                       //判断FIFO是否已装满未读数据,如果装满返回0



       _DINT();                  //操作FIFO前一定要关总中断



       //-----“全新”一次发送数据必须手动触发Tx中断-----



       if((Tx_FIFO_DataNum==0) &&( !(UCA0STAT & UCBUSY)))



                                               //判断是否为一次“全新”发送



            IFG2 |=UCA0TXIFG;                  // 手动触发一次



       Tx_FIFO_DataNum++;                      //未读取数据个数加一



       Tx_FIFO[Tx_FIFO_IndexW]=Data;           //将数据写入写读指针位置的FIFO数组



       Tx_FIFO_IndexW++;                       //写指针移位



       if (Tx_FIFO_IndexW   >= TX_FIFO_SIZE)   //判断指针是否越界



            Tx_FIFO_IndexW=0;                  //写指针循环归零



       _EINT();                  //恢复总中断使能



       return(1);                              //返回成功



   }

   char Tx_FIFO_ReadChar(unsigned    char *Chr)



   {



        if(Tx_FIFO_DataNum==0) return(0);   //判断FIFO是是否有未读数据,如果没有返回0



        _DINT();              //操作FIFO前一定要关总中断



        Tx_FIFO_DataNum --;                  //待读取数据个数减一



        *Chr=Tx_FIFO[Tx_FIFO_IndexR];       //将读指针位置的FIFO数据赋给指针所指变量



        Tx_FIFO_IndexR++;                    //读指针移位



        if (Tx_FIFO_IndexR>=TX_FIFO_SIZE)    //判断指针是否越界



            Tx_FIFO_IndexR=0;                //读指针循环归零



        _EINT();               //恢复总中断使能



        return(1);                           //返回成功



   }

   void Tx_FIFO_Clear()



   {



        _DINT();                   //操作FIFO前一定要关总中断



        Tx_FIFO_DataNum=0;                         //FIFO 中未读取数据数目清零



        Tx_FIFO_IndexR=0;                          //FIFO 中模拟读指针清零



        Tx_FIFO_IndexW=0;                          //FIFO 中模拟写指针清零



        _EINT();                     //恢复总中断使能



   }

   /******************************************************************************************************



    *  名  称:USCI_A0_init()



    *  功    能:初始化USCI_A0模块为UART模式



    *  入口参数:无



    * 出口参数:无



    *  说    明:UART设为波特率9600,8位数据,无校验,1位停止位



    *             UART初始化配置较复杂,可以使用Grace配置后再移植代码的方法



    * 范  例:无



   ******************************************************************************************************/



   void  USCI_A0_init(void)



   {



       //-----开启IO口的TXD和RXD功能-----



          P1SEL = BIT1 + BIT2 ;                   // P1.1 = RXD, P1.2=TXD



          P1SEL2 = BIT1 + BIT2;



         //-----设置UART时钟源为ACLK-----



          UCA0CTL1 |= UCSSEL_1;                    // CLK = ACLK



         //-----移植Grace配置的波特率参数-----



          UCA0BR0 = 0x03;                         // 32kHz/9600 = 3.41



          UCA0BR1 = 0x00;



          UCA0MCTL = UCBRS1 + UCBRS0;             // Modulation UCBRSx = 3



          UCA0CTL1 &= ~UCSWRST;                   // **Initialize USCI state machine**

                   IE2 |= UCA0RXIE + UCA0TXIE;                // Enable USCI_A0 TX/RX interrupt



         _EINT();                     //开总中断



   }



   /******************************************************************************************************



    *  名  称:USCI0TX_ISR()



    *  功    能:响应Tx中断服务



    *  入口参数:无



    * 出口参数:无



    *  说    明:凡是中断标志位有可能不被自动清除的,均手动清除一次,以防万一



    * 范  例:无



   ******************************************************************************************************/



   #pragma vector=USCIAB0TX_VECTOR



   __interrupt void  USCI0TX_ISR(void)



   {



       IFG2&=~UCA0TXIFG;                           //手动清除标志位



        UART_OnTx();                               //调用Tx事件处理函数



   }



   /******************************************************************************************************



    *  名  称:USCI0RX_ISR()



    *  功    能:响应Rx中断服务



    *  入口参数:无



    * 出口参数:无



    *  说    明:凡是中断标志位有可能不被自动清除的,均手动清除一次,以防万一



    * 范  例:无



   ******************************************************************************************************/



   #pragma vector=USCIAB0RX_VECTOR



   __interrupt void  USCI0RX_ISR(void)



   {



        IFG2&=~UCA0RXIFG;                         //手动清除标志位



        UART_OnRx();                               //调用Rx事件处理函数



   }

    void  Command_match();

   

      void  UART_OnTx(void)



   {



        unsigned char Temp=0;



        if(Tx_FIFO_DataNum>0)



        {



             Tx_FIFO_ReadChar(&Temp);                 //调用FIFO库函数



              UCA0TXBUF= Temp;



        }

          }

使用特权

评论回复
47
jlyuan| | 2020-6-29 23:56 | 只看该作者
要确中断程序进了

使用特权

评论回复
48
chenjunt| | 2020-6-29 23:57 | 只看该作者
使用MSP430 F149开发板向和PC机进行串口通信

使用特权

评论回复
49
chenjunt| | 2020-6-29 23:59 | 只看该作者

#include  <msp430x14x.h>
unsigned char TBuff[8]={1,2,3,4,5,6,7,8}; // 发送缓冲区
void USART_Send(unsigned char *pData)
{
  unsigned char j;
  for(j=0; j<8; j++)
  {
    TXBUF0 = pData[j]; // 装入发送寄存器
    while ((IFG1 & UTXIFG0) == 0); // 判断:发送是否完成
    IFG1 &= ~(UTXIFG0);
  }
}
void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  P3SEL |= 0x30;                            // P3.4,5 = USART0 TXD/RXD
  ME1 |= UTXE0 + URXE0;                     // Enable USART0 TXD/RXD
  UCTL0 |= CHAR;                            // 8-bit character
  UTCTL0 |= SSEL0;                          // UCLK = ACLK
  UBR00 = 0x1B;                             // 32k/2400 - 13.65
  UBR10 = 0x00;                             //
  UMCTL0 = 0x03;                            // Modulation
  UCTL0 &= ~SWRST;                          // Initialize USART state machine
  IE1 |= URXIE0;                            // Enable USART0 RX interrupt
  _EINT();                                  // interrupt
  
  while(1)
  {
    USART_Send(TBuff);
  }
}

使用特权

评论回复
50
dengdc| | 2020-6-30 22:08 | 只看该作者
波特率不对吧
  UBR00 = 0x0D;                             // 32k/2400 - 13.65
  UBR10 = 0x00;                             
  UMCTL0 = 0x6B;

使用特权

评论回复
51
zhanghqi|  楼主 | 2020-6-30 22:09 | 只看该作者
嗯,我再好好缕一缕吧,有了好消息及时通知大家

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则