欢迎光临散文网 会员登陆 & 注册

STM32编写bootloader用虚拟串口进行固件升级教程

2023-04-14 12:45 作者:m蛋蛋发番茄  | 我要投稿

        最近在做用STM32编写bootloader,网上查了很多资料,怕自己忘记了,这里做一个简单的记录,水平有限,怕以后自己忘记,也希望能够帮助某些网友。

        主控STM32RCT6具体步骤如下:

        1、打开STM32Cube选择固件,进行常规设置,格外打开虚拟串口。

设置晶振、打开UWB设备
打开虚拟串口
进行时钟配置
这里红框中一定需要设置大一些,不然无法识别虚拟串口
生成代码后,一定要记住这两个红框内的数值,便于划分bootloader空间与APP空间

    上述红框还需要记住一个原因是,up主在APP中少输入了0,导致程序半天都无法执行,排查了很久。

2、打开STM32Cube系统自带实列IAP工程,可以参考Up主如下步骤:

通过系统自带搜索进行查找,打开此工程
将图中的.c及.h文件拷贝到自己工程中,这里.h拷贝未给出


开打工程文件,对Bootloader进行区域划分,我程序没有开代码优化,所以ROM和RAM占用较多,读者可以自行增加或减少。(如果编着编者突然几个白错误,则多半空间不足,增大此项)

其他的排查故障这里不多做赘述,这里主讲代码需要更改的地方

3、代码更改


红色的更换为自己所选芯片和自己规划Bootloader区域的数值,我这里展示我所需要的空间

主函数主要调用mean()

主菜单函数

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

由于虚拟串口不能单一取值,写了如下进行代替,time_out为等待时间键盘未输入,则执行APP

接收函数改动如下:

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。

COM_StatusTypeDef Ymodem_Receive ( uint32_t *p_size )更改
static HAL_StatusTypeDef ReceivePacket(uint8_t *p_data, uint32_t *p_length, uint32_t timeout)更改

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串口中断一直没办法出来。

增加USBD_Stop(&hUsbDeviceFS);防止APP中被占用中断

4、APP中需注意事项

flash进入需要更换开始地址
中断向量偏移必须要增加

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

STM32编写bootloader用虚拟串口进行固件升级教程的评论 (共 条)

分享到微博请遵守国家法律