Как написал Serj78, это я долго не мог понять причину того, почему не работает как надо прерывание, в данном случае от Tim2 - UIE.
Буквально несколько дней, как начал осваивать ARMы, использую - STM32, Eclipse, arm-gcc.
Код ниже. Т.е. если очищать флаг запроса на прерывание перед самым выходом из него, то попадаем в прерывание второй раз. Не могу понять причин такого поведения.
Может кто-нибудь проверить это?
#include "stm32f10x.h"
#define PortC_pin12 (*((volatile unsigned long *)0x422201B0 ))
int main()
{
RCC->APB2ENR = RCC_APB2ENR_IOPCEN;
GPIOC->CRH = GPIO_CRH_MODE12; // PC12 - 50MHz, push-pull - светодиод
RCC->APB1ENR = RCC_APB1ENR_TIM2EN;
TIM2->PSC = 61; // при 8мГц тактовой Tim2 переполняется примерно 2 раза в секунду
TIM2->DIER = TIM_DIER_UIE; // включаем прерывание по переполнению Tim2
TIM2->CR1 = TIM_CR1_CEN; // запускаем Tim2
NVIC->ISER[0] = 1<<TIM2_IRQn; // разрешаем прерывания от Tim2
while(1);
}
void TIM2_IRQHandler(void)
{
static uint8_t state = 0;
if(state == 0)
{
PortC_pin12 = 1;
state = 1;
}
else
{
PortC_pin12 = 0;
state = 0;
}
TIM2->SR = 0; // Очищаем все запросы от Tim2
//NVIC->ICPR[0] &= ~(1<<TIM2_IRQn); // сначала заработало с этой строчкой
// потом просто заставил выполнить МК еще 1(или не 1?) такт - эффект аналогичный
TIM2->SR = 0; // если закомментировать, то попадаем в прерывание по 2 раза
}