威海建设局网站首页/怎样优化网站
STM32的SDK非常强大,基本涵盖了比较多的应用demo,但在利用sdk进行应用开发时,需要注意一些小细节,本文记录部分需要特别注意的地方,以备参考。
1. 关于FUS和Stack的更新
请参考对应的文章,此处需要注意的是,STM32CubeProgrammer只支持ST-Link仿真器,因此每次需要用这个软件的时候,需要确认使用该工具。
2. 关于低功耗的仿真
demo中的低功耗包括了如下的一些相关宏定义
1)CFG_LPM_SUPPORTED
该宏定义直接定义是否开启低功耗的支持
2)CFG_DEBUGGER_SUPPORTED
该宏定义决定是否开启仿真,这里需要特别注意,如果不开启的话,仿真口,如SWD会在如下代码中被关闭。
void APPD_Init( void )
{
/* USER CODE BEGIN APPD_Init */
#if (CFG_DEBUGGER_SUPPORTED == 1)/*** Keep debugger enabled while in any low power mode*/HAL_DBGMCU_EnableDBGSleepMode();HAL_DBGMCU_EnableDBGStopMode();/***************** ENABLE DEBUGGER *************************************/LL_EXTI_EnableIT_32_63(LL_EXTI_LINE_48);#elseGPIO_InitTypeDef gpio_config = {0};gpio_config.Pull = GPIO_NOPULL;gpio_config.Mode = GPIO_MODE_ANALOG;gpio_config.Pin = GPIO_PIN_15 | GPIO_PIN_14 | GPIO_PIN_13;__HAL_RCC_GPIOA_CLK_ENABLE();HAL_GPIO_Init(GPIOA, &gpio_config);__HAL_RCC_GPIOA_CLK_DISABLE();gpio_config.Pin = GPIO_PIN_4 | GPIO_PIN_3;__HAL_RCC_GPIOB_CLK_ENABLE();HAL_GPIO_Init(GPIOB, &gpio_config);__HAL_RCC_GPIOB_CLK_DISABLE();HAL_DBGMCU_DisableDBGSleepMode();HAL_DBGMCU_DisableDBGStopMode();HAL_DBGMCU_DisableDBGStandbyMode();#endif /* (CFG_DEBUGGER_SUPPORTED == 1) */#if(CFG_DEBUG_TRACE != 0)DbgTraceInit();
#endifAPPD_SetCPU2GpioConfig( );APPD_BleDtbCfg( );/* USER CODE END APPD_Init */return;
}
另外,将APPD_Init函数中的如下代码段注释
GPIO_InitTypeDef gpio_config = {0};gpio_config.Pull = GPIO_NOPULL;gpio_config.Mode = GPIO_MODE_ANALOG;gpio_config.Pin = GPIO_PIN_15 | GPIO_PIN_14 | GPIO_PIN_13;__HAL_RCC_GPIOA_CLK_ENABLE();HAL_GPIO_Init(GPIOA, &gpio_config);__HAL_RCC_GPIOA_CLK_DISABLE();gpio_config.Pin = GPIO_PIN_4 | GPIO_PIN_3;__HAL_RCC_GPIOB_CLK_ENABLE();HAL_GPIO_Init(GPIOB, &gpio_config);__HAL_RCC_GPIOB_CLK_DISABLE();HAL_DBGMCU_DisableDBGSleepMode();HAL_DBGMCU_DisableDBGStopMode();HAL_DBGMCU_DisableDBGStandbyMode();
注意:硬件上,最好将芯片Reset引脚接到仿真器的对应引脚
3. CFG_HW_RESET_BY_FW
默认是0,需要更改为1,让芯片启动后reset一下,否则启动可能存在stack启动的问题,影响代码段如下
static void Reset_Device(void)
{
#if (CFG_HW_RESET_BY_FW == 1)Reset_BackupDomain();Reset_IPCC();
#endif /* CFG_HW_RESET_BY_FW == 1 */return;
}static void Reset_BackupDomain(void)
{if ((LL_RCC_IsActiveFlag_PINRST() != FALSE) && (LL_RCC_IsActiveFlag_SFTRST() == FALSE)){HAL_PWR_EnableBkUpAccess(); /**< Enable access to the RTC registers *//*** Write twice the value to flush the APB-AHB bridge* This bit shall be written in the register before writing the next one*/HAL_PWR_EnableBkUpAccess();__HAL_RCC_BACKUPRESET_FORCE();__HAL_RCC_BACKUPRESET_RELEASE();}return;
}static void Reset_IPCC(void)
{LL_AHB3_GRP1_EnableClock(LL_AHB3_GRP1_PERIPH_IPCC);LL_C1_IPCC_ClearFlag_CHx(IPCC,LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4| LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);LL_C2_IPCC_ClearFlag_CHx(IPCC,LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4| LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);LL_C1_IPCC_DisableTransmitChannel(IPCC,LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4| LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);LL_C2_IPCC_DisableTransmitChannel(IPCC,LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4| LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);LL_C1_IPCC_DisableReceiveChannel(IPCC,LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4| LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);LL_C2_IPCC_DisableReceiveChannel(IPCC,LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4| LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);return;
}