Описание бита ARRMCF в регистре ICT LPTIM в справочном руководстве STM32L0x1 гласит:
Запись 1 в этот бит очищает флаг ARRM в регистре LPT_ISR.
Сам бит ARRMCF - и все остальные биты в регистре ICR - не читаются, поэтому не следует ожидать получения какого-либо конкретного значения при их чтении. Фактически, ваш код, который использует |=
, является подозрительным, потому что вы неявно говорите компилятору читать из этого регистра. Я думаю, что вы должны изменить его, чтобы использовать обычное назначение.
Кроме того, вы используете неправильный оператор C, чтобы проверить, установлен ли ваш флаг прерывания.
Кроме того, я не уверен, как битовые макросы определены в вашей среде, поэтому я буду в безопасности и не буду использовать их в коде, который я собираюсь представить.
Взяв все это вместе, я бы предложил изменить ваш код на:
extern "C" void LPTIM1_IRQHandler()
{
if (LPTIM1->ISR & (1 << 1))
{
// ARRM interrupt flag is set, so clear it.
LPTIM1->ICR = (1 << 1);
flag_TimerInterrupt = true;
}
}
Кроме того, если вы используете отладчик, вполне возможно, что это прерывание запускается таймером тысячи раз в секунду, пока отладчик ожидает вашего следующего действия. Если это так, вы никогда не сможете пошагово пройти через код основного цикла (код вне каких-либо прерываний). Возможно, вам придется просто отладить это на реальном оборудовании, пока оно не заработает. Вы можете использовать GPIO для получения информации о состоянии вашей программы и просмотра сигналов GPIO на осциллографе. Я не очень часто использовал отладчики STM32, поэтому, возможно, таймеры могут быть заморожены, пока отладчик ждет вас.