在未开启读写保护的情况下刷写代码后,STM32的闪存被禁用

5

我有使用StdPeriph库编程stm32的经验。但现在我尝试使用STM32CubeMX代码生成器和STM32Cube HAL。我使用以下选项生成了一个项目:

  • 中间件:通过SDIO的FreeRTOS和FatFS
  • 编译器是GCC
  • stm32f103ret6 MCU

我将生成的代码导入Eclipse环境。我像往常一样制作了一个二进制文件并使用“st-flash write ...”刷写。我的测试程序成功地循环向USART1写入“Hello”,这没有问题。但当我尝试刷写另一个代码时,它失败并显示“unknown chip id”。如果我手动将NRST连接到GND,st-flash会给出:

...Flash: 0 bytes (0 KiB) in pages of 2048 bytes

完整输出:

2015-06-14T16:07:29 INFO src/stlink-common.c: Loading device parameters....
2015-06-14T16:07:29 INFO src/stlink-common.c: Device connected is: F1 High-density device, id 0x10036414
2015-06-14T16:07:29 INFO src/stlink-common.c: SRAM size: 0x10000 bytes (64 KiB), Flash: 0 bytes (0 KiB) in pages of 2048 bytes

我尝试使用Windows中的ST-Link Utility,但它无法连接到此MCU以更改选项字节(与stm32连接到其他设备正常工作)。我尝试通过USART1烧写,但失败了。
当然,我烧写的源代码不包含任何读/写保护启用。我尝试了另外两个MCU,但这个错误被复制了。
我该如何解除MCU的砖化并烧写任何东西?

有些MCU包括电路(闪存上的一个或多个特定位)以防止未经授权访问闪存内容。当启用安全性时(将这些位设置为特定值),闪存被视为安全资源,不再可以重新编程。你应该祈祷自己最喜欢的神或女神不会遇到这种情况。另一种达到此情况的方法是设置Flash保护寄存器,该寄存器也映射到某些flash地址。您应该能够通过重新编程此闪存地址来恢复正常。 - barak manos
我知道你写了“没有R/W保护”,但是即使你的代码没有明确设置R/W保护启用,你可能在尝试编程代码时直接将其编程到闪存中(可能是错误的地址或其他原因)。 - barak manos
那么在某个时刻释放重置是这个过程的必要步骤吗?你能给我提供修复后的Texane代码来解除软砖吗? - DAlexies
据我从数据手册了解,STM32可以保护闪存页面,但“选项字节”始终是可更改的?所以我不明白...另一个问题是我的MCU是如何被stm32cubemx生成的标准示例锁定的... - DAlexies
STM32F可以在不同的级别上进行保护。不幸的是,这是一个选项字节中的一次可编程单元。参考手册(您在数据表中找不到)对如何、何处等方面有些不清楚。但是,保护可能包括JTAG、引导加载程序(更改“MODE”引脚等)。您应该尝试验证您已经编程的内容。很可能会使设备变砖(与某些Atmel-SAMs不同,没有“ERASE”引脚)。 - too honest for this site
显示剩余6条评论
3个回答

5
我找到了根本原因!
这是由STM32CubeMX生成的HAL初始化函数:
void HAL_MspInit(void)
{
  /* USER CODE BEGIN MspInit 0 */

  /* USER CODE END MspInit 0 */

  __HAL_RCC_AFIO_CLK_ENABLE();

  HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);

  /* System interrupt init*/
/* SysTick_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);

    /**DISABLE: JTAG-DP Disabled and SW-DP Disabled 
    */
  __HAL_AFIO_REMAP_SWJ_DISABLE();

  /* USER CODE BEGIN MspInit 1 */

  /* USER CODE END MspInit 1 */
}

我没有注意到这些简单的行!
/**DISABLE: JTAG-DP Disabled and SW-DP Disabled 
*/
__HAL_AFIO_REMAP_SWJ_DISABLE();

这个宏完全禁用了SWD和JTAG编程,请查看stm321xx_hal_gpio_ex.h:
#define __HAL_AFIO_REMAP_SWJ_DISABLE()  MODIFY_REG(AFIO->MAPR, AFIO_MAPR_SWJ_CFG, AFIO_MAPR_SWJ_CFG_DISABLE) 

我在CubeMX中没有找到任何复选框来禁用/启用SWD/JTAG,因此这是代码生成器的唯一行为!在使用STM32CubeMX时,请注意此点!


1
在外设树下检查 SYS 弹头,并设置 Debug -> Serial-Wire(默认值为禁用)。 - Andrey Voloshin

5
如果您在STM32CubeMX的引脚定义选项卡上正确设置了JTAG/SWD引脚的引脚分配(例如SYS_JTDI,SYS_JTDO-TRACESWO等),则生成的代码将不会禁用JTAG/SWD。

快捷方式:在外设 / SYS / 调试下,您可以选择要使用的接口类型,系统将设置正确的引脚分配。 - mbmcavoy

2

在STM32CubeMX的Pinout | SYS | Debug下,它被(BURIED)起来了...设置为串行线或其他。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接