通过引导程序跳转到系统bootloader中,通过USB下载程序。
一、新建工程
用STM32CubeMX生成工程,基本设置都一样,主要是需要对USB进行设定。
该处Parameter Settings部分保持默认即可。
修改参数配置
USBD_DFU_XFER_SIZE(每次传输的最大字节数)
USBD_DFU_APP_DEFAULT_ADD (Base Address 0x)(升级
程序的起始地址):该值需要大于引导程序的大小,且是0x200的倍数。
程序所占flash的大小,可以去.map文件中查看
二、修改程序
修改usbd_dfu_if.c文件
/**
* @brief Memory initialization routine.
* @retval USBD_OK if operation is successful, MAL_FAIL else.
*/
uint16_t MEM_If_Init_FS(void)
{
/* USER CODE BEGIN 0 */
HAL_FLASH_Unlock();
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_PGERR);
return (USBD_OK);
/* USER CODE END 0 */
}
/**
* @brief De-Initializes Memory
* @retval USBD_OK if operation is successful, MAL_FAIL else
*/
uint16_t MEM_If_DeInit_FS(void)
{
/* USER CODE BEGIN 1 */
HAL_FLASH_Lock();
return (USBD_OK);
/* USER CODE END 1 */
}
关于flash的擦除,这里很重要,由于使用的是VG芯片,它的内部分为了两个BANK,进行擦除的时候要分别擦除,尝试过直接从0x08100000擦到起始地址,但是只能擦除一个BANK。
/**
* @brief Erase sector.
* @param Add: Address of sector to be erased.
* @retval 0 if operation is successful, MAL_FAIL else.
*/
uint16_t MEM_If_Erase_FS(uint32_t Add)
{
/* USER CODE BEGIN 2 */
uint32_t NbOFPages=0;
uint32_t PageError;
HAL_StatusTypeDef status;
FLASH_EraseInitTypeDef pEraseInit;
/* Unlock the Flash to enable the flash control register access *************/
MEM_If_Init_FS();
/* Get the sector where start the user flash area */
NbOFPages =