Stm32g031芯片无法进入bootloader的及首次烧写完程序reset无法运行原因分析

遇到的问题如下:

1.boot0管脚拉高或拉低都不能从系统存储区(system flash)启动(即进入bootloader状态)。

2.新的Stm32g031芯片能够使用ISP烧写程序,但写完程序后就没法再次烧写了,芯片无法进入bootloader状态,只能进入main flash中,运行之前烧写的程序。

3.芯片第一次使用swd模式烧写完后设置了reset也无法进入程序区,即使按reset键也无法进入,必须得断电重启才能运行烧写的程序。

先解答问题1:因为Stm32g031芯片默认是从main flash区启动的,且默认boot0 pin 不起作用,所以不会进入bootloader状态。原因如下:

芯片的启动配置设置如下:

如上表所致,芯片的启动配置由boot_lock bit、nboot1 bit、nboot0 pin、nboot_sel bit、nboot0 bit决定。

boot_lock bit是强制从main flash区启动的配置位,默认是0,即没有强制从main flash区启动。

于是启动方式由nboot1 bit、nboot0 pin、nboot_sel bit、nboot0 bit决定。当nboot_sel bit为0时启动方式由nboot1 bit、nboot0 pin决定,即此时用户可以通过boot0管脚进行启动方式的设置,可以使用ISP下载方式。

但是很不幸的是Stm32g031芯片默认nboot_sel bit为1,即下载方式由nboot1 bit、nboot0 bit决定的,而nboot1 bit、nboot0 bit的默认值都为1,从而导致Stm32g031芯片默认是从main flash区启动的,且默认boot0 pin 不起作用。

nboot1 bit、nboot_sel bit、nboot0 bit所在寄存器地址及初始值如下:

问题1说明白了,下面解释问题2:

为何新的Stm32g031芯片可以使用ISP烧写,但也只能写一次,第二次不行了呢。原因如下:

芯片刚开始启动会检查main flash区有没有代码,要是0x08000000没有代码,就进入bootloader状态,要是有代码就从main flash区运行;

芯片使用手册原文如下:

翻译:

内部空检查标志(FLASH访问控制寄存器的EMPTY位(FLASH ACT))的实现是为了允许引导加载程序轻松地对原始设备进行编程。当BOOT0引脚将主闪存定义为目标引导区时,使用此标志。 设置该标志后,该设备将被视为空设备,并且选择了系统内存(引导加载程序)而不是主闪存作为引导区域,以允许用户对闪存进行编程。

该标志仅在Option字节加载期间更新:当地址0x0800 0000的内容读取为0xFFFF FFFF时置1,否则将其清除。 这意味着在对原始设备进行编程以在系统复位后执行用户代码之后,需要进行电源复位或将FLASH_CR寄存器中的OBL_LAUNCH位置1以清除该标志。 EMPTY位也可以直接由软件写入。

如果是第一次对设备进行编程,但未重新加载选项字节,则在系统复位后,设备仍将选择系统内存作为引导区。

通过上面的翻译我们也就明白问题3的原因了:

因为芯片首次运行进行了空位检查,此时的empty 标志位(即OBL_LAUNCH)已经置位了1,当使用swd烧写完程序后,无论是软件reset还是芯片的reset管脚复位,都无法把empty标志为清0,芯片会在每次的reset后都进入bootloader状态,而不会进入main flash区。只有断电重启,empty flag才会变成0,此时芯片才会进入main flash区运行。

在首次断电重启后,后面的swd烧写就可随意reset了。

上面3个问题已经研究清楚了,那么如何更改芯片默认的启动方式呢,根据上面的分析,我们应该更改0x1fff 7800处寄存器的nboot_sel bit为0即可使用芯片的boot0管脚来决定芯片如何启动。更改方法如下:

方法1:使用STM32CubeProgrammer更改。

1:使用STM32CubeProgrammer成功连接芯片点击主界面read,如下图;

2.读取成功后点击OB选项,然后选择User Configuration,会看的0x1fff 7800处所有bit的配置值;

3 将nboot_sel后面的勾选去掉,点击apply,配置完成(此时可能会弹出读取失败啥的,就不用管了)。断电复位,此时芯片的启动方式就由boot0引脚决定了。要是想进bootloader模式就得上拉boot0了。

.

方法2:在应用程序里改(理论上可以,但我改失败了,芯片成了砖!!!,至今不知道如何挽救)

为何理论可以改呢?因为芯片手册里对0x1fff7800寄存器起名了,且为rw状态:

St的hal库也提供了修改的库函数

于是我就按照上面的代码改了,看似合理,但执行到HAL_FLASH_OB_Launch();后芯片就成砖了,至今不知道如何挽救,哪位高手有时间,有足够的芯片研究非常欢迎,希望能告知我一下,我的邮箱是wrxin.hi@163.com。谢谢!

 

STM32G4是意法半导体公司推出的一款高性能微控制器系列,具有丰富的外设和高性能的处理能力。而bootloader(引导加载程序)是一种特殊的程序,用于在设备上电后第一个运行程序,其作用是加载并运行用户程序STM32G4系列微控制器在出厂时已经预编写了一个bootloader,称为系统Memory bootloader。这个bootloader位于存储器的特定区域,并且具有一些特殊的功能。其中一个重要的功能是能够通过串口或者USB接口,从计算机上接收并烧录固件(包括用户程序)到存储器中。 使用STM32G4 bootloader的主要步骤如下: 1. 在计算机上安装并启动一个编程软件,如ST-Link Utility。 2. 将STM32G4微控制器通过串口或者USB接口连接到计算机上。 3. 在编程软件中选择正确的ST-Link工具,然后选择bootloader烧录模式。 4. 选择要烧录的固件文件,并配置一些参数,如存储器的地址和大小。 5. 开始烧录固件到STM32G4微控制器的存储器中。 6. 等待烧录成,并验证烧录结果是否正确。 7. 重启动STM32G4微控制器,让的固件开始执行。 通过使用STM32G4 bootloader,可以方便地更和管理微控制器的固件。这对于需要经常更固件或者进行远程固件更的应用场景非常有用。此外,STM32G4 bootloader还提供了一些其他功能,如擦除存储器、读取和写入存储器内容等,以方便对微控制器进行更多的操作。 总之,STM32G4 bootloader是一种用于烧录和更固件的特殊程序,能够方便地管理STM32G4微控制器的固件,并且提供了一些额外的功能。它在应用层面具有很高的灵活性和可用性。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值