打印
[其他]

HC32F460串口驱动的问题

[复制链接]
2684|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
nawu|  楼主 | 2021-7-6 16:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
HC32F460片上有4路串口,驱动使用了HC32官方的库函数,一般初始化流程如下代码,一开始验证没有问题,能正常收发数据。

//HC32F460串口初始化
{
    stc_usart_uart_init_t init;
        memset(&init, 0, sizeof(init));
       
    init.enClkMode   = UsartIntClkCkNoOutput;
        init.enClkDiv    = UsartClkDiv_1;
        init.enDataLength= UsartDataBits8;
        init.enDirection = UsartDataLsbFirst;
        init.enStopBit   = UsartOneStopBit;
        init.enParity    = (en_usart_parity_t)parity;
        init.enSampleMode= UsartSampleBit8;
        init.enDetectMode= UsartStartBitFallEdge;
        init.enHwFlow    = UsartRtsEnable;
        USART_UART_Init(hw->uart, &init);

        USART_SetBaudrate(hw->uart, baudrate);
        USART_FuncCmd(hw->uart, UsartTx, Enable);
        USART_FuncCmd(hw->uart, UsartRx, Enable);
        USART_FuncCmd(hw->uart, UsartRxInt, Enable);
}
后来实际项目中,接入一个RS485设备,发现不能正常接收数据,故障表现是MCU不进接收中断。
检查了硬件,没有发现问题,外部设备->板载485芯片->MCU_RX,示波器都能看到引脚有波形过来。
最后通过Keil的外设查看窗口,看看UART的寄存器,发现SR->FE标记置1。
这意味着接收发现帧错误。

于是怀疑是波特率的问题了,用串口调试工具测试发现,果然UART在9600波特率下不能正常接收。
之前验证驱动用的是115200,波特率较高收发都正常。
问题发生在下面这一行代码,UART的时钟分频值太低,无法产生9600这么低的波特率。

init.enClkDiv    = UsartClkDiv_1;
将这个值改为16,结果可以通信了。

init.enClkDiv    = UsartClkDiv_16;



使用特权

评论回复
沙发
nawu|  楼主 | 2021-7-6 16:44 | 只看该作者
后来把常用的波特率低至1200,高至921600都试了一遍。
最终采取如下初始化代码:
如果波特率低于115200,则分频值取64,高于等于115200则分频值取1。

    stc_usart_uart_init_t init;
        memset(&init, 0, sizeof(init));
        init.enClkMode   = UsartIntClkCkNoOutput;
        init.enClkDiv    = (baudrate < 115200) ? UsartClkDiv_64 : UsartClkDiv_1;
        init.enDataLength= UsartDataBits8;
        init.enDirection = UsartDataLsbFirst;
        init.enStopBit   = UsartOneStopBit;
        init.enParity    = (en_usart_parity_t)parity;
        init.enSampleMode= UsartSampleBit8;
        init.enDetectMode= UsartStartBitFallEdge;
        init.enHwFlow    = UsartRtsEnable;
        USART_UART_Init(hw->uart, &init);
        USART_SetBaudrate(hw->uart, baudrate);
        USART_FuncCmd(hw->uart, UsartTx, Enable);
        USART_FuncCmd(hw->uart, UsartRx, Enable);
        USART_FuncCmd(hw->uart, UsartRxInt, Enable);


使用特权

评论回复
板凳
yangxiaor520| | 2021-7-6 17:47 | 只看该作者
不错的经验,感谢分享。

使用特权

评论回复
地板
oyz1991| | 2021-7-7 10:29 | 只看该作者
楼主用例程烧录是正常的吗?我的是HC32F460jeta,不管是用例程还是网上搜的资料,最后的结果都是单片机发送给串口助手正常,单片机不能成功收到串口助手。楼主能把你的接收中断分享一下吗?

使用特权

评论回复
5
match007| | 2021-7-8 16:18 | 只看该作者
还以为是485的收发控制没处理呢

使用特权

评论回复
6
martinhu| | 2021-7-8 16:33 | 只看该作者
因为波特率的整数寄存器只有8位,如果时钟高了不分频,按公式计算所得的波特率值就会溢出

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

73

主题

3308

帖子

3

粉丝