📄 www
字号:
/*=====================================**
**
**
**=====================================*/
REG8 US3_rbuf[US2RBUF_LEN], US3_tbuf[US2TBUF_LEN];
REG32 US3r_r, US3r_w, US3t_r, US3t_w;
REG32 US3r_stat, US3r_byte, US3r_count, US3t_stat, US3t_byte, US3t_count, US3_div, US3_tmp, US3_enable;
/*
extern void Set_US2_TX(void);
extern void Clr_US2_TX(void);
extern U32 Tst_US2_RX(void);*/
#define Set_US3_TX() (IOSET = TXD3)
#define Clr_US3_TX() (IOCLR = TXD3)
#define Tst_US3_RX() (IOPIN0&RXD3)
void US3_interrupt(void) // UART2软件串口中断处理程序(17.361us)
{
U32 tmp;
if(US3_enable&&(--US3_tmp==0)){
US3_tmp=US2_div;
if(US3r_stat==0){ // US2输入处理,空闲状态
if(Tst_US3_RX()==0){ // 输入低电平
US3r_count=4; // 第一次延时1.3T
US3r_stat=1;
US3r_byte=0;
}
}else if(US3r_stat<9){ // 8位数据位
if(--US3r_count==0){
US3r_byte>>=1;
if(Tst_US3_RX())
US3r_byte|=0x100;
US3r_count=3; // 以后每次延时1T
US3r_stat++;
}
}else if(US3r_stat==9){ // 1位停止位
if(--US3r_count==0){
if(Tst_US3_RX()){ // 停止位有效
US3r_stat=0; // 重新允许接收
if(US3r_r!=US3r_w){ // 缓冲区未满
US3_rbuf[US3r_w]=(US3r_byte>>1);
//if(UART2RxdCount<UART2_MAX_LENGTH) UART2_RxdBuf[UART2RxdCount++]=US2_rbuf[US2r_w];
US3r_w++;
if(US3r_w>=US3RBUF_LEN) // 缓冲区回绕
US3r_w=0;
}
}else
US3r_stat=10;
}
}else
// if(TST_US2_RX) // 若停止位无效则必须等待高电平才能开始下一个字节的接收
if(Tst_US3_RX()) // 若停止位无效则必须等待高电平才能开始下一个字节的接收
US3r_stat=0;
if(US3t_stat==0){ // US2输出处理,空闲状态
tmp=US3t_r+1;
if(tmp>=US3TBUF_LEN)
tmp=0;
if(tmp!=US3t_w){
US3t_r=tmp;
US3t_byte=(US2_tbuf[tmp]|0x100); // 停止位为1
US3t_stat=1;
US3t_count=3;
Clr_US3_TX();
// CLR_US2_TX; // 开始位为0
}
}else if(US3t_stat<10){ // 加上停止位共9位数据
if(--US3t_count==0){
if(US3t_byte&1)
Set_US3_TX();
// SET_US2_TX;
else
Clr_US3_TX();
// CLR_US2_TX;
US3t_byte>>=1;
US3t_count=3;
US3t_stat++;
}
}else // 停止位有效时间
if(--US3t_count==0)
US3t_stat=0;
}
}
void US3_init(U32 baudrate) // baudrate<=9600
{
US3_tmp=US3_div=9600/baudrate;
US3r_w=US3t_w=1;
US3r_r=US3t_r=US3r_stat=US3t_stat=0;
US2_enable=1;
}
void US3_control(U32 stat)
{
US3_enable=stat;
}
int US3_getchar(void) // 从UART输入缓冲区读数据,空则返回-1
{
U32 tmp;
tmp=US3r_r+1;
if(tmp>=US3RBUF_LEN)
tmp=0;
if(tmp!=US3r_w){
US3r_r=tmp;
return (US3_rbuf[tmp]&0xFF);
}else
return -1;
}
void US3_putchar(const U8 ch) // 向UART输出缓冲区写数据,若满则等待
{
while(US3t_r==US3t_w); // 发送缓冲区满则等待
US3_tbuf[US3t_w++]=ch;
if(US3t_w>=US3TBUF_LEN) // 缓冲区回绕
US3t_w=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -