📄 uart0.c
字号:
#define __UART0_H__
#include <string.h>
#include <stdlib.h>
#include "2410addr.h"
#include "2410lib.h"
#include "def.h"
#include "Uart0.h"
#include "Motor.h"
#include "Timer.h"
unsigned short u_Tx_Index;
unsigned short u_Cmp2;
unsigned short u_Cmp3;
volatile static char uart0RxStr[3];
volatile static char uart0TxStr[34];
//---------------------------------------UART0 test function-------------------------------------
unsigned short Uart_Get_Cmp2(void)
{
return (u_Cmp2);
}
unsigned short Uart_Get_Cmp3(void)
{
return (u_Cmp3);
}
void __irq Uart0_RxIntOrErr(void)
{
rINTSUBMSK|=(BIT_SUB_RXD0|BIT_SUB_TXD0|BIT_SUB_ERR0);
if(rSUBSRCPND&BIT_SUB_RXD0) __sub_Uart0_RxInt();
if(rSUBSRCPND&BIT_SUB_TXD0)
__sub_Uart0_TxInt();
if(rSUBSRCPND&BIT_SUB_ERR0)
__sub_Uart0_RxErrInt();
ClearPending(BIT_UART0);
rSUBSRCPND=(BIT_SUB_RXD0|BIT_SUB_ERR0|BIT_SUB_TXD0); // Clear Sub int pending
rINTSUBMSK&=~(BIT_SUB_RXD0|BIT_SUB_ERR0);
}
void __sub_Uart0_TxInt(void)
{
static unsigned short u_Index = 0;
rINTSUBMSK|=(BIT_SUB_TXD0); // Just for the safety
if(u_Index < 34)
{
WrUTXH0(uart0TxStr[u_Index]);
ClearPending(BIT_UART0); // Clear master pending
rSUBSRCPND=(BIT_SUB_TXD0); // Clear Sub int pending
rINTSUBMSK&=~(BIT_SUB_TXD0); // Unmask sub int
++u_Index;
}
else
{
u_Index=0;
ClearPending(BIT_UART0); // Clear master pending
rSUBSRCPND=(BIT_SUB_TXD0); // Clear Sub int pending
rINTSUBMSK|=(BIT_SUB_TXD0); // mask sub int
}
}
void Uart_Uart0_Tx(void)
{
if(!(rUTRSTAT0 & 0x2))return; //Wait until THR is empty.
if(u_Tx_Index < 34)
{
WrUTXH0(uart0TxStr[u_Tx_Index]);
++u_Tx_Index;
}
else
{
u_Tx_Index=35;
}
}
struct
{
unsigned TX_Flag :1;
unsigned RX_Flag :1;
}Uart;
//====================================================
//Sub-routine Name:void __sub_Uart0_RxInt(void)
//Description:
//
//Input:
//Output:
//Modified:
//===================================================
void __sub_Uart0_RxInt(void)
{
static unsigned short u_Index = 0,u_RXD_Mode = 1;
char c_Com_A;
c_Com_A = RdURXH0();
if(u_RXD_Mode == 1)
{
if(RdURXH0()== 0xbb)
{
u_Index = 3;
u_RXD_Mode = 2;
}
else if(RdURXH0()== 0xcc)
{
u_Index = 1;
u_RXD_Mode = 4;
}
}
else if(u_RXD_Mode == 2)
{
uart0RxStr[3-u_Index] = RdURXH0();
u_Index--;
if(u_Index == 0)
{
u_RXD_Mode = 1;
Uart.RX_Flag = 1;
}
}
else if (u_RXD_Mode == 4)
{
uart0TxStr[1] = RdURXH0();
u_Index--;
if(u_Index == 0)
{
u_RXD_Mode = 1;
Uart.TX_Flag = 1;
}
}
}
//====================================================
//Sub-routine Name:void Uart_Uart0_Rx(void)
//Description:
//
//Input:
//Output:
//Modified: 2004/11/13
//===================================================
void Uart_Uart0_Rx(void)
{
static unsigned short u_Index = 0,u_RXD_Mode = 1;
char c_Com_A;
if(!(rUTRSTAT0 & 0x1)) return; //Receive data ready
c_Com_A = RdURXH0();
if(u_RXD_Mode == 1)
{
if(RdURXH0()== 0xbb)
{
u_Index = 3;
u_RXD_Mode = 2;
}
else if(RdURXH0()== 0xcc)
{
u_Index = 1;
u_RXD_Mode = 4;
}
}
else if(u_RXD_Mode == 2)
{
uart0RxStr[3-u_Index] = RdURXH0();
u_Index--;
if(u_Index == 0)
{
u_RXD_Mode = 1;
Uart.RX_Flag = 1;
}
}
else if (u_RXD_Mode == 4)
{
uart0TxStr[1] = RdURXH0();
u_Index--;
if(u_Index == 0)
{
u_RXD_Mode = 1;
Uart.TX_Flag = 1;
}
}
}
//====================================================
//Sub-routine Name:void Uart_Unpack_Order(void)
//Description:
//
//Input:
//Output:
//Modified:
//===================================================
void Uart_Unpack_Order(void)
{
if(!Uart.RX_Flag)
{
return;
}
Uart.RX_Flag = 0;
switch(uart0RxStr[0])
{
case 0: State.Handle = uart0RxStr[1]*256 + uart0RxStr[2];
break;
case 1: Motor_Set_X_Step(uart0RxStr[1]*256 + uart0RxStr[2]);
break;
case 2: Motor_Set_Y_Step(uart0RxStr[1]*256 + uart0RxStr[2]);
break;
case 3: Motor_Set_X_Direct(uart0RxStr[1]*256 + uart0RxStr[2]);
break;
case 4: Motor_Set_Y_Direct(uart0RxStr[1]*256 + uart0RxStr[2]);
break;
case 5: u_Cmp2 = uart0RxStr[1]*256 + uart0RxStr[2];
break;
case 6: u_Cmp3 = uart0RxStr[1]*256 + uart0RxStr[2];
break;
case 7:
u_Drive_Flag = uart0RxStr[1]*256 + uart0RxStr[2];
break;
case 8:
u_Brake_Flag = uart0RxStr[1]*256 + uart0RxStr[2];
break;
case 9:
u_Z_Debug_Flag = uart0RxStr[1]*256 + uart0RxStr[2];
break;
case 10:
u_Embroider_Speed_Des = uart0RxStr[1]*256 + uart0RxStr[2];
break;
case 11:
//Draw_Request_Flag = uart0RxStr[1]*256 + uart0RxStr[2];
break;
case 12:
//Buckle_Request_Flag = uart0RxStr[1]*256 + uart0RxStr[2];
break;
case 13:
Cut_Request_Flag = uart0RxStr[1]*256 + uart0RxStr[2];
u_Circle_Count = 0;
n_Speed_Desired = 800;
Motor_Drive_Set();
break;
case 14:
u_Color_Select = uart0RxStr[1]*256 + uart0RxStr[2];
Change_Request_Flag = 1;
break;
}
}
//====================================================
//Sub-routine Name:void Uart_TXD_Set(void)
//Description:
//
//Input:
//Output:
//Modified:
//===================================================
void Uart_TXD_Set(void)
{
if(Uart.TX_Flag > 0)
{
Uart.TX_Flag = 0;
uart0TxStr[0] = 0xaa;
uart0TxStr[2] = 0;
uart0TxStr[3] = State.System;
uart0TxStr[4] = 0;
uart0TxStr[5] = State.Normal;
uart0TxStr[6] = 0;
uart0TxStr[7] = State.Run ;
uart0TxStr[8] = 0;
uart0TxStr[9] = Z_FBK.b.UP_Needle ;
uart0TxStr[10]= 0;
uart0TxStr[11] = Z_FBK.b.Run;
uart0TxStr[12]= s_X_All_Step>>8;
uart0TxStr[13] = s_X_All_Step;
uart0TxStr[14]= s_Y_All_Step>>8;
uart0TxStr[15] = s_Y_All_Step;
uart0TxStr[16]= n_THETA>>8;
uart0TxStr[17] = n_THETA;
uart0TxStr[18]= (n_Z_Speed)>>8;
uart0TxStr[19] = n_Z_Speed;
uart0TxStr[20]= n_X_Reference>>8;
uart0TxStr[21] = n_X_Reference;
uart0TxStr[22]= n_Y_Reference>>8;
uart0TxStr[23] = n_Y_Reference;
uart0TxStr[24]= u_Error_Flag>>8;
uart0TxStr[25] = u_Error_Flag;
uart0TxStr[26]= u_Over_Needle_Index>>8;
uart0TxStr[27] = u_Over_Needle_Index;
uart0TxStr[28]= Max_Speed_Limit>>8;
uart0TxStr[29] = Max_Speed_Limit;
uart0TxStr[30]= (In_02 & Needle_Index)>>8;
uart0TxStr[31] = (In_02 & Needle_Index);
u_Tx_Index = 0;
rINTSUBMSK&=~(BIT_SUB_TXD0);
}
}
//====================================================
//Sub-routine Name:void __sub_Uart0_RxErrInt(void)
//Description:
//
//Input:
//Output:
//Modified:
//===================================================
void __sub_Uart0_RxErrInt(void)
{
unsigned short u_Com_A;
u_Com_A = rUERSTAT0;//to clear and check the status of register bits
}
//====================================================
//Sub-routine Name:void Uart_Control_Proc(void)
//Description:
//
//Input:
//Output:
//Modified:
//===================================================
void Uart_Control_Proc(void)
{
if((u_1ms_Flag & 0x02)==0)return;
u_1ms_Flag &= ~(0x02);
Uart_TXD_Set();
Uart_Unpack_Order();
Uart_Uart0_Tx();
Uart_Uart0_Rx();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -