📄 uart.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 + -