芯片缺货的情况依然没有缓解,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的芯片正常工作,但是航顺的芯片会死机或者复位,性能还是有差距。当然,这个问题也可以通过优化电源设计等方法来解决。
总的来说,这个芯片在价格上有其优势,但在性能上也有有待优化的空间。