stm32通過485接串列埠做IAP

2021-07-10 12:11:31 字數 1644 閱讀 6974

stm32官方給了乙個通過串列埠進行iap的例程,其原理是按照ymodem協議(可自行谷歌,在此不做詳細介紹),乙個包乙個包的傳送,接收完乙個包之後傳送ack,配合超級終端使用,超級終端可以按照ymodem協議來傳送檔案,省去了人為去編寫pc端程式的工作。這個例程中提供了keil,iar等整合開發環境的工程,在此基礎上稍作修改即可完成我們的程式。首先要做的便是加上485的控制端,由於485是半雙工的,接收資料的同時不能傳送,傳送時不能接收,所以需要加上485的收發控制,即在每次傳送資料前使能485傳送,傳送完成之後使能485接收。例如下面**中的rs485_tx_enable()。

void serial_putstring(uint8_t *s)

rs485_tx_disable();

delay_ms(1);

}

第二個要修改的就是觸發iap的條件,官方例程中是檢測乙個按鍵是否按下,這個可以根據自己的用途做適當的修改。我們做的修改在乙個固定的flash位址中寫入乙個標誌,每次微控制器復位時,如果檢測到這個標誌被寫入flash就執行iap程式,否則跳轉到主函式正常執行。iap的程式修改基本就結束了,然後就是使用者程式中的配置。

使用者程式中,大部分情況下程式是正常執行的,由於中斷向量偏移表在0x8000004的位置,那個地方現在存放的是iap程式的中斷向量,因此要保證主程式能正常執行需要再main函式的最前面加上中斷向量偏移的設定。nvic_setvectortable(0x08000000,0x3000);(由於我的主程式放在0x8003000的地方,所有後面的偏移量是0x3000,),然後就是擦除更新標誌,防止iap程式中未擦除成功過導致又跳轉到了iap程式。最後就是如果收到上位機發來的更新韌體命令,就在flash中寫入更新標誌,然後跳轉到iap程式的入口。跳轉函式如下:

static void procupdatefirmware(void)

while(flashstatus != flash_complete );

do while(flashstatus != flash_complete );

iwdg_reloadcounter();

jumpaddress = *(__io uint32_t*) (iapaddress+ 4);

__set_msp(*(__io uint32_t*) iapaddress);

}

測試結果如下:(電腦接乙個usb轉rs232,再接乙個rs232轉rs485的轉接頭,485的a,b線與探頭留出來的a,b線相連)

1.先傳送7e 00 0e 3e 00(自己定的通訊協議,0e為命令字,代表更新韌體)

2.斷電,開啟超級終端

配置如下

4.選擇選單欄「傳送」,選擇「傳送檔案」,按照ymodem協議傳送bin檔案

中途遇到的問題:在用超級終端開始傳輸檔案時沒有任何反應,用示波器測量發現485接收傳送都有資料,控制引腳也有高有低,猜測是控制引腳的電平轉換後延時不夠,在每條控制485收發轉換的地方加上延時函式,試了一下出現了超級終端的傳送的介面,有總大小和進度等等,但最終顯示「傳送已經被遠端終端取消」,每次都無法傳送成功。網上搜了一下,沒有什麼有用的辦法。然後去研究了ymodem協議,發現iap程式在收到上位機命令後會一直向上位機傳送乙個字元c,直到上位機開始傳送檔案,而傳送字元c的地方沒有加入485控制語句,沒有傳送成功,加入後傳輸成功。

STM32通過Fatfs建立PDF檔案

上面是我建立的群聊,歡迎新朋友的加入。最近想用mcu去建立乙個pdf檔案,曾嘗試移植hpdf和pdfgen,因為這兩個本就不是為微控制器做的庫,移植過程有點複雜了。後面發現st論壇有個發布了乙個pdflib的庫,便做了一下移植。目錄 1.參考鏈結 2.工程說明 3.效果 doc裡面是參考的原始碼,或...

STM32通過UART使用printf列印資料

首先進行各項初始化,並新增stdio標頭檔案之後新增如下 庫函式 int fputc int ch,file f int getkey void 暫存器 int fputc int ch,file f fputc 是printf 的底層函式,通過fputc 來使告知微控制器列印資料到串列埠並將資料逐...

STM32通過DMA採集多通道AD

環境 主機 xp 開發環境 mdk4.23 mcu stm32f103cbt6 說明 通過腳pa1,pa2採集ad。每路ad採集10次。源 cpp view plain copy include ad driver.h 全域性變數 ad取樣存放空間 io uint16 t adcconvertedv...