闪存没有R / W保护的代码后,STM32闪烁禁用

时间:2015-06-14 13:17:34

标签: embedded stm32

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

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

我将生成的代码导入Eclipse环境。我制作了一个二进制文件并用" st-flash写入..."照常。我的测试程序成功写入USART1" Hello"在周期中 - 这没问题。但是,当我尝试刷新另一个代码时,它失败了"未知的芯片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取消闪存并闪存?

3 个答案:

答案 0 :(得分:4)

我找到了根本原因!

这是一个由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 :(得分:4)

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

答案 2 :(得分:1)

在Pinout |下是(BURIED) SYS |调试STM32CubeMX ...设置为Serial Wire或其他。