gpio模拟串口uart接收数据(HAL库)

本文介绍了使用GPIO模拟UART接收数据的方法,通过计算波特率确定每个bit的时间,并在起始和结束位进行检测。在9600波特率下,每个bit时间是104us,定时器设置为52us。状态机按照枚举值逐步处理每个bit,使用中断读取数据并存储在环形缓冲区。代码示例展示了如何配置GPIO、定时器以及中断处理函数。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值