通过I/O模拟串口方式是通过定时器 定时扫描I/O口电平,
void GPCDE_IRQHandler(void) //下降沿中断,打开定时计数
{
if(GPIOD->ISRC & 0x0040) {
TIMER0->TCSR.CEN = 1;
}
}
void TMR0_IRQHandler(void)
{
volatile uchar vmCRS232;
TISR.TIF =1;
vmCRS232 = VM_UART_RX; // #define VM_UART_RX (GPIOD6_PIN)
VM_Uart3_RX(vmCRS232);
}
void VM_Uart3_RX(uchar dataBit) // 模拟UART接收函数
{
static uchar GpsDotCnt=0;
static uchar status = START;
static uchar cnt = 0;
static uchar number = 0;
static uchar rData;
switch(status)
{
case START:
if(dataBit)
{
cnt = 0;
}
else
{
if(++cnt > 0)
{
cnt = 0;
number = 0;
status = SDATA;
}
}
break;
case SDATA:
if(++cnt > 3)
{
cnt = 0;
if(dataBit)
{
rData |= 0x80;
}
else
{
rData &= 0x7F;
}
if(++number < 8)
{
rData >>= 1;
}
else
{
number = 0;
status = STOP;
}
}
break;
case STOP:if(++cnt > 2)
{
cnt = 0;
TIMER0->TCSR.CEN = 0;
DrvGPIO_EnableInt(E_GPD, 6, E_IO_FALLING, E_MODE_EDGE);
if(dataBit)
{
//数据操作
}
status = START;
}
break;
default:
{
cnt = 0;
status = START;
}
break;
}
}