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