|
串口驱动已移植完毕 bsp_uart_fifo.c.
RT1052的UART硬件支持字符间超时中断,对于MODBUS应用来说是一大福音。
STM32只有部分新出的片子有该功能(比如STM32F030),103,407,429均无此功能。
硬件支持8个串口,但是串口7的引脚被SDRAM和HYperFlash占用也没有可能切换到其他引脚. 只有不要SDRAM才能8个串口同时使用.
驱动缺陷汇总:
/*
说明: 官方 fsl_lpuart.c 的中断处理函数还不够完善,主要问题如下:
(1) 只有发送缓冲区空中断,没有传输完毕中断。该中断可用于切换RS485收发器为接收状态。
因为安富莱的RT1052开发板使用MAX13487这种自动流向控制的收发器芯片,无需软件参与切换状态。 因此本bsp
无需解决该问题。当然如果硬件需要GPIO来控制流向,那么就需要更改 fs_lpuart.c 文件。
(2) 没有实现针MODBUS的应用场景(需要字符间超时来判断帧结束)。我们修改了官方的 fs_lpuart.c 文件。
- 1193行 只要收到1个字节就使能IDEL LINE中断(RX空闲) .
LPUART_EnableInterrupts(base, kLPUART_IdleLineInterruptEnable); // 增加的1句话
- 1099行 当IDEL LINE中断时,无条件执行回调函数 (无需判断 handle->rxDataSize > 0)
//if ((handle->callback) && (handle->rxDataSize))
if ((handle->callback))
{
handle->callback(base, handle, kStatus_LPUART_IdleLineDetected, handle->userData);
}
- 本bsp驱动接收功能只使用 RingBuffer 环形缓冲区模式(也就是FIFO)。因此 handle->rxDataSize 固定都是0
- 官网有例子使用 LPUART_TransferReceiveNonBlocking() 函数开启IDE LINE中断, 但是太难用了。需要主程序不断轮询
很多情况下并不知道对方发送多少字节过来,形参都没办法确定.
(3) 发送部分没有使用FIFO模式。虽然可以使用非阻塞发送函数,应用时需要特别注意
- 官方的非阻塞发送函数必须等上次发送函数执行完毕,否则第2次调用会冲掉之前未发送完毕的数据。本bsp驱动重新封装了该函数,以阻塞
方式等待上个数据包发送完毕。
- 官方的非阻塞发送发送函数需要传入数据缓冲区指针,但是fsl驱动本身不保存这些数据。如果数据缓冲区是函数内的局部变量(在堆栈)
那么函数返回后堆栈会被释放,缓冲区的数据可能其他数据冲掉(此时串口数据传输还没完毕). 本bsp驱动申请了发送缓冲区来解决该问题.
- 对于PPP这种特殊字节需要转义为2个字节发送的应用,使用putchar这种单字节发送函数比较适合。如果使用官方的非阻塞发送函数
发送1个字节,然后循环调用多次,实际效果等于阻塞式了。对于这种应用,如果不在乎内存消耗,就准备好完整的数据包后再调用发送函数.
- 实现FIFO模式需要改动太多代码,我们原则上尽量不修改fsl驱动文件。这个就将就用吧,一般来说问题不大。
*/
|
评分
-
查看全部评分
|