stm32L4xx 通过USB DFU功能升级固件
背景
因为项目需求,用户不方便用SWD模式下载程序,而且本设备也留有USB,因此考虑用USB DFU模式进行固件升级。
设备上使用的单片机是stm32l476,ST官方在单片机内部bootloader已经支持通过USB方式升级固件,但是需要通过修改MODE来切换是升级固件还是运行用户程序,设备本身也没有留修改mode的按键等,因此考虑修改使用USB DFU实现的IAP功能。
设计思路
设备上电后,5秒内没有检测到USB,那么进入用户程序区,如果检测到USB插入,进入Bootloader,等待下载固件。
实现步骤
- USB DFU Bootloader代码
基本上完全使用了STM32Cube库中的例子,只是在它的基础上稍微做了修好,加入了usb是否插入的状态读取。
/**
* @brief SetupStage callback.
* @param hpcd: PCD handle
* @retval None
*/
void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd)
{
/*监测到USB插入后,亮绿灯,并且把标志位置1*/
BSP_LED_On(LED_GREEN);
usb_dfu_is_activated = 1;
USBD_LL_SetupStage(hpcd->pData, (uint8_t *)hpcd->Setup);
}
/*main 函数*/
int main(void)
{
/* Initialize the HAL Library */
HAL_Init();