其他部分:
#define VM_XMIT_LEN 0x40
#define VM_XMIT_MSK 0x3F
#define VM_RXD P3_2 //* 需要利用外部中断0
#define VM_TXD P3_3
unsigned char data recv_vm_steps=0x0;
unsigned char data recv_vm_flags=0x0;
unsigned char data recv_vm_mdata=0x0;
unsigned char data recv_vm_sbuff=0x0;
unsigned char data xmit_vm_steps=0x0;
unsigned char data xmit_vm_flags=0x0;
unsigned char data xmit_vm_mdata=0x0;
unsigned char xmit_vm_buffer[VM_XMIT_LEN];
unsigned char xmit_vm_wr=0x0;
unsigned char xmit_vm_rd=0x0;
unsigned char recv_vm_buffer[VM_RECV_LEN];
unsigned char recv_vm_wr=0x0;
/********************************************************************************/
/* function : vm_io_initialize() */
/* created : hw-chen */
/* descript : 初始化虚拟串口 */
/********************************************************************************/
void vm_io_initialize(void)
{ EX0=0x1;
IT0=0x1; //* 设置INT0为下降沿中断方式
xmit_vm_steps=0x0;
xmit_vm_flags=0x0;
xmit_vm_mdata=0x0;
xmit_vm_wr =0x0;
xmit_vm_rd =0x0;
recv_vm_wr =0x0;
recv_vm_steps=0x0;
recv_vm_flags=0x0;
recv_vm_mdata=0x0;
}
/********************************************************************************/
/* fun_name : timer_0_initialize() */
/* descript : called by main initialize */
/* version : v1.00 */
/* created : hw-chen */
/* 1200的波特率,每位数据需要833.3US,每位数据的中间采样,起始位的中间只有一半 */
/* 的时间,定时器为416.667US,然后其他位都是833.3US */
/* 起始位:VALUE=65536-50000000x0.0004167/12=0xF938-0x10 */
/* 其它位:VALUE=65536-50000000x0.0008333/12=0xF270-0x10 */
/* 由于不是自动加载,需要减去系统的压栈和中断响应周期,查看汇编需要16指令周期 */
/********************************************************************************/
void timer_0_initialize(void)
{ TMOD &= 0xF0; //* TMOD: timer 0, mode 1, 16-bit load
TMOD |= 0x01; //* 模式1,16位模式
TR0 = 0x0;
}
/********************************************************************************/
/* function : timer_2_initialize() */
/* created : hw-chen */
/* descript : */
/* 由于采用VM串口的发送定时器,1200的波特率,每位定时0.8333MS=0.0008333S */
/* VALUE="65536-"(oscxtime(s))/12=65536-50000000 x0.0008333/12(=3472 ) */
/* 定时器2处于16位自动加载模式,不会产生定时误差 */
/********************************************************************************/
void timer_2_initialize(void)
{ RCAP2H= 0xF2;
RCAP2L= 0x70;
TR2 = 0x01;
ET2 = 0x01;
}
/********************************************************************************/
/* function : extern_0_interrupt() */
/* created : hw-chen */
/* descript : */
/********************************************************************************/
void extern_0_interrupt(void) interrupt 0 using 1
{ vm_start_bit_check_start();
}
/********************************************************************************/
/* function : timer_0_interrupt() */
/* created : hw-chen */
/* descript : 用作VM串口接收处理 */
/********************************************************************************/
void timer_0_interrupt(void) interrupt 1 using 1
{ recv_mdata_isr_process();
}
/********************************************************************************/
/* function : timer_2_interrupt() */
/* created : hw-chen */
/* descript : 用作VM串口发送处理 */
/* 0.8333MS定时器 */
/********************************************************************************/
void timer_2_interrupt(void) interrupt 5 using 1
{ TF2=0; //* 需要自己清楚中断标记
xmit_mdata_isr_process(); //* 处理VM的ISR发送细节
}
/********************************************************************************/
/* function : main() */
/* created : hw-chen */
/* descript : */
/********************************************************************************/
void main(void)
{ timer_0_initialize();
vm_io_initialize();
timer_2_initialize();
EA =0x1;
ET2=0x1;
IT0=0x1;
ET0=0x1;
EX0=0x1; //* 打开外部VM-RXD管脚的中断
uart_printf("*********************************\r\n");
uart_printf("* VM UART start ... *\r\n");
uart_printf("*********************************\r\n");
while(1){
xmit_SBUF_mdata_process(); //* 发送SBUF的数据
recv_SBUF_mdata_process(); //* 接收SBUF的数据
}
}
文章评论(0条评论)
登录后参与讨论