STM32G070 使用 OpenBLT 记录。

一个项目需要使用UART来更新程序。(因为设备组装好之后,拆开就非常麻烦了)

在网上找到了开源的OpenBLT。具体的资料自行百度。

这里记录下使用的流程。

0.下载源码

Feaser - OpenBLT Bootloader

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 也不要调用了。

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值