HC32F460串口驱动的问题
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串口驱动的问题相关推荐
- 华大单片机 HC32F460 串口调试
华大单片机 HC32F460 串口调试 吐槽下,华大官方例程写到太复杂了,不熟练的一时摸不上手. #include "drvs.h" /********************** ...
- WinCE中串口驱动及接口函数介绍(转载)
作者:ARM-WinCE 在WinCE中,串口驱动实际上就是一个流设备驱动,具体架构如图: 串口驱动本身分为MDD层和PDD层.MDD层对上层的Device Manager提供了标准的流设备驱动接口( ...
- linux串口驱动分析
linux串口驱动分析 硬件资源及描写叙述 s3c2440A 通用异步接收器和发送器(UART)提供了三个独立的异步串行 I/O(SIO)port,每一个port都能够在中断模式或 DMA 模式下操作 ...
- linux串口驱动分析【转】
转自:http://blog.csdn.net/hanmengaidudu/article/details/11946591 硬件资源及描述 s3c2440A 通用异步接收器和发送器(UART)提供了 ...
- WINCE6.0+S3C6410串口驱动
********************************LoongEmbedded************************作者:LoongEmbedded(kandi)时间:2011. ...
- RTEMS 的 AT91SAM9260 移植(5): 调试串口驱动
其实到这里,只要能保证编译通过,再修改一下链接脚本,其实已经可以跑在at9260的系统上了.因为我没有仿真器,不知道程序的状态,所以必须撰写调试串口的驱动. RTEMS 的调试串口并没有采用中断输出的 ...
- linux 串口驱动 atmel_set_mctrl何时调用,linux uart serial使用驱动分析
uart tty serial 驱动分析 内核版本3.14.23 以atmel为例: 起点: static int __init atmel_serial_init(void) { int ret; ...
- linux 串口驱动(二)初始化 【转】
转自:http://blog.chinaunix.net/uid-27717694-id-3493611.html 8250串口的初始化: (1)定义uart_driver.uart_ops.uart ...
- 【转载】WinCE中串口驱动及接口函数介绍
转载自:http://blog.csdn.net/nanjianhui/article/details/2627755 在WinCE中,串口驱动实际上就是一个流设备驱动,具体架构如图: 串口驱动本身分 ...
最新文章
- 【我的Android进阶之旅】解决SDK升级到27.0.3遇到的GLIBC_2.14 not found、no acceptable C compiler found in $PATH等问题...
- 一步步学习SPD2010--第十一章节--处理母版页(10)--重置母版页到网站定义
- 【组合数学】非降路径问题 ( 限制条件的非降路径数 )
- 大会直击|微软亚洲研究院刘铁岩:深度学习成功的秘密
- 如何读H.264的标准和代码
- ajax访问遇到Session失效问题
- CENTOS 6.6初始化SHELL脚本
- postman使用记录,带cookie的get请求和传json对象的post请求示范
- Mac安装Qt出现错误Could not resolve SDK Path for ‘macosx‘
- 大华相机RTSP获取视频方式
- 学习笔记之Python的六种内置对象
- Linux下vasp优化结构,VASP入门系列文章[6]结构优化
- JAVA基础(43)彻底理解cookie、session、token
- 如何卸载--奇安信安全终端管理系统
- keplergl,一款超炫的地理数据可视化神器!
- 卸载chrome浏览器_如何在Chrome,Firefox和其他浏览器中卸载扩展程序
- 沟通的艺术02 同理心对话 亲子沟通实例
- (一)OSG初学者入门基础教程
- fastadmin-addons使用
- 学习Hadoop课程
热门文章
- 方舟服务器虚拟内存,方舟怎么设置虚拟内存 | 手游网游页游攻略大全
- 计算机应用专业汇报 ppt 新生入学教育,做更好的自己——机电工程系召开2015级新生入学教育年级大会...
- LeetCode Database知识点总结 - 1667
- Maya 对象打组 保护数据
- 玩java游戏买什么手机好用又便宜_学生党想换手机又没钱?这几款价格便宜玩游戏又不卡...
- 水军!软文!割韭菜!ICO成为过街老鼠的十大败笔
- google glog简介
- 内存双通道有什么好处?如何鉴别客户机多条内存时,是否为双通道模式?
- Android mqtt客户端实例
- 计算Excel表格的几列数据的乘积和差