Serhiy_UA 1 20 ноября, 2023 Опубликовано 20 ноября, 2023 (изменено) · Жалоба Работаю с платой 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 имеет некое преимущество в силу бесплатности и легальности. Изменено 21 ноября, 2023 пользователем haker_fox Форматируйте текст и код самостоятельно! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 35 20 ноября, 2023 Опубликовано 20 ноября, 2023 · Жалоба volatile char Tic5ms; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tonyk_av 31 21 ноября, 2023 Опубликовано 21 ноября, 2023 · Жалоба 7 hours ago, Serhiy_UA said: Для IAR все работает как задумано, действия повторяются каждые 5 мс. Включите оптимизацию в ИАР и тоже перестанет выполняться, скорей всего. Не думаю, что ИАР глупее ГЦЦ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Serhiy_UA 1 21 ноября, 2023 Опубликовано 21 ноября, 2023 · Жалоба Большое спасибо за быстрые ответы. Сразу помогла рекомендация от x893. В main.c для переменной Tic5ms доопределил volatile как рекомендовано, теперь все работает нормально: volatile char Tic5ms; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться