STM32G0

01、引言

在 STM32G0B1 的 FLASH_ACR 寄存器中有个 DBG_SWEN 位,当这个位的值为 0 时,设备就禁用调试能力,无法通过调试器连接到设备,反之则启用调试能力。下图是参考手册中的相关描述: 

1.png

▲ 图1. RM0444_rev5 的 3.7.1 章节 

从上图中可以看出,FLASH_ACR 寄存器的默认值为 0x00040600,即 DBG_SWEN 位的默认值为 1,也就是默认情况下是允许调试访问设备的。

02、问题描述

客户使用的是 STM32G0B1 的 I2C bootloader,bootloader 版本是 0x92,在执行完"Go"命令后使用 STM32CubeProgrammer 在"hot plug"模式下连接设备,但是连接失败,提示无法找到设备。

03、问题复现与分析

使用 NUCLEO-G0B1RE 板进行测试,bootloader 版本与客户的一致都是 0x92,通过配置选项字节将设备配置为从 system memoery 自举(也就是复位后进入片内 bootloader 中执行)。下图是 STM32G0B1 的参考手册中关于 boot modes 的描述,如下图所示 :

2.png

▲ 图2. RM0444_rev5 的 2.5 章节

如上图所示,在 boot modes 中显示有两种配置可从 system memory 自举,这里我使用的配置是"nBOOT1=0x1, nBOOT_SEL=0x1, nBOOT0=0x0",下图是通过 CubeProgrammer 配置选项字节的结果:

3.png

▲ 图3. 选项字节配置 

配置完从 system memory 自举之后,我们可以看到"PC"指向 0x1FFFxxxx 的地址,这里就说明 MCU 已经在 bootloader 中运行了。

4.png

▲ 图4. 配置完选项字节后的 PC 值 

然后将应用程序下载到设备中(我这里下载到 0x08000000 地址处),这一步主要是保证执行"Go"命令时可以跳转到可以运行的程序中。最后通过 I2C bootloader 引脚与 bootloader 主机端连接,然后执行"Go"命令。下图是 I2C bootloader 的"Go"命令在 host 端的流程图:

5.png

▲ 图5. AN4221_rev12 Go command: host side

下图是用逻辑分析仪抓取的"Go"命令的执行流程,跳转的地址是 0x08000000,可以 看出执行流程与文档中描述的一致,"Go"命令执行成功。 

6.png

▲ 图6. 逻辑分析仪抓取到的 Go 命令执行流程

"Go"命令执行成功后,接着使用 CubeProgrammer 通过 SWD 接口连接设备。在测 试时发现,在"hot plug"模式时连接失败,但是在"normal"模式并且复位模式为 "Hardware reset"时可以连接成功,但是在非"hardware reset"时不能连接成功。

7.png

 ▲ 图7. 连接失败时的 log

下面是几种连接方式的说明: 

8.png

▲ 图8. UM2237_Rev23 的 2.1.4 章节

从上图中的介绍我们可以看出,"hot-plug"模式在连接时不进行复位,而在 normal 模式会进行复位,并且复位方式可以自由选择。而"Software reset"和"Core reset"都需要通过设置设备的寄存器进行复位,所以首先需要通过调试接口连接到设备进而才能操作设备的寄存器,而"Hardware reset"则不需要,因为它是通过 nRST 引脚进行的复位。 

也就是说,测试结果显示,在执行完 "Go"命令后只有执行了硬件复位后才能通过调试 接口成功连接到设备。而在硬件复位后,设备会根据 boot modes 的配置选择自举地址, 这里的 boot modes 配置的是从 system meomry 中自举(片内 bootloader 就在 system memory 中),所以在复位后设备还是进入了 bootloader 中。也就是只有在执 行"Go"命令之后,才会出现不能通过调试接口连接到设备的情况,复位后重新回到 bootloader 后是可以的。从“前言”中的描述中我们可以知道 DBG_SWEN 的默认值为 1,所以很可能是在通 过 I2C bootloader 执行完"Go"命令后,设备的 FLASH_ACR 寄存器的 DBG_SWEN 位被 设置为 0 了,所以我们无法通过调试器进行连接。 

04、验证
4.1. 查看执行完 I2C bootloader 的"Go"命令后的 DBG_SWEN 的状态 

在下载到设备的应用程序中添加打印 FLASH_ACR 寄存器的 DBG_SWEN 位的操作, 用来查看执行完 I2C bootloader 的"Go"命令后的 DBG_SWEN 的状态。

int main(void)

    ...... 

    printf("---------------------------\r\n"); 

    /* 1-Read DBG_SWEN */ 

    printf("Read <- DBG_SWEN: %d\r\n", !!READ_BIT(FLASH->ACR, FLASH_ACR_DBG_SWEN));     ......

}

然后将程序下载到设备中,如果我们设置的 boot modes 从 main flash 中启动的话,我们可以看到 DBG_SWEN 位的值为 1,此时是可以通过调试接口连接到设备的。如下图所示:

