前言:
本文主要解决的问题是实现IAP功能,包括升级应用程序(APP)和升级数据包到外部Flash。方法是利用USB DFU Class以及ST提供的DfuSe demo软件工具实现,至于DFU class移植直接利用cube生成。
IAP介绍:
IAP(In application program)主要为使用者提供了一种更加灵活的固件升级方式,可以根据应用需要定义何时、何种情况发生时进行固件升级。在介绍步骤前,需要对IAP原理有一定认识。结合下图(仅供参考,IAP实际应用方式更加灵活),IAP的应用中,用户程序与IAP驱动程序位于不同的存储区域。在应用过程中,利用IAP驱动程序将用户固件加载到固定位置,完成升级。更多关于IAP应用介绍请参考AN3965。
其中,IAP驱动程序首先烧录固化,并不会随着用户程序的升级而改变。用户固件升级完毕后,在IAP驱动程序引导下,跳转到用户固件对应Flash位置,执行用户程序。
软件流程:
设计一个用户程序,程序正常运行;当用户按键被按下,产生EXTI 中断,在中断中选择后备数据寄存器RTC_BKP0R,写入值0x32F2,然后产生软件复位;软件复位后,进入Bootloader(IAP代码),在主函数对RTC_BKP0R 进行判断,如果其值不是0x32F2 则直接去运行用户代码,如果其值为0x32F2 则是需要跳转初始化DFU类,然后一直循环闪烁LED,并在这之前将RTC_BKP0R 清零。
Bootloader实现步骤:
安装DFU demo工具DfuSe v3.0.5,主要提供了驱动、Dfu file manager 和 DfuSeDemo。关于DfuSe的详细内容(安装步骤、使用介绍)请参考UM0412。
利用STMCUBE工具生成工程:
在工程里面选择USB设备,然后选择DFU类。
参数设置如下图:
简单介绍一下上面两个主要参数:
USBD_DFU_APP_DEFAULT_ADD表示APP程序的起始地址为0x08008000,本工程(也称IAP代码或者Bootloader,下面用Bootloader表示本工程)的起始地址为0x0800 0000,长度为0x8000,要在该界面进行设置。Bootloader一般用来实现固件的升级,不用来实现其他功能,所以大小0x8000(32KB)已经足够。
第二个参数对应于于usbd_dfu_flash.c 里边定义的描述符FLASH_DESC_STR&#