Jump to content
    

Не понятна работа программы в STM32CubeIDE.

Работаю с платой STM32F407VET6 в среде STM32CubeIDE версии 1.12.1, в которой не получалось запустить программу, работающую нормально в среде IAR версии 7.70.

В программах таймер 3, вызывает прерывание каждые 5 мс, и в нем для глобальной переменной выполняется Tic5ms = 1. Для IAR в main.c организован бесконечный цикл входа каждые 5мс в функциональный блок, внутри которого уже Tic5ms = 0. Выглядит цикл так: 

/* Infinite loop */

  /* USER CODE BEGIN WHILE */  

  while (1)

  {

    if(Tic5ms){

      MyLedBlink(150);

      MyUart1_Compil();

      Tic5ms = 0;

    }

    /* USER CODE END WHILE */

  }

Для IAR все работает как задумано, действия повторяются каждые 5 мс. Но для CubeIDE этот функциональный блок не работает, в него нет захода без дополнительного оператора HAL_GPIO, что установлен перед  if(Tic5ms). В CubeIDE в этом месте программа такая: 

/* Infinite loop */

  /* USER CODE BEGIN WHILE */

 while (1)

  {

     HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, GPIO_PIN_RESET);

     if(Tic5ms) {

       MyLedBlink(150);

       MyUart1_Compil();

       Tic5ms = 0;

    }

    /* USER CODE END WHILE */

  }

То есть, без дополнительного обращения выводу С7 перед if(Tic5ms), вход в блок почему-то в CubeIDE не выполняется. Вместо С7 можно вставить другой вывод, лишь бы был такой дополнительный оператор.  Прерывание же для обеих сред выглядит одинаково:

void TIM3_IRQHandler(void)

{

  /* USER CODE BEGIN TIM3_IRQn 0 */

  extern  char  Tic5ms;

        Tic5ms = 1;

  /* USER CODE END TIM3_IRQn 0 */

  HAL_TIM_IRQHandler(&htim3);

  /* USER CODE BEGIN TIM3_IRQn 1 */

  /* USER CODE END TIM3_IRQn 1 */

}

В принципе можно работать и с дополнительным оператором, хоть и пришлось помучаться чтобы найти это решение. Но все же вопрос остался, почему так происходит. Других отклонений не находил, программы из обеих сред работают нормально, а выбор в пользу CubeIDE имеет некое преимущество в силу бесплатности и легальности. 

Edited by haker_fox
Форматируйте текст и код самостоятельно!

Share this post


Link to post
Share on other sites

7 hours ago, Serhiy_UA said:

Для IAR все работает как задумано, действия повторяются каждые 5 мс.

Включите оптимизацию в ИАР и тоже перестанет выполняться, скорей всего. Не думаю, что ИАР глупее ГЦЦ.

Share this post


Link to post
Share on other sites

Большое спасибо за быстрые ответы. Сразу помогла рекомендация от x893. В main.c для переменной Tic5ms доопределил volatile как рекомендовано, теперь все работает нормально:

volatile char Tic5ms;  

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...