9.png

▲ 图9. 从 main flash 中启动时的测试结果 

如果是从 bootloader 启动,然后通过 I2C bootloader 的"Go"命令跳转到应用程序中执行的话。可以看到 DBG_SWEN 位的值为 0,在复位之前无法通过调试器连接到设备,也就是出现问题时的现象。如下图所示:

10.png

▲ 图10. 通过 I2C bootloader 的"Go"命令跳转到应用程序中执行的结果

所以从这里可以看出,执行完 I2C bootloader 的"Go"命令后,DBG_SWEN 位被设置 为 0,所以此时我们无法通过调试器连接到设备。但是这个位的默认值为 1,所以我们可 以通过复位来恢复其默认值,或者通过软件进行设置都可以将其设置为 1。 
4.2. 通过软件将 DBG_SWEN 置位 

HAL_FLASHEx_EnableDebugger()是 HAL 库中提供的将 DBG_SWEN 置位的函数, 下面是添加的代码。

int main(void)
{
   ......
   printf("---------------------------\r\n");
   /* 1-Read DBG_SWEN */
   printf("1-Read <- DBG_SWEN: %d\r\n", !!READ_BIT(FLASH->ACR, FLASH_ACR_DBG_SWEN));
   
   /* 2-Set DBG_SWEN */
   HAL_FLASHEx_EnableDebugger();
   printf("2-Enable debugger.\r\n");
   /* 3-Read DBG_SWEN */
   printf("3-Read <- DBG_SWEN: %d\r\n", !!READ_BIT(FLASH->ACR, FLASH_ACR_DBG_SWEN));
   ......
}

将固件下载到设备中,并且从 bootloader 启动,然后通过 I2C bootloader 的"Go"命 令跳转到应用程序中执行。可以看到刚开始时 DBG_SWEN 位为 0,然后将 DBG_SWEN位置位,通过回读 DBG_SWEN 位的结果可以看到已经成功置位了 DBG_DWEN,此时再 通过"hot plug"模式就可以连接到设备。下面是测试结果:

11.png

▲ 图11. 测试结果 

通过上面两个测试我们可以看出,在 STM32G0B1x 的 0x92 版本的片内 bootloader 中,如果通过 I2C 接口执行"Go"命令跳转到应用程序时,DBG_SWEN 位将会被清零,此 时也就无法通过调试器连接到设备。如果想要恢复设备的调试能力的话,需要在应用程序 添加设置 DBG_SWEN 位为 1 的操作或者进行复位。 

05、小结

在 STM32G0B1x 的 0x92 版本的 bootloader 中,通过 I2C 接口执行完"Go"命令跳转 到应用程序时,会将设备的 DBG_SWEN 位配置为 0,也就是禁用设备的调试能力。如果 我们想要恢复调试能力的话,可以在应用程序中添加设置 DBG_SWEN 位为 1 的操作。但 是其它型号或者其它版本的 bootloader 执行"Go"命令后,不一定会有这种设置,我们应 该具体应用具体分析,详细可以参考 AN2606,AN2606 是 STM32 bootloader 的说明 文档。

来源:STM32

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 54

本文档描述如何在安全相关系统的背景下使用 STM32G0 Series 微控制器,并指定了为达到目标安全完整性等级,用户需承担的安装和操作责任。本手册适用于 STM32G0 Series 微控制器和 X-CUBE-STL 产品编号。

详阅请点击下载

《STM32G0 系列安全手册》

来源:STM32单片机

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 56

引言

有客户反映,STM32G071RBT6 在使用 STM32CubeProgrammer 烧录完程序后只能运行一次,复位后,程序无法运行,如果掉电后重新上电,程序恢复正常。

问题描述

根据客户描述,该问题可通过以下步骤复现:

2.1. 测试代码的功能流程图

准备测试代码 App1 和 App2:

“STM32G0

“STM32G0

2.2. 问题复现步骤

操作步骤

(1) 在 STM32CubeProgrammer 中下载

应用程序 App1(如图 3),并设置 RDP=1(如图 4);然后断开 STM32CubeProgrammer 的连接,板子断电后重新上电;

“STM32G0

“STM32G0

(2) 根据 log 提示(如图 5),按下用户按键,板子会在 RDP 降级的过程中,产生全片擦除的动作,等待 10s,确保芯片擦除完成后从板子再断电并重新上电;

“STM32G0

(3) 使用 STM32CubeProgrammer 重新连接板子,在下载界面选中“Run afterprogramming”后,下载应用程序 App2(如图 6),下载完成后,可以看到板子执行闪灯的效果,并从 App2 的 log 信息可知,此时的 empty check 位被置起(如图 7)。

“STM32G0

“STM32G0

(4) 在不断电的情况下,如果直接按下外部复位按钮,程序将出现无法执行的现象。

问题解决

通过问题的复现,我们注意到,程序无法正常运行时,实际进入了内置的 ISP 程序,即内置的 bootloader 程序。为什么会进入 bootloader 呢?在 G0 的参考手册中,我们注意到 empty check 的描述如下:

“STM32G0

这里的描述有两点是很重要的。

A :出厂的芯片,因为是没有程序的空片,empty check 位是被置位的,但实际电路中因 boot 管脚定义的程序从 Main Flash 启动的场景时,程序会由于 empty check 位而强制从内置的 bootloader 启动。

B :empty check 只会在加载 OptionByte 时更新,所以在空片上下载完程序后,应当通过 power on reset 或者手动清除该位,程序才可以正常运行。

我们来验证一下,在复现问题的第(4)步中,如果先按下用户按钮,应用程序 App2会通过软件清除 empty check 位,再通过外部复位按钮,则程序正常运行, 根据 log 信息可以看到 empty check 位被清除(如图 9),且程序运行恢复正常。

“STM32G0

小结

本文描述的问题虽然隐藏的比较深,但规律还是很明显的,只要重新上电即可恢复,说明很可能和 power on reset 有关。在参考手册中搜索 power on reset 关键字,可以很快的找到一些线索。所以分析问题时,要多关注这样的有规律的问题信息。

来源:STM32单片机
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 168

意法半导体 STM32G0* 系列Arm® Cortex®-M0+ 微控制器 (MCU)新增多款产品和更多新功能,例如,双区闪存、CAN FD接口和无晶振USB全速数据/主机支持功能。

“意法半导体发布新STM32G0微控制器,增加USB-C全速双模端口、CAN

对于注重预算的应用,新的  STM32G050超值产品线、STM32G051STM32G061主流产品线增加了丰富的模拟功能和最大容量18KB 的 RAM存储器,以及多达 48 引脚且售价极具竞争力的封装。

此外,STM32G0B0 超值产品线、STM32G0B1和STM32G0C1主流产品线给STM32G0 带来了新功能,这三个产品线都集成了一个 USB 2.0 设备/主机控制器和双区闪存,而STM32G0B1 和 STM32G0C1还增加了意法半导体的 FDCAN 外设。

有了集成无晶振USB2.0 全速主从双模数据接口和 USB-C 供电控制器的新产品加入,STM32G0系列让客户能够利用双模功能扩展新 USB-C 设备互操作性,开发创新应用。由于USB 双模即将取代 USB On-The-Go (OTG),STM32G0 可以在设备和主机之间轻松完成角色互换,通过简单的 USB供电命令在送电和受电之间快速转换。FDCAN 模块提供两个 CAN 2.0 接口并支持 CAN FD技术,有助于工业系统和汽车诊断系统集成创新功能。

在应用开发方面,现已推出的NUCLEO-G0B1RE开发板和 STM32G0C1E-EV评估板可加快新项目开发,STM32CubeG0软件包提供硬件抽象层 (HAL)、低层 (LL) API 和中间件等软件。

在增加这些新产品和技术功能后,现在STM32G0 系列覆盖 8 - 100 引脚封装、16 -512 KB片上闪存容量,以及高达 144 KB的大容量程序数据 RAM。灵活可变的运行模式和静态模式确保低功耗和最高64MHz的处理频率。高精度内部时钟信号在整个工作温度范围内非常稳定,高精度计时器的分辨率可设为CPU处理频率两倍。STM32G0 MCU 具有高抗噪性、最高125°C的多种额定工作温度范围。

网络安全功能为消费电子、家电和工业应用带来先进的数据安全保护,其中包括安全启动和固件更新 (SB/SFU)、保护厂商知识产权的专有代码读出保护 (PCROP) ,以及协助任务分区的存储器保护单元 (MPU) ,同时还推出了具有 AES-256 硬件加密加速处理器的产品型号。

新的 STM32G0 产品现已量产,STM32G050F6P6 超值产品线采用 TSSOP20 封装和 32 KB 闪存。在STM32G0B产品线中,STM32G0B0KET6采用LQFP32封装和512 KB 闪存。

NUCLEO-G0B1RE Nucleo-64 board 和 STM32G0C1E-EV 已上市。

详情访问www.st.com/stm32g0,相关博文请访问https://blog.st.com/stm32g0c1-stm32g061/

关于意法半导体

意法半导体拥有46,000名半导体技术的创造者和创新者,掌握半导体供应链和先进的制造设备。作为一家独立的半导体设备制造商,意法半导体与十万余客户、数千名合作伙伴一起研发产品和解决方案,共同构建生态系统,帮助他们更好地应对各种挑战和新机遇,满足世界对可持续发展的更高需求。意法半导体的技术让人们的出行更智能,电力和能源管理更高效,物联网和5G技术应用更广泛。详情请浏览意法半导体公司网站:www.st.com

围观 69
订阅 RSS - STM32G0