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;

后来把常用的波特率低至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);

HC32F460串口驱动的问题相关推荐

  1. 华大单片机 HC32F460 串口调试

    华大单片机 HC32F460 串口调试 吐槽下,华大官方例程写到太复杂了,不熟练的一时摸不上手. #include "drvs.h" /********************** ...

  2. WinCE中串口驱动及接口函数介绍(转载)

    作者:ARM-WinCE 在WinCE中,串口驱动实际上就是一个流设备驱动,具体架构如图: 串口驱动本身分为MDD层和PDD层.MDD层对上层的Device Manager提供了标准的流设备驱动接口( ...

  3. linux串口驱动分析

    linux串口驱动分析 硬件资源及描写叙述 s3c2440A 通用异步接收器和发送器(UART)提供了三个独立的异步串行 I/O(SIO)port,每一个port都能够在中断模式或 DMA 模式下操作 ...

  4. linux串口驱动分析【转】

    转自:http://blog.csdn.net/hanmengaidudu/article/details/11946591 硬件资源及描述 s3c2440A 通用异步接收器和发送器(UART)提供了 ...

  5. WINCE6.0+S3C6410串口驱动

    ********************************LoongEmbedded************************作者:LoongEmbedded(kandi)时间:2011. ...

  6. RTEMS 的 AT91SAM9260 移植(5): 调试串口驱动

    其实到这里,只要能保证编译通过,再修改一下链接脚本,其实已经可以跑在at9260的系统上了.因为我没有仿真器,不知道程序的状态,所以必须撰写调试串口的驱动. RTEMS 的调试串口并没有采用中断输出的 ...

  7. linux 串口驱动 atmel_set_mctrl何时调用,linux uart serial使用驱动分析

    uart tty serial 驱动分析 内核版本3.14.23 以atmel为例: 起点: static int __init atmel_serial_init(void) { int ret; ...

  8. linux 串口驱动(二)初始化 【转】

    转自:http://blog.chinaunix.net/uid-27717694-id-3493611.html 8250串口的初始化: (1)定义uart_driver.uart_ops.uart ...

  9. 【转载】WinCE中串口驱动及接口函数介绍

    转载自:http://blog.csdn.net/nanjianhui/article/details/2627755 在WinCE中,串口驱动实际上就是一个流设备驱动,具体架构如图: 串口驱动本身分 ...

最新文章

  1. 【我的Android进阶之旅】解决SDK升级到27.0.3遇到的GLIBC_2.14 not found、no acceptable C compiler found in $PATH等问题...
  2. 一步步学习SPD2010--第十一章节--处理母版页(10)--重置母版页到网站定义
  3. 【组合数学】非降路径问题 ( 限制条件的非降路径数 )
  4. 大会直击|微软亚洲研究院刘铁岩:深度学习成功的秘密
  5. 如何读H.264的标准和代码
  6. ajax访问遇到Session失效问题
  7. CENTOS 6.6初始化SHELL脚本
  8. postman使用记录,带cookie的get请求和传json对象的post请求示范
  9. Mac安装Qt出现错误Could not resolve SDK Path for ‘macosx‘
  10. 大华相机RTSP获取视频方式
  11. 学习笔记之Python的六种内置对象
  12. Linux下vasp优化结构,VASP入门系列文章[6]结构优化
  13. JAVA基础(43)彻底理解cookie、session、token
  14. 如何卸载--奇安信安全终端管理系统
  15. keplergl,一款超炫的地理数据可视化神器!
  16. 卸载chrome浏览器_如何在Chrome,Firefox和其他浏览器中卸载扩展程序
  17. 沟通的艺术02 同理心对话 亲子沟通实例
  18. (一)OSG初学者入门基础教程
  19. fastadmin-addons使用
  20. 学习Hadoop课程

热门文章

  1. 方舟服务器虚拟内存,方舟怎么设置虚拟内存 | 手游网游页游攻略大全
  2. 计算机应用专业汇报 ppt 新生入学教育,做更好的自己——机电工程系召开2015级新生入学教育年级大会...
  3. LeetCode Database知识点总结 - 1667
  4. Maya 对象打组 保护数据
  5. 玩java游戏买什么手机好用又便宜_学生党想换手机又没钱?这几款价格便宜玩游戏又不卡...
  6. 水军!软文!割韭菜!ICO成为过街老鼠的十大败笔
  7. google glog简介
  8. 内存双通道有什么好处?如何鉴别客户机多条内存时,是否为双通道模式?
  9. Android mqtt客户端实例
  10. 计算Excel表格的几列数据的乘积和差