在没有 R/W 保护的情况下闪存代码后禁用 STM32 闪存

DAl*_*ies 5 embedded stm32

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

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

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

...Flash: 0 bytes (0 KiB) in pages of 2048 bytes
Run Code Online (Sandbox Code Playgroud)

完整输出:

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
Run Code Online (Sandbox Code Playgroud)

我尝试从 Windows 使用 ST-Link 实用程序,但它无法连接到此 MCU 以更改选项字节(使用 stm32 连接到其他设备效果很好)。我试图闪过 USART1,但失败了。

我闪现的源代码当然不包含任何读/写保护启用。我尝试了另外 2 个 MCU,但重现了此错误。

我怎样才能通过 MCU 解开砖块并刷新任何东西?

DAl*_*ies 5

我找到了根本原因!

这是一个 HAL 初始化函数,由 STM32CubeMX 生成:

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 */
}
Run Code Online (Sandbox Code Playgroud)

没想到这么简单的台词!

/**DISABLE: JTAG-DP Disabled and SW-DP Disabled 
*/
__HAL_AFIO_REMAP_SWJ_DISABLE();
Run Code Online (Sandbox Code Playgroud)

此宏完全禁用 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) 
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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