L052函数内使用 #if 0 后程序运行异常
最近在调试低功耗,进入低功耗函数如下:void vMcuEnterStopMode(void)
{
//// for test
#if 1
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
HAL_PWREx_EnableUltraLowPower();
HAL_PWREx_EnableFastWakeUp();
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
SystemClock_Config();
#endif
} #if 1时进入低功耗功能正常,但是当为#if 0时,程序异常,会停留在main函数开始出的延时处,当时奇怪的是打断点(断点必须在停留延时函数之后)调试时可以的,就是全速仿真运行或者真正运行时功能异常。 停留函数如下:
void GpioInit(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOB_CLK_ENABLE();
HAL_GPIO_WritePin(RESET_ASSIST_GPIO_Port, RESET_ASSIST_Pin, GPIO_PIN_RESET);
GPIO_InitStruct.Pin = RESET_ASSIST_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(RESET_ASSIST_GPIO_Port, &GPIO_InitStruct);
HAL_GPIO_WritePin(RESET_ASSIST_GPIO_Port, RESET_ASSIST_Pin, GPIO_PIN_RESET);
Delay16(6000);
GPIO_InitStruct.Pin = RESET_ASSIST_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(RESET_ASSIST_GPIO_Port, &GPIO_InitStruct);
} 但是将延时函数直接顶替该函数后,功能又正常。 在该函数之前还有大约5ms的延时,将延时增加到30Ms后,功能又正常。
不知道什么原因???
各位大侠请支招哦。谢谢!!!
首先要明白#if的功能,如果是#if 0...#endif 这段代码是不编译的。 首先要搞清预编译和代码得区别。。。预编译是指编译器执行的。。。而真正得代码是MCU执行。。两者有本质区别哦。。。。 安 发表于 2017-9-14 08:12
首先要明白#if的功能,如果是#if 0...#endif 这段代码是不编译的。
要的就是比编译这个功能,因为调试时进入低功耗比较麻烦,本想用这个功能来屏蔽这部分代码使该函数为空函数,以为空函数不影响,但是好像还是有影响 MrJiu 发表于 2017-9-14 10:46
首先要搞清预编译和代码得区别。。。预编译是指编译器执行的。。。而真正得代码是MCU执行。。两者有本质区 ...
我以为怕屏蔽了后是空函数,应该能正常工作,但是工作异常,问题是影响的地方居然不是函数调用的地方,所以有点疑惑... power568 发表于 2017-9-14 13:26
我以为怕屏蔽了后是空函数,应该能正常工作,但是工作异常,问题是影响的地方居然不是函数调用的地方,所 ...
那你把main函数也贴出来看看。。。。 楼主的意思是Delay16(6000);应该停留在这里吗?
如果这个也不能工作,可能是被优化了,顺便发一下Delay16(6000)的函数。 MrJiu 发表于 2017-9-14 13:49
那你把main函数也贴出来看看。。。。
main函数没有太多的东西,都是初始化,如下:
int main(void)
{
/* USER CODE BEGIN 1 */
Delay16(1000); /* USER CODE END 1 */
ResetSlaveMcu();
vReadDeviceInforFromFlash(DEVICE_INFO_ADDRESS, &Set_distance_data, 1 );
vReadDeviceInforFromFlash(DEVICE_VOICE_ADDRESS, &AlarmVoiceIndex, 1 );
if ( (9>AlarmVoiceIndex) || (11<AlarmVoiceIndex) )
{
AlarmVoiceIndex = 9;
}
#if 0 ////for test
uint16_t temp_flash_data_rewrite = 1;
vWriteDeviceInforToFlash(DEVICE_MODE_ADDRESS, (uint16_t *)&temp_flash_data_rewrite, 1);
#endif
vReadDeviceInforFromFlash(DEVICE_MODE_ADDRESS, (uint16_t *)&System_mode, 1 );
/* MCU Configuration----------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_ADC_Init();
MX_RTC_Init();
MX_SPI1_Init();
MX_USART2_UART_Init();
/* USER CODE BEGIN 2 */
__HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);
#if 0
MX_USART1_UART_Init();
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
#endif
DataStructInit();
AppStartAdc();
AppSlaveModeSet(&MainCmdDeal);
AppIwdgInit();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
switch (System_mode)
{
case 2: //// sleep
{
AppSleepMode(&MainCmdDeal);
break;
}
case 1: //// active
{
AppActiveMode(&MainCmdDeal);
break;
}
case 0xFFFF: //// first start up
{
AppFirstStartUp(&MainCmdDeal);
break;
}
default: //// for active
{
AppDefault(&MainCmdDeal);
break;
}
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
本帖最后由 power568 于 2017-9-15 12:26 编辑
安 发表于 2017-9-14 13:57
楼主的意思是Delay16(6000);应该停留在这里吗?
如果这个也不能工作,可能是被优化了,顺便发一下Delay ... 是卡在Delay16(6000)的延时函数之内。 应该不是优化的问题,使用的是IAR,优化等级为Low。
void Delay16(uint16_t n)
{
uint16_t tt;
for(tt = 0;tt<n;tt++);
for(tt = 0;tt<n;tt++);
for(tt = 0;tt<n;tt++);
for(tt = 0;tt<n;tt++);
for(tt = 0;tt<n;tt++);
}
仿真全速运行时,使用软件复位命令后,程序卡在函数内ResetSlaveMcu的延时函数中,暂停后单步跳出该函数又可以全速运行;但是全速运行时在该函数之后打断点有不会卡住...
页:
[1]
2