GPIO模拟uart的原理就是根据所需要的uart的波特率,计算出每个bit所用的时间,在此时间段内去读取gpio的输入,然后将读取的8bit拼接起来即可,当然这期间要检测起始位和结束位。
uart的起始位是下降沿,结束位是上升沿。
为了检测准确,我们读取每个bit的中位位置,所以定时时间是每个bit位所占用时间一半。
9600波特率的uart模拟,每个bit位的时间是:1/9600 s = 104us的时间,那么半个bit位的定时时间就是104/2 = 52us。所以在检测到下降沿后,接着打开定时器,定时52us,每52us读取一次
GPIO的状态作为一个字节的bit位,即可以正确读取出一个字节。
代码实现方式如下:
1. 首先定义枚举值,每次定时中断时状态机就按照下面的枚举值增加一步。
enum{
COM_START_BIT = 1, //起始位位
COM_START_MID_BIT, //起始位中位
COM_D0_BIT, //bit0
COM_D0_MID_BIT, //bit0中位
COM_D1_BIT, //bit1
COM_D1_MID_BIT, //bit1中位
COM_D2_BIT, //bit2
COM_D2_MID_BIT, //bit2中位
COM_D3_BIT, //bit3
COM_D3_MID_BIT, //bit3中位
COM_D4_BIT, //bit4
COM_D4_MID_BIT, //bit4中位
COM_D5_BIT, //bit5
COM_D5_MID_BIT, //bit5中位
COM_D6_BIT, //bit6
COM_D6_MID_BIT, //bit6中位
COM_D7_BIT, //bit7
COM_D7_MID_BIT, //bit7中位
COM_STOP_BIT, //终止位
COM_STOP_MID_BIT, //终止位中位20
};
static uint8_t recvStat = COM_STOP_MID_BIT; //定义状态机
#define ANALOGUSART_RX_BUF_SIZE 50
static uint8_t analog_usart_rx_buf[ANALOGUSART_RX_BUF_SIZE];
__IO ANALOG_R_BUF analog_usart_rbuf={0,0,analog_usart_rx_buf,0};//定义模拟串口的接收环形缓冲区
int8_t tim7_stop(void);
int8_t tim7_st