硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4062|回复: 5
收起左侧

[UART] fsl_lpuart 串口驱动缺陷

[复制链接]

759

主题

1050

回帖

3332

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3332
发表于 2018-2-28 02:38:27 | 显示全部楼层 |阅读模式
串口驱动已移植完毕 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驱动文件。这个就将就用吧,一般来说问题不大。
*/



评分

参与人数 1金币 +100 收起 理由
eric2013 + 100 很给力!

查看全部评分

回复

使用道具 举报

1

主题

196

回帖

199

积分

高级会员

积分
199
QQ
发表于 2018-2-28 09:31:05 | 显示全部楼层
本帖最后由 bd7qw 于 2018-2-28 09:36 编辑

不是NXP官方板子,看了具体内容原来测试是安富莱的开发板呀,厉害了
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115694
QQ
发表于 2018-2-28 09:34:45 | 显示全部楼层
bd7qw 发表于 2018-2-28 09:31
请问用的是NXP官方板子吗?

是的,官方的那个驱动库。
回复

使用道具 举报

1

主题

196

回帖

199

积分

高级会员

积分
199
QQ
发表于 2018-2-28 09:43:08 | 显示全部楼层
软件用的NXP包,硬件是安富莱的,这样理解对了吧!
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115694
QQ
发表于 2018-2-28 09:44:53 | 显示全部楼层
bd7qw 发表于 2018-2-28 09:43
软件用的NXP包,硬件是安富莱的,这样理解对了吧!

都可以,应该是自带外设。
回复

使用道具 举报

18

主题

261

回帖

315

积分

高级会员

积分
315
发表于 2018-2-28 17:11:14 | 显示全部楼层
官网有例子使用 LPUART_TransferReceiveNonBlocking() 函数开启IDE LINE中断, 但是太难用了。需要主程序不断轮询很多情况下并不知道对方发送多少字节过来,形参都没办法确定.
针对这条我想说,空闲中断的目的就是配合DMA不让处理器持续介入。使用空闲中断还轮询肯定不如接收中断方便。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-5-12 18:29 , Processed in 0.220122 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表