在没有R/W保护的情况下闪烁代码后禁用STM32闪烁
STM32 flashing disabled after flashing a code without R/W protection
我有一些使用 StdPeriph 库进行 stm32 编程的经验。但现在我用 STM32CubeMX 代码生成器尝试了 STM32Cube HAL。我用这个选项生成了一个项目:
- 中间件:FreeRTOS 和 FatFS 通过 SDIO
- 编译器是 GCC
- stm32f103ret6单片机
我将生成的代码导入到 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 实用程序,但它无法连接到此 MCU 以更改选项字节(使用 stm32 连接到其他设备效果很好)。
我试过刷USART1,失败了
我刷的源码,当然不包含任何read/write保护启用。我尝试了另外 2 个 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_hal_gpio_ex.h
:
#define __HAL_AFIO_REMAP_SWJ_DISABLE() MODIFY_REG(AFIO->MAPR, AFIO_MAPR_SWJ_CFG, AFIO_MAPR_SWJ_CFG_DISABLE)
我在 CubeMX 中没有找到 disable/enable SWD/JTAG 的任何复选框,所以这是 代码生成器的唯一行为!使用STM32CubeMX时要注意这一点!
如果您在 STM32CubeMX 的引脚分配选项卡上正确设置 JTAG/SWD 引脚的引脚分配(例如 SYS_JTDI、SYS_JTDO-TRACESWO 等),生成的代码将不会禁用JTAG/SWD.
它(埋在)在引出线下 |系统 | STM32CubeMX 的调试...设置为串行线或其他。
我有一些使用 StdPeriph 库进行 stm32 编程的经验。但现在我用 STM32CubeMX 代码生成器尝试了 STM32Cube HAL。我用这个选项生成了一个项目:
- 中间件:FreeRTOS 和 FatFS 通过 SDIO
- 编译器是 GCC
- stm32f103ret6单片机
我将生成的代码导入到 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 实用程序,但它无法连接到此 MCU 以更改选项字节(使用 stm32 连接到其他设备效果很好)。 我试过刷USART1,失败了
我刷的源码,当然不包含任何read/write保护启用。我尝试了另外 2 个 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_hal_gpio_ex.h
:
#define __HAL_AFIO_REMAP_SWJ_DISABLE() MODIFY_REG(AFIO->MAPR, AFIO_MAPR_SWJ_CFG, AFIO_MAPR_SWJ_CFG_DISABLE)
我在 CubeMX 中没有找到 disable/enable SWD/JTAG 的任何复选框,所以这是 代码生成器的唯一行为!使用STM32CubeMX时要注意这一点!
如果您在 STM32CubeMX 的引脚分配选项卡上正确设置 JTAG/SWD 引脚的引脚分配(例如 SYS_JTDI、SYS_JTDO-TRACESWO 等),生成的代码将不会禁用JTAG/SWD.
它(埋在)在引出线下 |系统 | STM32CubeMX 的调试...设置为串行线或其他。