Цитата(1kvi1 @ Nov 24 2011, 05:31)

Добрый день!
Возникла следующая интересная проблема.
По ходу выполнения прошивки в какой то момент происходит зацикливание программы на прерывании от USART1.
То есть выполняется запуск обработчика прерываний с частотой примерно 100 кГц.
Основная программа успевает сделать несколько инструкций после чего снова происходит прерывание.
...
не любит STM чтобы использовали код не так, как в их примерах)). Заметил тоже самое с другими прерываниями. Например с таймером, вот такой код работает нормально:
Код
void TIM4_IRQHandler(void)
{
if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)
{
//здесь обработчик прерывания
}
}
а теперь для теста добавим пару переменных
Код
void TIM4_IRQHandler(void)
{
CountTest1++;
if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)
{
//здесь обработчик прерывания
CountTest2++;
}
}
В этом случае все рассыпается, переменная CountTest1 будет постоянно быстрее накапливаться, чем переменная CountTest2. Это говорит о том, что void TIM4_IRQHandler(void) вызывается намного чаще, чем планировалось.
Но вот такой код:
Код
void TIM4_IRQHandler(void)
{
if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)
{
//здесь обработчик прерывания
CountTest2++;
}
CountTest1++;
}
работает нормально и CountTest1 всегда равна CountTest2. Получается, что вставка кода до строки if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) все ломает. Это одинаково проявляется на STM32F207 и STM32F407. Для эксперимента
пробовал добавить GPIOC->ODR ^= GPIO_Pin_13; и посмотреть осциллографом длительность на GPIO_Pin_13. Получается полный хаос. 150 мс прерывания работают как положено раз в 1 мс (таймер настроен на 1 мс), потом на 150 мс висит 0 на GPIO_Pin_13. Может зависнуть на 150 мс и с 1 на выходе GPIO_Pin_13.
Код
void TIM4_IRQHandler(void)
{
GPIOC->ODR ^= GPIO_Pin_13; //индицируем прерывание для отладки
if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)
{
//здесь обработчик прерывания
CountTest2++;
}
}
опять же, если GPIOC->ODR ^= GPIO_Pin_13, добавить после строки if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET), то все оживает и работает как положено.
Сообщение отредактировал vptr - Nov 24 2011, 05:32