⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart.c

📁 MSP430 44X系列的异步通信模块操作代码
💻 C
字号:
/******************************************************
* 文件名称:uart.c
* 文件说明:
*          RS232通迅使用的UART0 模块 
*****************************************************/
#ifndef MSP430XF449_H
#include <msp430x44x.h>
#endif

#define UART_BUF_SIZE 6
/*****************************************************/
/*   数据定义                                        */
/*****************************************************/
char uart_RBuf[UART_BUF_SIZE];   //接收缓冲区
char uart_TBuf[UART_BUF_SIZE];   //发送缓冲区
unsigned char uart_RDataPos,     //用于指示下一个存放接收数据的缓冲区位置
              uart_RFlag,        // 接收缓冲区缓存的数据数目(单位字符)
              uart_TNum,         // 发送缓冲区缓存的数据数目(单位字符)
              uart_TPos;         // 标识 uart 下一个要发送的数据的位置
/*******************************************************
*     模块初始化
*******************************************************/
void init_UART(void)
{
    unsigned char tmpv;
    FLL_CTL0 &= 0xbf;
    UCTL0 |=SWRST;
    UCTL0 |=CHAR;                           // 8-bit 字符
    /*UTCTL0= 0x10;                         // UCLK=ACLK
    UBR00 = 0x0d;                           // 在32768下进行 2400波特率通信
    UBR10 = 0x00;                           // 在32768下进行 2400波特率通信
    UMCTL0= 0x57;                           // 调整寄存器
   */
       
    FLL_CTL1|=SELS+XT2OFF+SELM_XT2;        //开启第二个振荡器
    do 
    {
      IFG1 &= ~OFIFG;                      // 清除OSCFault标志
      for(tmpv = 0xff;tmpv > 0;tmpv--);    //
    }while ((FLL_CTL0&XT2OF) == XT2OF );   // 第二个振荡器是否正常工作
    UCTL0|=SWRST;
    UCTL0|=CHAR;                           // 8-bit 字符
    UTCTL0=SSEL0+SSEL1;                    // UCLK=SMCLK
    UBR00=0xa0;                            // 在4MHz下进行 9600波特率通信
    UBR10=0x01;                            // 在4MHz下进行 9600波特率通信
    UMCTL0=0x5e;                           // 调整寄存器
    UCTL0&=~SWRST;
    
    ME1|= (UTXE0 + URXE0);                 // 使能 USART0 TXD/RXD
    IE1|= URXIE0 ;
    IFG1 = 0x00;
    P2SEL |= 0x30;                         // P2.4,P2.5 = USART0 TXD/RXD
    P2DIR |= 0x10;
    uart_RDataPos = 0;
    uart_TNum =0 ;
    for(tmpv=0;tmpv<UART_BUF_SIZE;tmpv++)
    {
       uart_RBuf[tmpv] = 0;
    }
}
/****************************************************
*     数据发送
****************************************************/
void uart_Start(void)
{
    IE1 |= UTXIE0 ;
    while((UTCTL0 & 0x01 )!=0x01);        //等待直到没有数据发送
    TXBUF0 = uart_TBuf[0];                //发送数据
    uart_TPos = 1;
}

/****************************************************
*     数据接收中断
****************************************************/
#pragma vector = UART0RX_VECTOR 
__interrupt void data_Receive(void)       // UART接收中断
{     
    uart_RBuf[uart_RDataPos]=RXBUF0-48;  //从asc码转变到单片机键码索引
                                         //从asc码转变到单片机键码索引
    uart_RDataPos = (uart_RDataPos + 1); //移动接收缓冲区指针
    if (uart_RDataPos >= UART_BUF_SIZE)
    {
        uart_RDataPos = 0;
    }
    uart_RFlag += 1;                    //接收数据计数器加1
}
#pragma vector = UART0TX_VECTOR
__interrupt void __uart_Send(void)
{
    uart_TNum -= 1;
    if (uart_TNum >0)
    {
        TXBUF0 = uart_TBuf[uart_TPos];
        uart_TPos +=1; 
    }else {
       IE1 &= 0x7f;                   //disable UTXIE0
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -