1. 程式人生 > >關於stm32f407 串列埠程式編寫過程 總結

關於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