Embedded 在没有R/W保护的情况下闪烁代码后,STM32闪烁被禁用

Embedded 在没有R/W保护的情况下闪烁代码后,STM32闪烁被禁用,embedded,stm32,Embedded,Stm32,我有一些使用StdPeriph库编程stm32的经验。但现在我尝试使用STM32CubeMX代码生成器实现stm32cubehal。我使用以下选项生成了一个项目: 中间件:通过SDIO的FreeRTOS和FatFS 编译器是GCC stm32f103ret6微控制器 我将生成的代码导入Eclipse环境。我制作了一个二进制文件,像往常一样用“st flash write…”闪烁它。我的测试程序在cycle中成功地向USART1写了“Hello”——这没有问题。但是,当我尝试刷新另一个代码时,

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

  • 中间件:通过SDIO的FreeRTOS和FatFS
  • 编译器是GCC
  • stm32f103ret6微控制器
我将生成的代码导入Eclipse环境。我制作了一个二进制文件,像往常一样用“st flash write…”闪烁它。我的测试程序在cycle中成功地向USART1写了“Hello”——这没有问题。但是,当我尝试刷新另一个代码时,它失败了,出现了“未知芯片id”。如果我手动将NRST连接到GND,则st闪存会提供:

...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实用程序,但它无法连接到此MCU以更改选项字节(使用stm32连接到其他设备效果良好)。 我试图快速浏览USART1,但失败了

当然,我闪现的源代码不包含任何读/写保护。我尝试了另一个MCU,但这个错误被重现

我怎样才能通过MCU解除连接并刷新任何内容?

我找到了根本原因

这是一个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 */
}
我没注意到这些简单的台词

/**DISABLE: JTAG-DP Disabled and SW-DP Disabled 
*/
__HAL_AFIO_REMAP_SWJ_DISABLE();
此宏完全禁用SWD和JTAG编程,请参阅
stm321xx\u hal\u gpio\u 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时请注意这一点

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

它(隐藏)在STM32CubeMX的引脚| SYS Debug |设置为串行线或其他任何形式。

一些MCU包括电路(闪存上的一个或多个特定位),以防止未经授权访问闪存内容。当安全性启用时(这些位设置为特定值),闪存被视为安全资源,不能再重新编程。你应该向你最喜爱的上帝或女神祈祷,说明你不是这样的人。达到这种情况的另一种方法是设置闪存保护寄存器,该寄存器也映射到某个闪存地址。你应该能够通过重新编程从这种情况中恢复编写此闪存地址的程序。我知道您编写了“无R/W保护”,但即使您的代码没有明确设置R/W保护已启用,您也可能在尝试编程代码时将其直接编程到闪存中(编程到错误的地址或其他位置)。如果设置了R/W保护,我应该能够从Windows中通过ST Link实用程序将其删除,不是吗?但我甚至无法连接到我的设备…大约两周前,我遇到了完全相同的问题(但在不同的MCU上)。原因是我们写入了闪存安全字节(准确地说是2位)。现在,如果您已经编程的应用程序部署了此安全功能附带的后门机制,则可以撤消此操作。否则,无法通过JTAG(或任何其他方式)访问MCU。换句话说,必须避免在此处使用,请签出Con Air(电影)搜索弹球的引语,以“我不知道怎么告诉你,塞勒斯…”.但为了消除所有疑问,我建议您参考STM32数据表,查看此MCU上是否存在该安全功能。搜索闪存安全或类似功能…检查“外围设备”树下的SYS项目符号并设置Debug->Serial Wire(默认-禁用)快捷方式:在Peripherals/SYS/Debug下,您可以选择要使用的接口类型,它将设置正确的管脚分配。