UART_RECV详细设计方案

1.      UART_RECV简介:

串口是用的非常多的一种接口,实现原理比较简单,基本所有CPU芯片都配置有串口,所以经常被用来作为调试接口。

 

2.      UART_RECV规格:

实现9600波特率的串口接收,上位机串口软件发送的数据,可以被接收到。

 

3.      实现原理

以波特率9600为例子说明,波特率9600发送一个bit的时间为1s/9600=104us,即每隔104us发送一个数据。

 

104us = 104000ns 50M时钟的一个周期时间为20ns要远小于104000ns,所以可以用50M时钟产生的计数器来计数,然后根据时间来采样数据。

起始位可以用一个下降沿检测电路,这个在沿检电路一节有详细简介,此处只做使用,简介见检电路一节。

采样数据有个基本要求就是要在数据稳定时候采样,这样可以最好的满足寄存器的建立时间和保持时间,得到一个稳定的值,从时序图上可以看出,在数据bit位的中间位置数据最为稳定,所以我们采样点设在中间。如下图红色线条所示:

 

 

 

 

 

 

 

下图对应采样点的时间:

新建一个计数器,50Mhz为时钟,那么计数器变化一次时间为20ns。

由于一次完整数据接收需要有1144000ns时间,所以计数器必须记到1144000ns时间。

1144000ns/20ns = 57200,所以需要16位计数器。

 

由于9600波特率一个传输周期为104us,所以第一个红线位置为104us+104us/2=156us,其他位置依次类推,所以对应的计数器如下计算:

 

D0 对应计数器的156000ns/20ns = 7800

D1 对应计数器的260000ns/20ns = 13000

D2 对应计数器的364000ns/20ns = 18200

D3 对应计数器的468000ns/20ns = 23400

D4 对应计数器的572000ns/20ns = 28600

D5 对应计数器的676000ns/20ns = 33800

D6 对应计数器的780000ns/20ns = 39000

D7 对应计数器的884000ns/20ns = 44200

这段代码主要是针对一个串口通信模块进行初始化操作,包括创建发送消息队列和接收任务。下面是代码的详细解释: 1. `if(NULL == g_my_uart[uart].m_send_queue_handle)`:判断发送消息队列是否已经被创建,如果没有被创建则执行下面的代码。 2. `g_my_uart[uart].m_send_queue_handle = xQueueCreate(UART_SEND_QUEUE_LEN,sizeof(uart_send_msg));`:创建一个长度为UART_SEND_QUEUE_LEN,每个元素大小为uart_send_msg的队列,并将其句柄保存到g_my_uart[uart].m_send_queue_handle变量中。 3. `if(NULL == g_my_uart[uart].m_send_queue_handle)`:判断队列是否创建成功,如果没有成功则执行下面的代码。 4. `log_error("Queue creat filed.");`:打印错误信息。 5. `vPortFree(g_my_uart[uart].m_recv_buf); g_my_uart[uart].m_recv_buf = NULL;`:释放接收缓冲区的内存,并将指针置为NULL。 6. `return E_ERROR;`:返回错误码E_ERROR,表示函数执行失败。 7. `if(NULL == g_my_uart[uart].m_recv_task_handle)`:判断接收任务是否已经被创建,如果没有被创建则执行下面的代码。 8. `os_ret = xTaskCreate((TaskFunction_t )m_recv_task, (const char* )g_my_uart_cfg[uart].m_recv_task_name, (uint16_t )g_my_uart_cfg[uart].m_recv_task_stk, (void* )&g_my_uart[uart], (UBaseType_t )g_my_uart_cfg[uart].m_recv_task_pro, (TaskHandle_t* )&g_my_uart[uart].m_recv_task_handle);`:创建一个名为m_recv_task的任务,并将其句柄保存到g_my_uart[uart].m_recv_task_handle变量中。 9. `if(pdPASS != os_ret)`:判断任务是否创建成功,如果没有成功则执行下面的代码。 10. `log_error("UART recv task creat filed,ret=%d",(int)os_ret);`:打印错误信息。 11. `vPortFree(g_my_uart[uart].m_recv_buf); g_my_uart[uart].m_recv_buf = NULL;`:释放接收缓冲区的内存,并将指针置为NULL。 12. `return E_ERROR;`:返回错误码E_ERROR,表示函数执行失败。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值