FreeModbus從站設計(11)-把Modbus的通訊參數存在單片機的flash中數組
關鍵詞:FreeModbus CubeMX HAL庫 flash 通訊參數安全
做爲從站,Modbus-RTU通訊的參數主要包括從站地址和串口參數,串口參數又包括波特率、校驗位、中止位等,把這些參數存儲在單片機的flash裏,孔丙火(微信公衆號:孔丙火)認爲,能夠簡化電路設計,應用更加靈活。通用串口參數中數據位,在Modbus-RTU通訊中是不須要設置的,由於Modbus協議規範規定,Modbus-RTU的數據位必須爲8位。微信
1.通訊參數在flash中的存儲位置app
STM32F103C8T6的flash存儲區是沒有區分程序區和用戶數據區的,將通訊參數存在flash中,最大的一個原則是不能影響程序代碼存儲區,不然會有意想不到的後果。具體存在flash中的哪一個位置,要根據實際狀況來,通常來講,程序代碼都不會把flash佔滿,通常存在最後一頁。以此係列文章的示例程序爲例,經過keil的編譯信息,能夠看到程序佔用的flash空間只有十幾kB,如圖1所示,而STM32F103C8T6的flash空間是64kB,共64頁,所以擦除、寫數據到最後一頁不會影響程序代碼。函數
圖1spa
STM32F103C8T6屬於中等容量的STM32F103,其flash組織結構如圖2所示。中等容量的STM32F103有64kB和128kB兩種,STM32F103C8T6是64kB的,所以,只有64頁。Flash的操做必需要先擦除,再寫入,而且是按頁擦除的。最後一頁的地址爲:0x0800FC00。設計
圖2blog
2.基於HAL庫寫flash的方法事件
圖3同步
如圖3所示,孔丙火(微信公衆號:孔丙火)在modbus_app.c文件中寫了一個寫flash的函數。整體流程就是先擦除再寫入,直接調用HAL庫函數就能夠了。
3.通訊參數修改的基本流程
基本流程:從站收到修改通訊參數的命令→將參數存儲到中間數組→寫flash→從新初始化串口和協議棧參數。
這裏的示例程序,採用寫多個保持寄存器(16功能碼)傳輸修改通訊參數命令,設定爲:從地址15(協議地址格式)開始,寫5個寄存器,首個寄存器寫入的輸入必須爲0xFFAA,後面四個寄存器分別表示:從站地址、波特率、校驗位、中止位,程序代碼如圖4所示。
圖4
這段代碼寫在eMBRegHoldingCB()函數中,這個函數在以前的章節有闡述。收到的通訊參數存儲在了usUsrComFlashData[]中,這是一個全局變量。而且將ucUsrComconfig置1,用於在函數外部寫flash的標識。
圖5
如圖5所示,調用vUsrWriteFlash()函數寫flash,此段代碼寫在主循環while(1)中。
從新初始化串口和協議棧參數,有兩種方法,一種是在修改通訊參數後,讓用戶重啓,程序在main()函數的初始化階段完成串口和協議棧參數的初始化,還有一種是在收到修改通訊參數的命令後,在線從新初始化串口和協議棧。孔丙火(微信公衆號:孔丙火)認爲,在工業控制領域,前一種方法更好,由於工控領域最重要的是安全,若是從站正在接收控制命令,這時對串口和協議棧從新初始化,是有危險的,並且修改通訊參數的事件,並不是高頻率。
總結:介紹了STM32F103C8T6的flash的組織結構,進一步分析了通訊參數在flash中的存儲位置,闡述了基於HAL庫寫flash的方法和通訊參數修改的基本流程。代碼通過實踐,能夠實現將通訊參數存在flash中,並能夠經過Modbus命令修改通訊參數。
文章在公衆號(孔丙火)同步推出,歡迎查看更多系列文章。
單片機、ARM、現場總線、PLC、嵌入式軟硬件的設計經驗分享,秉承「點點滴滴皆智慧」的理念,以實際項目爲單元闡述知識點,一塊兒分享,共同交流。