航順單片機(jī)RS485應(yīng)用的一個(gè)BUG
由于芯片缺貨等各種原因引起的價(jià)格與交期原因,ST的芯片價(jià)格一直居高不下,迫于成本壓力,最近嘗試使用了航順的單片機(jī)HK32F103C8T6,價(jià)格要比ST的便宜不少,硬件兼容,軟件需做少許改動(dòng),上手容易。跟大家分享一下使用過(guò)程中發(fā)現(xiàn)的一些小問(wèn)題。
串口不進(jìn)接收中斷硬件是單片機(jī)+SP3485芯片,做485通訊,Modbus協(xié)議,電腦為主機(jī),電路板為從機(jī),總線上也掛了其它板子的從機(jī)設(shè)備。

測(cè)試過(guò)程發(fā)現(xiàn)經(jīng)常485通訊中斷(其它板子正常),重新上電后正常。以為是芯片死機(jī)了,但是在線仿真測(cè)試的時(shí)候發(fā)現(xiàn)芯片并沒(méi)有死機(jī),示波器測(cè)試串口接收端是有數(shù)據(jù)的,只是串口中斷進(jìn)不去。
然后單獨(dú)一塊板子進(jìn)行測(cè)試,一切正常,但是將485的通訊線短路幾次后,又出現(xiàn)上述情況。判斷是總線沖突導(dǎo)致的,但是其它板子是別人設(shè)計(jì)的,不好修改,只好在自己設(shè)計(jì)的板子上下功夫。換上ST的單片機(jī),發(fā)現(xiàn)正常了,確定了是HK單片機(jī)的問(wèn)題。硬件沒(méi)問(wèn)題,只能通過(guò)修改軟件來(lái)解決了,清除接收中斷、溢出中斷、錯(cuò)誤中斷等都無(wú)效,后面在仿真中又發(fā)現(xiàn),出問(wèn)題后只要將串口寄存器USART1->SR和USART1->DR添加到監(jiān)視串口,程序就可以恢復(fù)了。是不是說(shuō)明只要讀取一下串口寄存器的值就恢復(fù)了呢。于是想了一個(gè)笨辦法:
定義一個(gè)全局變量,在滴答定時(shí)中斷中+1,在串口接收中斷中清零。由于485總線上一直在通訊,所以串口應(yīng)該會(huì)頻繁的進(jìn)中斷,該變量的值不會(huì)很大。在主程序中判斷該變量,如果超過(guò)1000,說(shuō)明超過(guò)1秒沒(méi)進(jìn)串口中斷,應(yīng)該是出問(wèn)題了,此時(shí)程序讀取一次串口寄存器的值即可。
if(uart_dect_tick > 1000)
{
uart_dect_tick = 0;
uint8_t temp = USART1->SR;
temp = USART1->DR;
}
經(jīng)過(guò)測(cè)試,發(fā)現(xiàn)確實(shí)是這樣,串口接收部分也會(huì)偶爾卡一下,但是會(huì)自動(dòng)恢復(fù)。沒(méi)有再出現(xiàn)上面的問(wèn)題。
在網(wǎng)上也發(fā)現(xiàn)其他朋友也遇到了此問(wèn)題,說(shuō)明這個(gè)芯片確實(shí)存在BUG,上面的方法只是一個(gè)無(wú)奈的解決方案,并不適用于所有情況,要求高的用戶還是要慎重選擇(抗干擾性稍差)。
相比ST的芯片,航順的抗干擾能力還有待優(yōu)化。相同的硬件,當(dāng)外部的交流接觸器動(dòng)作時(shí),會(huì)引起電源的瞬間波動(dòng),相比ST的芯片,航順的芯片會(huì)死機(jī)或者復(fù)位。當(dāng)然,這個(gè)問(wèn)題也可以通過(guò)優(yōu)化電源設(shè)計(jì)等方法來(lái)解決。
總的來(lái)說(shuō),這個(gè)芯片在價(jià)格上有其獨(dú)有優(yōu)勢(shì),但在性能上也有有待優(yōu)化的空間。

編輯:zzy 最后修改時(shí)間:2022-04-14