stm32通過485接串口做IAP

在做一個工程測量的項目,由於探頭要下放到100米深,因此採用了走485差分信號的方式來提高傳輸距離和增強抗干擾能力,爲了防止出問題時一遍一遍的拆開設備,所以決定通過預留出來的485的A,B線來進行固件的在線升級。

首先簡要介紹一下IAP,IAP即In Application Programming(在應用中編程),一般stm32的程序下載的時候都是下載到flash中地址0x800 0000的地方,而IAP就是在0x8000000處放入IAP程序,將主程序放在後面的地方,當需要在線更新固件的時候,跳轉到IAP程序中,調用flash函數重寫擦寫主程序所在flash地址處的內容,擦寫成功後即重新跳轉到主程序去運行。(更詳細的介紹可以點擊這個鏈接 http://www.51hei.com/stm32/4315.html )

stm32官方給了一個通過串口進行IAP的例程,其原理是按照ymodem協議(可自行谷歌,在此不做詳細介紹),一個包一個包的發送,接收完一個包之後發送ACK,配合超級終端使用,超級終端可以按照ymodem協議來傳送文件,省去了人爲去編寫PC端程序的工作。這個例程中提供了keil,IAR等集成開發環境的工程,在此基礎上稍作修改即可完成我們的程序。首先要做的便是加上485的控制端,由於485是半雙工的,接收數據的同時不能發送,發送時不能接收,所以需要加上485的收發控制,即在每次發送數據前使能485發送,發送完成之後使能485接收。例如下面代碼中的RS485_TX_Enable()。

void Serial_PutString(uint8_t *s)
{
  RS485_TX_Enable();
  delay_ms(1);
  while (*s != '\0')
  {
    SerialPutChar(*s);
    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)
{
	IWDG_ReloadCounter();
	do
	{
		FLASHStatus = FLASH_ErasePage(UpdataFirmwareFlagAddress);
		IWDG_ReloadCounter();
	}while(FLASHStatus != FLASH_COMPLETE );
	do
	{
		FLASHStatus = FLASH_ProgramWord(UpdataFirmwareFlagAddress, UpdataFlag);
		IWDG_ReloadCounter();
	}while(FLASHStatus != FLASH_COMPLETE );
	
	IWDG_ReloadCounter();
	JumpAddress = *(__IO uint32_t*) (IAPAddress+ 4);
	Jump_To_Application = (pFunction) JumpAddress;
	/* Initialize user application's Stack Pointer */
	__set_MSP(*(__IO uint32_t*) IAPAddress); 
	
	Jump_To_Application();
}

至此,程序編寫就差不多完成了,keil下載時設置將主程序下載到0x8003000的位置,將IAP程序下載到0x8000000的位置。


測試結果如下:(電腦接一個usb轉RS232,再接一個RS232轉RS485的轉接頭,485的A,B線與探頭留出來的A,B線相連)

1.先發送7E 00 0E 3E 00(自己定的通信協議,0e爲命令字,代表更新固件)


2.斷電,打開超級終端


 

配置如下


3.重新上電,出現菜單界面,按1進入下載狀態


4.選擇菜單欄“傳送”,選擇“發送文件”,按照Ymodem協議發送bin文件


5.下載成功後出現如下界面,按3,然後重啓即可。


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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章