你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

L052函数内使用 #if 0 后程序运行异常

[复制链接]
power568 提问时间:2017-9-13 17:20 /
      最近在调试低功耗,进入低功耗函数如下:

  1. void vMcuEnterStopMode(void)
  2. {
  3.          //// for test
  4. #if 1
  5.        
  6.         __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
  7.         HAL_PWREx_EnableUltraLowPower();
  8.         HAL_PWREx_EnableFastWakeUp();
  9.         HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
  10.        
  11.         SystemClock_Config();
  12.        
  13. #endif
  14. }
复制代码
    #if 1时进入低功耗功能正常,但是当为#if 0时,程序异常,会停留在main函数开始出的延时处,当时奇怪的是打断点(断点必须在停留延时函数之后)调试时可以的,就是全速仿真运行或者真正运行时功能异常。    停留函数如下:

  1. void GpioInit(void)
  2. {
  3.   GPIO_InitTypeDef GPIO_InitStruct;

  4.   __HAL_RCC_GPIOB_CLK_ENABLE();
  5.        
  6.   HAL_GPIO_WritePin(RESET_ASSIST_GPIO_Port, RESET_ASSIST_Pin, GPIO_PIN_RESET);

  7.   GPIO_InitStruct.Pin = RESET_ASSIST_Pin;
  8.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  9.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  10.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  11.   HAL_GPIO_Init(RESET_ASSIST_GPIO_Port, &GPIO_InitStruct);
  12.         HAL_GPIO_WritePin(RESET_ASSIST_GPIO_Port, RESET_ASSIST_Pin, GPIO_PIN_RESET);
  13.         Delay16(6000);
  14.        
  15.   GPIO_InitStruct.Pin = RESET_ASSIST_Pin;
  16.   GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  17.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  18.   HAL_GPIO_Init(RESET_ASSIST_GPIO_Port, &GPIO_InitStruct);
  19. }
复制代码
    但是将延时函数直接顶替该函数后,功能又正常。     在该函数之前还有大约5ms的延时,将延时增加到30Ms后,功能又正常。

     不知道什么原因???
     各位大侠请支招哦。谢谢!!!



收藏 1 评论11 发布时间:2017-9-13 17:20

举报

11个回答
回答时间:2017-9-14 08:12:26
首先要明白#if的功能,如果是#if 0...#endif 这段代码是不编译的。
MrJiu 回答时间:2017-9-14 10:46:29
首先要搞清预编译和代码得区别。。。预编译是指编译器执行的。。。而真正得代码是MCU执行。。两者有本质区别哦。。。。
power568 回答时间:2017-9-14 13:24:48
安 发表于 2017-9-14 08:12
首先要明白#if的功能,如果是#if 0...#endif 这段代码是不编译的。

要的就是比编译这个功能,因为调试时进入低功耗比较麻烦,本想用这个功能来屏蔽这部分代码使该函数为空函数,以为空函数不影响,但是好像还是有影响
power568 回答时间:2017-9-14 13:26:38
MrJiu 发表于 2017-9-14 10:46
首先要搞清预编译和代码得区别。。。预编译是指编译器执行的。。。而真正得代码是MCU执行。。两者有本质区 ...

我以为怕屏蔽了后是空函数,应该能正常工作,但是工作异常,问题是影响的地方居然不是函数调用的地方,所以有点疑惑...
MrJiu 回答时间:2017-9-14 13:49:05
power568 发表于 2017-9-14 13:26
我以为怕屏蔽了后是空函数,应该能正常工作,但是工作异常,问题是影响的地方居然不是函数调用的地方,所 ...

那你把main函数也贴出来看看。。。。
回答时间:2017-9-14 13:57:16
楼主的意思是  Delay16(6000);应该停留在这里吗?
如果这个也不能工作,可能是被优化了,顺便发一下  Delay16(6000)的函数。
power568 回答时间:2017-9-15 11:45:00
MrJiu 发表于 2017-9-14 13:49
那你把main函数也贴出来看看。。。。

     main函数没有太多的东西,都是初始化,如下:

  1. int main(void)
  2. {

  3.   /* USER CODE BEGIN 1 */
  4.         Delay16(1000); /* USER CODE END 1 */
  5.         ResetSlaveMcu();
  6.        
  7.         vReadDeviceInforFromFlash(DEVICE_INFO_ADDRESS, &Set_distance_data, 1 );
  8.         vReadDeviceInforFromFlash(DEVICE_VOICE_ADDRESS, &AlarmVoiceIndex, 1 );
  9.         if ( (9>AlarmVoiceIndex) || (11<AlarmVoiceIndex) )
  10.         {
  11.                 AlarmVoiceIndex = 9;
  12.         }
  13. #if 0 ////for test
  14.         uint16_t temp_flash_data_rewrite = 1;
  15.         vWriteDeviceInforToFlash(DEVICE_MODE_ADDRESS, (uint16_t *)&temp_flash_data_rewrite, 1);
  16. #endif
  17.         vReadDeviceInforFromFlash(DEVICE_MODE_ADDRESS, (uint16_t *)&System_mode, 1 );
  18.   
  19.   /* MCU Configuration----------------------------------------------------------*/

  20.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  21.   HAL_Init();

  22.   /* Configure the system clock */
  23.   SystemClock_Config();
  24.        
  25.   /* Initialize all configured peripherals */
  26.   MX_GPIO_Init();
  27.        
  28.   MX_DMA_Init();
  29.   MX_ADC_Init();
  30.   MX_RTC_Init();
  31.   MX_SPI1_Init();
  32.   MX_USART2_UART_Init();

  33.   /* USER CODE BEGIN 2 */
  34.         __HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);
  35. #if 0
  36.   MX_USART1_UART_Init();
  37.         __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
  38. #endif
  39.        
  40.         DataStructInit();
  41.        
  42.         AppStartAdc();
  43.        
  44.         AppSlaveModeSet(&MainCmdDeal);
  45.        
  46.         AppIwdgInit();
  47.   /* USER CODE END 2 */

  48.        
  49.   /* Infinite loop */
  50.   /* USER CODE BEGIN WHILE */
  51.        
  52.   while (1)
  53.   {
  54.                 switch (System_mode)
  55.                 {
  56.                         case 2: //// sleep
  57.                         {
  58.                                 AppSleepMode(&MainCmdDeal);
  59.                                 break;
  60.                         }
  61.                         case 1: //// active
  62.                         {
  63.                                 AppActiveMode(&MainCmdDeal);
  64.                                 break;
  65.                         }
  66.                         case 0xFFFF: //// first start up
  67.                         {
  68.                                 AppFirstStartUp(&MainCmdDeal);
  69.                                 break;
  70.                         }
  71.                         default: //// for active
  72.                         {
  73.                                 AppDefault(&MainCmdDeal);
  74.                                 break;
  75.                         }
  76.                 }
  77.   /* USER CODE END WHILE */

  78.   /* USER CODE BEGIN 3 */

  79.   }
  80.   /* USER CODE END 3 */

  81. }
复制代码

power568 回答时间:2017-9-15 11:45:46
本帖最后由 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++);
}
power568 回答时间:2017-9-15 12:23:54
       仿真全速运行时,使用软件复位命令后,程序卡在函数内ResetSlaveMcu的延时函数中,暂停后单步跳出该函数又可以全速运行;但是全速运行时在该函数之后打断点有不会卡住...
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版