STM32編寫bootloader用虛擬串口進行固件升級教程
????????最近在做用STM32編寫bootloader,網(wǎng)上查了很多資料,怕自己忘記了,這里做一個簡單的記錄,水平有限,怕以后自己忘記,也希望能夠幫助某些網(wǎng)友。
????????主控STM32RCT6具體步驟如下:
????????1、打開STM32Cube選擇固件,進行常規(guī)設置,格外打開虛擬串口。





????上述紅框還需要記住一個原因是,up主在APP中少輸入了0,導致程序半天都無法執(zhí)行,排查了很久。
2、打開STM32Cube系統(tǒng)自帶實列IAP工程,可以參考Up主如下步驟:



開打工程文件,對Bootloader進行區(qū)域劃分,我程序沒有開代碼優(yōu)化,所以ROM和RAM占用較多,讀者可以自行增加或減少。(如果編著編者突然幾個白錯誤,則多半空間不足,增大此項)
其他的排查故障這里不多做贅述,這里主講代碼需要更改的地方
3、代碼更改

主函數(shù)主要調(diào)用mean()

進入菜單函數(shù)需要做更改的有如下:

接收函數(shù)改動如下:
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
static int16_t i = 0;
static uint8_t old = 0;
? /* USER CODE BEGIN 6 */
? USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
? USBD_CDC_ReceivePacket(&hUsbDeviceFS);
if(hUsbDeviceFS.rec_BIN)
{
if(old == 0)
{
if(Buf[0] == 0x01)
{
data_nums = PACKET_SIZE + PACKET_OVERHEAD_SIZE;
old = 1;
}
else if(Buf[0] == 0x02)
{
data_nums = PACKET_1K_SIZE + PACKET_OVERHEAD_SIZE;
old = 1;
}
else if(Buf[0] == EOT)
{
data_nums = 1;
old = 1;
}
}
if(data_nums != 0)
{
for(uint8_t temp = 0;temp < *Len;temp++)
{
buf_rec[i++] = *Buf++;
}
data_nums = data_nums - *Len;
if(data_nums <= 0)
{
hUsbDeviceFS.rec_BIN = 0;
i = 0;
old = 0;
data_nums = 0;
}
}
}
hUsbDeviceFS.USB_Rex_flag = 1;
? return (USBD_OK);
? /* USER CODE END 6 */
}

將此函數(shù)中aPacketData全都更換至buf_rec。



static HAL_StatusTypeDef ReceivePacket(uint8_t *p_data, uint32_t *p_length, uint32_t timeout)更改
由于VPC是一下子全部進行取值,故宏定義需要做修改,具體修改如下:
#define PACKET_HEADER_SIZE? ? ? ((uint32_t)2)? ?// 3)
#define PACKET_DATA_INDEX? ? ? ?((uint32_t)3)? ?// 4)
#define PACKET_START_INDEX? ? ? ((uint32_t)0)? ?// 1)
#define PACKET_NUMBER_INDEX? ? ?((uint32_t)1)? ?// 2)
#define PACKET_CNUMBER_INDEX? ? ((uint32_t)2)? // 3)
#define PACKET_TRAILER_SIZE? ? ?((uint32_t)1)? ?// 2)
當程序下載完時,進行跳轉(zhuǎn),需要額外增加讓虛擬串口停止的指令,不然跳轉(zhuǎn)APP程序中可能使卡在USB串口中斷一直沒辦法出來。

4、APP中需注意事項


這樣更改完,整個Bootloder和APP就更改完畢了,可以下載至芯片中進行測試。目前能想到的需要記錄的就這些了,如果遇到什么問題,可以進行留言,我看到會回復。