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

📄 uart.c

📁 shengji chengxu daoshi hezai xiaznai
💻 C
字号:
#include "uart.h"
#include "hal.h"
#include "code_upgrade.h"

#ifdef DTSD
// 数据桢指针
// 数据桢buffer
void ext_io(unsigned short io) // @ "BOOTCODE"
{
    int k;
    unsigned short shf;

    shf = 0x8000;
    
    for(k=0; k<16; k++)
    {
        if(io&shf)
            DS_OUT|=(DS);
        else
            DS_OUT&=~(DS);

        if(k==0)
        {
            MR_OUT&=~(MR);
            MR_OUT|=(MR);
        }
        
        SHCP_OUT&=~(SHCP);
        SHCP_OUT|=(SHCP);
        
        shf >>= 1;
    }

    STCP_OUT&=~(STCP);
    STCP_OUT|=(STCP);
}
#endif

void check_rx_buffer(unsigned char *frm,unsigned char *pre_frm)
{
    unsigned char blk;
    unsigned char ii;
    unsigned char rx_byte;
    
    IFG1&=~URXIFG0;
    rx_byte=U0RXBUF;
    if(frm[XM_PTR]==0)
    {
        if(rx_byte==ASCII_EOT)
        {
            _uart_start_to_tx(ASCII_ACK);
            _uart_start_to_tx(ASCII_ACK);
            if(pre_frm[1])
            {
                flash_write_byte((unsigned char *)0x1080,0x0);
            }
            return;
        }
    }
    
    frm[frm[XM_PTR]++]=rx_byte;
    if(frm[XM_SOH]!=ASCII_SOH)
    {
        goto uart_rx_err;
    }
    
    if(frm[XM_PTR]==2)
    {
        if(pre_frm[1]==ASCII_ACK)
        {
            blk=pre_frm[0]+1;
        }
        else if(pre_frm[1]==ASCII_NAK)
        {
            blk=pre_frm[0];
        }
        else
        {
            blk=1;
        }
        if(frm[XM_BLK]!=blk)
        {
            goto uart_rx_err;
        }
    }
    if(frm[XM_PTR]==3)
    {
        if(frm[XM_RBLK]+frm[XM_BLK]!=0xFF)
        {
            goto uart_rx_err;
        }
    }
    if(frm[XM_PTR]>XM_CS)
    {
        blk=0;
        for(ii=0;ii<XM_CS;ii++)
        {
            blk+=frm[ii];
        }
        if(frm[XM_CS]!=blk)
        {
            goto uart_rx_err;
        }   
       
        // do upgrade
        if(do_upgrade(frm)==OK)
        {
            frm[XM_DAT]=ASCII_ACK;
        }
        else
        {
            frm[XM_DAT]=ASCII_NAK;
        }
        
        pre_frm[0]=frm[XM_BLK];
        pre_frm[1]=frm[XM_DAT];
        _uart_start_to_tx(frm[XM_DAT]);
        _uart_start_to_rx(frm);
    }
    
    return;
uart_rx_err:
    frm[XM_PTR]=0;
}

void _uart_wait(void)
{
    P2SEL=0;
    P2IES|=UART_RX;
    P2IFG&=~(UART_RX);
    P2IE|=UART_RX;
}

void set_baud_rate(void)
{
    
    // Init Uart rx
    UCTL0=SWRST; 
    UCTL0|=CHAR;
    UTCTL0=SSEL1;
    // 1200
    //U0BR0=0xA7; 
    //U0BR1=0x0D;
    //UMCTL0=0;
    // 2400
    //U0BR0=0xD4; 
    //U0BR1=0x06;
    //UMCTL0=0;
    // 9600
    //U0BR0=0xB5; 
    //U0BR1=0x01;
    //UMCTL0=0;
    // 19200
    //U0BR0=0xDA; 
    //U0BR1=0x00;
    //UMCTL0=0x45;
#ifdef DTSF
    U0BR0=0xD4; 
    U0BR1=0x06;
    UMCTL0=0;
#else
    U0BR0=0x24;// 115200
    U0BR1=0x0;
    UMCTL0=0x41;
#endif
}


void _uart_start_to_rx(unsigned char *frm)
{
    unsigned short ii = 0;
 
    while(!(UTCTL0&TXEPT))
    {
        if (ii++ > 1000) break;
    }
    RS_RX_EN();
    set_baud_rate();
    ME1=URXE0;
    UCTL0&=~SWRST;
    frm[XM_PTR]=0;
}

void _uart_start_to_tx(unsigned char data)
{
    unsigned char ii=0; 
    
    RS_TX_EN();
    set_baud_rate();
    ME1=UTXE0;
    UCTL0&=~SWRST;
    UTCTL0&=~TXEPT;  
    TXBUF0=data; 
    while(!(UTCTL0&TXEPT))
    {
        if (ii++ > 0x8000) break;
    }
}


⌨️ 快捷键说明

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