Serhiy_UA 1 November 20 Posted November 20 (edited) · Report post Работаю с платой 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 November 21 by haker_fox Форматируйте текст и код самостоятельно! Quote Share this post Link to post Share on other sites More sharing options...
x893 29 November 20 Posted November 20 · Report post volatile char Tic5ms; Quote Share this post Link to post Share on other sites More sharing options...
tonyk_av 19 November 21 Posted November 21 · Report post 7 hours ago, Serhiy_UA said: Для IAR все работает как задумано, действия повторяются каждые 5 мс. Включите оптимизацию в ИАР и тоже перестанет выполняться, скорей всего. Не думаю, что ИАР глупее ГЦЦ. Quote Share this post Link to post Share on other sites More sharing options...
Serhiy_UA 1 November 21 Posted November 21 · Report post Большое спасибо за быстрые ответы. Сразу помогла рекомендация от x893. В main.c для переменной Tic5ms доопределил volatile как рекомендовано, теперь все работает нормально: volatile char Tic5ms; Quote Share this post Link to post Share on other sites More sharing options...