STM32G070 使用 OpenBLT 记录。
一个项目需要使用UART来更新程序。(因为设备组装好之后,拆开就非常麻烦了)
在网上找到了开源的OpenBLT。具体的资料自行百度。
这里记录下使用的流程。
0.下载源码
1. 创建boot工程
使用STM32CUBE来创建,使用内部晶振,配置UART口。UART需要使用LL库。
LED 和看门口根据需要进行添加。
参考源码目录下的DEMO进行来添加所需的文件:
openblt\Target\Demo
支持很多MCU。
创建三个组:
core里面的代码貌似适合硬件无关的 直接添加即可。
位置:X:\openblt\Target\Source
App里面的代码是参考demo里面的。
主要是配置openblt的功能,使用UART CAN或者网口进行程序下载。
blt_conf.h就是配置文件。
led可以根据需要进行添加。
myApp.c直接参考demo的main函数写的。
代码位置:X:\openblt\Target\Demo\ARMCM0_STM32G0_Nucleo_G071RB_Keil\Boot
ARMCM0_STM32G0组里面的文件是和硬件相关的,直接拷贝移植到的文件就行。
使用的MCU是STM32G070,因此直接看考作者移植好的文件就行。
代码位置:X:\openblt\Target\Source\ARMCM0_STM32G0
最后在main函数的最后调用:MyAppMain(); 就可以了。
根据自己的需要进行的修改:
我这边需要的功能是,boot启动以后,进入程序更新操作,等待上位机发送更新指令。超时时间为5秒钟。超过5秒后,直接进入到APP程序。
需要修改一个宏:
#define BOOT_BACKDOOR_ENTRY_TIMEOUT_MS (5000)//(500)
在flash.c文件添加一个函数:
blt_bool iap_load_app(void)
{
unsigned int appRunAddr = flashLayout[0].sector_start;
/* Test if user code is programmed starting from address "APPLICATION_ADDRESS" */
if (((*(volatile unsigned int*)appRunAddr) & 0x2FFE0000 ) == 0x20000000)
{
return BLT_TRUE;
}
else
{
return BLT_FALSE;
}
}
主要是因为我没看懂 FlashVerifyChecksum()这个函数。原版的代码使用MicroBoot可以让程序启动,但是使用JTAK烧写的程序就无法启动,也无法进行调试。感觉太麻烦了。
修改nvm.c代码,屏蔽掉FlashVerifyChecksum函数,改调用iap_load_app。
extern blt_bool iap_load_app(void);
/************************************************************************************//**
** \brief Verifies the checksum, which indicates that a valid user program is
** present and can be started.
** \return BLT_TRUE if successful, BLT_FALSE otherwise.
**
****************************************************************************************/
blt_bool NvmVerifyChecksum(void)
{
#if (BOOT_NVM_CHECKSUM_HOOKS_ENABLE > 0)
/* check checksum using the application specific method. */
return NvmVerifyChecksumHook();
#else
/* check checksum using the interally supported method. */
//return FlashVerifyChecksum();
return iap_load_app();
#endif
} /*** end of NvmVerifyChecksum ***/
这样就可以使用JTAG烧写APP,并且可以进行代码调试。
2. 创建APP工程
以前怎么弄现在还怎么弄,需要修改下FLASH的位置。
然后在代码中添加一个函数:
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
static void VectorBase_Config(void)
{
/* The constant array with vectors of the vector table is declared externally in the
* c-startup code.
*/
extern const unsigned long __Vectors[];
/* Remap the vector table to where the vector table is located for this program. */
SCB->VTOR = (unsigned long)&__Vectors[0];
} /*** end of VectorBase_Config ***/
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
VectorBase_Config();
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
貌似不加也是可以用的,SCB->VTOR 的位置不需要像以前那样需要用户自己修改,boot里面已经帮用户修改了。
在添加一个hex转srec文件的命令:
fromelf #L --m32 --output=$L@L.srec
代码编译后会生成srec文件。
3.使用MicroBoot进行程序更新:
配置串口和波特率。选择固件文件即可。
程序升级完以后,这个软件直接就退出了。
有要例程的,我直接把测试过的打包发下:
STM32G070使用OpenBLT配套例程。-单片机文档类资源-CSDN下载
这里要特别注意的是,固件文件的位置不支持中文路径。
2023-03-18 今天测试发现有个问题:
FlashWriteChecksum 这个函数会操作FLASH,导致启动失败。 写完固件就不要调用了。
另外对应的FlashVerifyChecksum 也不要调用了。