近期在使用STM32H563ZIT6这款芯片在开发板上使用正常,烧录到自己打的板子就遇到了芯片烧录一次后,再次上电无法烧录的问题。
遇到问题需要从以下5点进行分析。
首先看下开发板的原理图
1.BOOT0需要拉高。
2.NRST脚在开发板上是悬空的。这里我建议大家搞个3.3V上拉10k电阻。防止出现烧录问题。
3.注意VCAP脚也是悬空的。VCAP是为核心供电的滤波电容引脚,当ldo关闭时候核心电压直接从Vcap引脚进入。或者也可以打开内部LDO,从VDDLDO引脚接入,采用混合模式供电,dcdc+ldo的模式。
4.要使用正版ST-LINK进行烧录。
判断ST-LINK是否是正版的方法如下:
打开STM32CubeProgrammer识别ST-LINK。
注意ST-LINK的Serial number,如果是一串很长的序列号则是正版ST-LINK。否则是盗版 ST-LINK。正版如下图所示。
5.代码配置,注意代码中配置芯片核心区域使用供电方式。手册中重要部分如下。
从上图可知,芯片核心区域默认是使用SMPS供电的,当PWR_SCCR寄存器的BYPASS 置1时使用的是LDO供电。
注意SDK的代码的SystemClock_Config函数,没有进行供电配置。说明使用SMPS供电,正常烧录开发板是没有问题的。
- void SystemClock_Config(void)
- {
- RCC_OscInitTypeDef RCC_OscInitStruct = {0};
- RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
-
- /** Configure the main internal regulator output voltage
- */
- __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);
- while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}
-
- /** Initializes the RCC Oscillators according to the specified parameters
- * in the RCC_OscInitTypeDef structure.
- */
- RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
- RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS_DIGITAL;
- RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
- RCC_OscInitStruct.PLL.PLLSource = RCC_PLL1_SOURCE_HSE;
- RCC_OscInitStruct.PLL.PLLM = 4;
- RCC_OscInitStruct.PLL.PLLN = 250;
- RCC_OscInitStruct.PLL.PLLP = 2;
- RCC_OscInitStruct.PLL.PLLQ = 2;
- RCC_OscInitStruct.PLL.PLLR = 2;
- RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1_VCIRANGE_1;
- RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1_VCORANGE_WIDE;
- RCC_OscInitStruct.PLL.PLLFRACN = 0;
- if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
- {
- Error_Handler();
- }
-
- /** Initializes the CPU, AHB and APB buses clocks
- */
- RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
- |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
- |RCC_CLOCKTYPE_PCLK3;
- RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
- RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
- RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
- RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
- RCC_ClkInitStruct.APB3CLKDivider = RCC_HCLK_DIV1;
-
- if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
- {
- Error_Handler();
- }
- }
但如果加入以下一句
HAL_PWREx_ConfigSupply(PWR_EXTERNAL_SOURCE_SUPPLY);
那么开发板就不能正常运行了,也不能进行烧写了。
这条语句是将芯片核心区域设置为LDO进行供电。
解决方法如下:
如下图所示,将芯片的VCAP脚直连3.3V,就可以正常进行烧写程序了。
上图是我打的测试板,将VCAP与VDD相连,STM32CubeProgrammer就可以连接到芯片了。