關於stm32f407 串列埠程式編寫過程 總結
-----------------------------------------------------謹以此文,獻給自己畢業之後第一個大專案 作者:Yangs
一.背景介紹
17/07畢業,通過完成試用期的幾個小專案,感覺自己能獨立的完成部分專案,便接手了配合硬體工程師,將公司模組升級的任務(M3-->M4)
目標:
1.bootloader更改
2.將rt_thread 系統移植到 stm32f407板子上
3.將485,can , gsm ,乙太網 驅動介面補上
4.重新設計程式收發流程,完成實時收發資料
(資料字典,wwdg , 校驗設計,對上,對下的協議修改等等 ,這些已在之前完成,只要呼叫響應介面,除錯下即可)
二.目標實現
目標1.bootloader更改
通過學習之前模組的程式碼,對整個bootloader流程有了大致的瞭解,學習flash的機構跟讀寫方法等
1.更改對應的flash 資訊,根據選擇的晶片,通過程式設計手冊或跟硬體工程師交流
更改:
#define PAGE_SIZE (0x800) /* 2 Kbytes */
#define FLASH_SIZE (0x100000) /* 1 MByte */
#define USER_FLASH_END_ADDRESS 0x08100000 //1MB
#define APPLICATION_ADDRESS (uint32_t)0x08004000 //16KB app 啟動地址
2.更新程式碼,將沉餘程式碼刪除,在keil5中一步步執行,刪除多餘程式碼,大體程式碼不做更改
因為有列印資訊需求,所以設定了485,在此之前先要理清概念:序列,並行,單工,半雙工,全雙工,同步/非同步通訊
在此處不做介紹,大家百度下即可。
usart: 1.對應時鐘配置
2.有複用,就新增複用對映
3.管腳配置—管腳初始化
4.串列埠配置----串列埠初始化
5.配置中斷
6.庫函式包含中斷跟傳送
程式碼中有用到f_open 等,那必須得實現檔案系統功能,通過SPI來實現,那就必須瞭解SPI的設定,功能等
SPI:序列外設匯流排,使MCU與各種外圍裝置以序列方式進行通訊以交換資訊。
(1)MOSI
(2)MISO
(3)SCLK
(4)CS
SPI:管腳配置
1.配置使能管腳
2.配置剩餘三個管腳
3.新增複用對映
4. SPI口初始化
5.使能SPI外設,啟動傳輸
6. 庫函式包含中斷跟傳送-------規則如nand flash 注意片選的使能
其他改動不大,在 IAP_BOOT()函式中實現程式的跳轉,進入app
通過自測,將一個點燈的bin 檔案放到對應的地址,boot函式會跳轉到該地址,實現燈閃爍即OK
目標2:將rt_thread 系統移植到 stm32f407板子上
知識儲備:結合rt_thread程式設計手冊,對rt_thread系統執行過程有個大致瞭解
這個比較簡單,在RT_Thread 官網上下載對應板子的bsp即可,編譯keil,將未實現的函式庫copy過來即可
存在問題,你要注意bootloader的跳轉地址,以及keil 裡面配置的地址,還有app 程式裡面的設定地址要對應起來 (如果地址不對應,可能會跑飛,之前遇到這個問題)
此處,先不用btloader跳轉
通過編譯之後,執行程式,檢測到程式在idle裡跑就行了,說明系統掛起來了
目標3.將485,can , gsm ,乙太網 驅動介面補上
需要學習相關串列埠的知識
(1)485
485的設定不難,之前介紹過,在系統裡面找到或新增對應的串列埠設定,實現對應的中斷即可
在rt_thread中要將finsh 跟 485關聯起來,<<RT-Thread-RTOS應用之二——使用finsh元件>> 這篇文章寫的很清楚,finsh的實現不是很難,我在做的時候遇到了bug,怎麼也接受不到輸入的資訊,進入不了串列埠中斷裡去,後來跟硬體工程師配合,通過示波器,發現開發板上485晶片有問題,接收訊號無,後來換了個485晶片就好了。
(2)can
學習can 的相關收發知識,以及相關程式的執行。
can的配置不難
Can配置:
1.對應時鐘配置
2.有複用,就新增複用對映
3.管腳配置—管腳初始化
4.CAN單元配置
5.過濾器配置
6.優先順序配置
7.庫函式包含中斷跟傳送
主要問題:兩個板子的對應的晶振不一致,這個需要在過濾器中配置,但是我將can過濾器設定之後還是出現收發錯誤
就開始找原因了,最後在函式 static rt_err_t bxcan_set_privmode(CAN_TypeDef *pcan, rt_uint32_t mode)中發現
pcan->BTR = (mode | \
((BAUD_DATA(SJW, baud_index)) << 24) | \
((BAUD_DATA(BS1, baud_index)) << 16) | \
((BAUD_DATA(BS2, baud_index)) << 20) | \
(BAUD_DATA(RRESCL, baud_index)) - 1);
知道對應的BAUD_DATA實現,更改了對應的過濾器設定,除錯通過
//{1000UL * 500,MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_9tq, CAN_BS2_2tq, 6)},//36M
{1000UL * 500,MK_BKCAN_BAUD(CAN_SJW_1tq, CAN_BS1_7tq, CAN_BS2_6tq, 6)},//42M
(3)SPI+DMA
學習SPI跟DMA
需要掛載檔案系統,就需要用到SPI了,我看原來的程式碼通過SPI+DMA來實現,我將原先的庫函式更換成M4的,將其配置改成M4的配置,發現實現不了。
原因: 兩塊晶片的flash不一樣,此處只要將對應的初始化函式更改下,配上對應的flash,檔案系統即可載入成功
(4)乙太網
注意管腳配置即可
stm32f407 乙太網驅動移植 在:
RT-Thread程式設計指南 ----- lwIP - 輕型TCP/IP協議棧 這一章寫的很詳細了,有需要的小夥伴可以去看下
RT-Thread中將lwIP應用起來主要包括三個核心步驟:
1. 建立收發包執行緒,呼叫介面eth_system_device_init()。
2. 提供網絡卡驅動,呼叫網絡卡初始化函式,註冊網絡卡裝置。(驅動不同相應的介面函式可能不同)
3. 初始化lwIP,建立lwIP執行緒,呼叫介面 lwip_sys_init()(實際呼叫的lwip_system_init())。
之後,在主執行緒上寫了個tcpserver(程式設計手冊裡有程式碼) ,用QT寫了client 實現了資料的收發,並完成測試至此完成485,can,gsm,乙太網的介面實現,之後就等新板子來了把管腳一調就可以測試了(完成公司任務)
小技巧:通過Xmind 將程式通過思維導圖的方式寫在上面,方便程式的新增更改,查詢更便利
有遇到相似問題的,歡迎大家提問,剛學習這方面知識,有不足之處,希望大家指正,萬謝
本人微信:m872873