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

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的延时函数中,暂停后单步跳出该函数又可以全速运行;但是全速运行时在该函数之后打断点有不会卡住...
儒墨 回答时间:2017-9-18 15:02:25
楼主感觉和我碰到一样的问题了,我之前发了帖子,叫stm32l051和cc1101低功耗问题。我调试低功耗发现,睡眠之前加个延时或者语句,会造成功耗在10uA正常,或者100uA功耗不对的情况。
power568 回答时间:2017-9-19 13:09:32
儒墨之争 发表于 2017-9-18 15:02
楼主感觉和我碰到一样的问题了,我之前发了帖子,叫stm32l051和cc1101低功耗问题。我调试低功耗发现,睡眠 ...

那你的问题解决了吗...

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版