Перейти к содержанию
    

Не понятна работа программы в 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 имеет некое преимущество в силу бесплатности и легальности. 

Изменено пользователем haker_fox
Форматируйте текст и код самостоятельно!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 hours ago, Serhiy_UA said:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

volatile char Tic5ms;  

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...