STM32编写bootloader用虚拟串口进行固件升级教程
最近在做用STM32编写bootloader,网上查了很多资料,怕自己忘记了,这里做一个简单的记录,水平有限,怕以后自己忘记,也希望能够帮助某些网友。
主控STM32RCT6具体步骤如下:
1、打开STM32Cube选择固件,进行常规设置,格外打开虚拟串口。





上述红框还需要记住一个原因是,up主在APP中少输入了0,导致程序半天都无法执行,排查了很久。
2、打开STM32Cube系统自带实列IAP工程,可以参考Up主如下步骤:



开打工程文件,对Bootloader进行区域划分,我程序没有开代码优化,所以ROM和RAM占用较多,读者可以自行增加或减少。(如果编着编者突然几个白错误,则多半空间不足,增大此项)
其他的排查故障这里不多做赘述,这里主讲代码需要更改的地方
3、代码更改

主函数主要调用mean()

进入菜单函数需要做更改的有如下:

接收函数改动如下:
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 */
}

将此函数中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)
当程序下载完时,进行跳转,需要额外增加让虚拟串口停止的指令,不然跳转APP程序中可能使卡在USB串口中断一直没办法出来。

4、APP中需注意事项


这样更改完,整个Bootloder和APP就更改完毕了,可以下载至芯片中进行测试。目前能想到的需要记录的就这些了,如果遇到什么问题,可以进行留言,我看到会回复。