HK32航顺单片机RS485应用的一个BUG
芯片缺货的情况依然没有缓解,ST的单片机价格也是居高不下,最近的一个设计中,使用了航顺的一款单片机HK32F103C8T6,价格要比ST的便宜不少,硬件兼容,软件需要做少量改动,上手起来还是比较容易。但在使用过程中也发现一些问题,这里跟大家分享一下。串口不进接收中断
硬件上是单片机+SP3485芯片,做485通讯,Modbus协议,电路板为从机,电脑为主机,总线上也挂了其它板子的从机设备。
测试过程中发现经常485通讯中断(其它板子正常),重新上电后正常。以为是芯片死机了,但是在线仿真测试的时候发现芯片并没有死机,示波器测试串口接收端是有数据的,只是串口中断进不去了。
然后单独一块板子进行测试,一切正常,但是将485的通讯线短路几次后,又出现上述情况。判断是总线冲突导致的,但是其它板子是别人设计的,不好修改,只好在自己设计的板子上下功夫。换了ST的单片机,发现正常了,确定了是HK单片机的问题。硬件没问题,只能通过修改软件来解决了,清除接收中断、溢出中断、错误中断等都无效,后面在仿真中又发现,出问题后只要将串口寄存器USART1->SR和USART1->DR添加到监视串口,程序就可以恢复了。是不是说明只要读取一下串口寄存器的值就恢复了呢。
————————————————
于是想了一个笨办法:
定义一个全局变量,在滴答定时中断中+1,在串口接收中断中清零。由于485总线上一直在通讯,所以串口应该会频繁的进中断,该变量的值不会很大。在主程序中判断该变量,如果超过1000,说明超过1秒没进串口中断,应该是出问题了,此时程序读取一次串口寄存器的值即可。
if(uart_dect_tick > 1000)
{
uart_dect_tick = 0;
uint8_t temp = USART1->SR;
temp = USART1->DR;
} 经过测试,发现确实是这样,串口接收部分也会偶尔卡一下,但是会自动恢复。没有再出现上面的问题。
在网上也发现其他朋友也遇到了此问题,说明这个芯片确实存在BUG,上面的方法只是一个无奈的解决方案,并不适用于所有情况,要求高的用户还是要慎重选择。 抗干扰性能差
使用过程中还发现,相比ST的芯片,航顺的抗干扰能力还有待优化。相同的硬件,当外部的交流接触器动作时,会引起电源的瞬间波动,ST的芯片正常工作,但是航顺的芯片会死机或者复位,性能还是有差距。当然,这个问题也可以通过优化电源设计等方法来解决。
总的来说,这个芯片在价格上有其优势,但在性能上也有有待优化的空间。
根据你的描述感觉应该是芯片进入了ORE状态,然后你使用的是串口的哪个中断呢 用SysTick有个缺点,会加重Tick Interrupt执行负荷。换个简单的定时器吧, 例如Tim6 !用两个参数:周期溢出,用于纠正“真正挂死错误”(5000ms之类);ch1输出比较,用于接收监督(10ms之类); ch2用于“长时间没有输入中断”监督(200ms)。没事就休眠。 听说航顺的抗干扰能力不太好 这个跟代码逻辑有关系吧,我用ST的程序直接烧录进去,是没有你这个问题的 你是用航顺提供的demo修改的吗? 抗干扰的话,应该也还行吧,不然能通过检测么 这问题我还没遇到过,可否看看你的电路呢? 现在航顺好像也不是太过便宜吧 软件应该可以不改都行的 之前航顺有USB不兼容,后来也给改回来了 上手相当容易了,基本是0改动的 感谢楼主分享,这个问题还没遇到过,可能就操作的事儿吧,就是程序操作的事儿
页:
[1]