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

📄 uart.c

📁 msp430单片机设计实例及其综合知识。
💻 C
字号:
#include <msp430x14x.h>
#include "uart.h"
#include "flash.h"

//定义串口操作变量
// 串口 1 的接收标志
char nRev_UART1;			
// 串口 1 的发送缓冲区
char UART1_TX_BUF[60];	
// 串口 1 的接收缓冲区	
char UART1_RX_BUF[100];	
int nSend_TX1;
int nTX1_Len;
char nRX1_Len;
char nRX1_Len_temp;
char nTX1_Flag;
int nRes_UART1;
int program = 0;
int complete = 0;
unsigned int *pWriteAddr;

#define ADDRESS     0x1100
#define SEG_SIZE    512;

void Init_UART1(void)
{
    //将寄存器的内容清零
    U1CTL = 0X00;	
    //数据位为8bit
    U1CTL += CHAR;			
    
    //将寄存器的内容清零
    U1TCTL = 0X00;	
    //波特率发生器选择SMCLK
    U1TCTL += SSEL1;			
    
    //波特率为57600
    UBR0_1 = 0X8B;			
    UBR1_1 = 0X00;
    //调整寄存器
    UMCTL_1 = 0X00;			

    //使能UART1的TXD和RXD
    ME2 |= UTXE1 + URXE1; 
    //使能UART1的RX中断
    IE2 |= URXIE1;	
    //使能UART1的TX中断
    IE2 |= UTXIE1;			
    
    //设置P3.6为UART1的TXD
    P3SEL |= BIT6;	
    //设置P3.7为UART1的RXD
    P3SEL |= BIT7;			
    
    //P3.6为输出管脚
    P3DIR |= BIT6;			
    return;
}
void Init_Port(void)
{
    //将所有的管脚在初始化的时候设置为输入方式
    P3DIR = 0;

    //将所有的管脚设置为一般I/O口
    P3SEL = 0;
    return;
}
void Init_CLK(void)
{
    unsigned int i;
    //将寄存器的内容清零
    //XT2震荡器开启
    //LFTX1工作在低频模式
    //ACLK的分频因子为1
    BCSCTL1 = 0X00;	
					
    do 
    {
	IFG1 &= ~OFIFG;                       // 清除OSCFault标志
	for (i = 0x20; i > 0; i--);                
    }
    while ((IFG1 & OFIFG) == OFIFG);      // 如果OSCFault =1   
					
    BCSCTL2 = 0X00;			//将寄存器的内容清零
    BCSCTL2 += SELM1;		//MCLK的时钟源为TX2CLK,分频因子为1
    BCSCTL2 += SELS;		//SMCLK的时钟源为TX2CLK,分频因子为1
}
///////////////////////////////////////
// 处理来自串口 1 的接收中断
#if __VER__ < 200
    interrupt [UART1RX_VECTOR] void UART1_RX_ISR(void)
#else
    #pragma vector=UART1RX_VECTOR
    __interrupt void UART1_RX_ISR(void)
#endif
{
    if(program == 0)
    {
        //处理命令
        //接收来自的数据  
        UART1_RX_BUF[nRX1_Len_temp] = RXBUF1;	    
        nRX1_Len_temp += 1;        
        if(UART1_RX_BUF[nRX1_Len_temp - 1] == 13)
        {
    	    nRX1_Len = nRX1_Len_temp;
    	    nRev_UART1 = 1;
    	    nRX1_Len_temp = 0;
        }
    }
    else if(program == 1)
    {
        //处理数据传输
        //接收来自的数据  
        UART1_RX_BUF[nRX1_Len_temp] = RXBUF1;	    
        nRX1_Len_temp += 1;        
        if(UART1_RX_BUF[nRX1_Len_temp - 1] == 13)
        {
            //数据传输完成
    	    nRX1_Len = nRX1_Len_temp;
    	    nRev_UART1 = 1;
    	    nRX1_Len_temp = 0;
            complete = 1;
        }
        else if(nRX1_Len_temp >= 100)
        {
            //数据传输未完成
            nRX1_Len = nRX1_Len_temp;
    	    nRev_UART1 = 1;
    	    nRX1_Len_temp = 0;
            complete = 0;
        }
    }
    
}
///////////////////////////////////////
// 处理来自串口 1 的发送中断
#if __VER__ < 200
    interrupt [UART1TX_VECTOR] void UART1_TX_ISR(void)
#else
    #pragma vector=UART1TX_VECTOR
    __interrupt void UART1_TX_ISR(void)
#endif
{
    if(nTX1_Len != 0)
    {
        // 表示缓冲区里的数据没有发送完
    	nTX1_Flag = 0;			
    	
    	TXBUF1 = UART1_TX_BUF[nSend_TX1];
    	nSend_TX1 += 1;
    	
    	if(nSend_TX1 >= nTX1_Len)
    	{
    	    nSend_TX1 = 0;
    	    nTX1_Len = 0;
    	    nTX1_Flag = 1;
    	}
    }
}
void main(void)
{
    int i;    
    unsigned int *pAddr;
    int nRes = 0;
    
    char UART1_RX_Temp[100];

    // 关闭看门狗
    WDTCTL = WDTPW + WDTHOLD;   
    
    nRev_UART1 = 0;
    nSend_TX1 = 0;
    // 关闭中断
    _DINT();
	
    // 初始化时钟
    Init_CLK();
    // 初始化端口
    Init_Port();
    // 初始化串口1
    Init_UART1();

    program = 0;
    pWriteAddr = (unsigned int*)ADDRESS;
    // 打开中断
    _EINT();
 	
    // 进入处理循环
    for(;;)
    {
    	if(nRev_UART1 == 1)
    	{
    	    nRev_UART1 = 0;
	    // 将接收到的数据拷贝到临时缓冲区
	    for(i = 0;i < nRX1_Len;i++) 
            {
		UART1_RX_Temp[i] = UART1_RX_BUF[i];
            }
            
            //处理写数据
            if(program == 1)
            {
                //写入数据
                for(i = 0;i < nRX1_Len;i++)
                {
                    FLASH_wb((pWriteAddr + i),UART1_RX_Temp[i]);
                }                
                //移动地址
                pWriteAddr += nRX1_Len;
                
                //判断数据传输是否完成
                if(complete == 1)
                {
                    //发送响应结果
                    UART1_TX_BUF[0] = 'O';
    	    	    UART1_TX_BUF[1] = 'K';
    	    	    UART1_TX_BUF[2] = 13;
    	    	    nTX1_Len = 3;
		    // 设置中断标志,进入发送中断程序
		    IFG2 |= UTXIFG1;		
    		    nRX1_Len = 0;
                    program = 0;
                }                
                continue;
            }
	    nRes = ProcessCMD(UART1_RX_Temp,nRX1_Len);
	    switch(nRes)
	    {
                case 0:
                {
		    UART1_TX_BUF[0] = 'O';
    	    	    UART1_TX_BUF[1] = 'K';
    	    	    UART1_TX_BUF[2] = 13;
    	    	    nTX1_Len = 3;
		    // 设置中断标志,进入发送中断程序
		    IFG2 |= UTXIFG1;		
    		    nRX1_Len = 0;
		    break;
                }
		case 1:
                {
                    //擦除FLASH里面的数据
                    unsigned int count = ADDRESS;
                    pAddr = (unsigned int*)ADDRESS;
                    //擦除数据
                    while(count < 0xffff)
                    {
                        FLASH_clr(pAddr);
                        pAddr += SEG_SIZE;
                        count += SEG_SIZE;
                    }
                    
                    //发送响应结果
		    UART1_TX_BUF[0] = 'O';
    	    	    UART1_TX_BUF[1] = 'K';
    	    	    UART1_TX_BUF[2] = 13;
    	    	    nTX1_Len = 3;
		    // 设置中断标志,进入发送中断程序
		    IFG2 |= UTXIFG1;		
    		    nRX1_Len = 0;
		    break;
                }
		case 2:
                {
                    //设置成编程状态,下面接收来自的数据
		    program = 1;
                    pWriteAddr = (unsigned int*)ADDRESS;
                    
                    //发送响应结果
    	    	    UART1_TX_BUF[0] = 'O';
    	    	    UART1_TX_BUF[1] = 'K';
    	    	    UART1_TX_BUF[2] = 13;
    	    	    nTX1_Len = 3;
		    // 设置中断标志,进入发送中断程序
		    IFG2 |= UTXIFG1;		
    		    nRX1_Len = 0;
		    break;
                }
		case -1:
                {
		    UART1_TX_BUF[0] = 'E';
    	    	    UART1_TX_BUF[1] = 'R';
		    UART1_TX_BUF[2] = 'R';
    	    	    UART1_TX_BUF[3] = 'O';
		    UART1_TX_BUF[4] = 'R';
    	    	    UART1_TX_BUF[5] = 13;
    	    	    nTX1_Len = 6;
		    // 设置中断标志,进入发送中断程序
		    IFG2 |= UTXIFG1;		
    		    nRX1_Len = 0;
		    break;
                }
	    }//switch

	}//if(nRev_UART1 == 1)
    }//for(;;)
}
int ProcessCMD(char pBuf[],int nLen)
{
    int nTemp = -1;
    
    if(nLen == 3) 
    {
        if((pBuf[0] == 'A') && (pBuf[1] == 'T'))
        {
            nTemp = 0;
        }
    }
    
    if (nLen >= 4)
    {
	if((pBuf[0] == 'F') && (pBuf[1] == 'M') 
	    && (pBuf[2] == 'T')) 
        {
	    nTemp = 1;
        }
	if((pBuf[0] == '+') && (pBuf[1] == '+') 
	    && (pBuf[2] == '+')) 
        {
	    nTemp = 2;
        }
    }
    
    return nTemp;
}

⌨️ 快捷键说明

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