Работает как шарм. Только потому, что я получил помощь здесь, опишу для будущих заинтересованных людей.
Способ заставить прерывание работать для таймеров - генерировать прерывание «вручную» один раз. Это нормально, потому что вы можете контролировать то, что происходит во время прерывания, одним «если».
/* TIMER Enable */
RCC->APB2ENR = RCC_APB2ENR_TIM22EN;
У меня была проблема с вышеуказанным объявлением, не знаю почему, но оно не работало после объявления еще нескольких модулей перед ним. Пришлось поставить его выше в списке. Руководство не говорит, почему это произошло.
/* Configure TIM22 interrupt */
TIM22->PSC = (SYSCLK_FREQ/1000)-1; /* Prescaler TIMERA 22 */
TIM22->DIER = TIM_DIER_UIE;
TIM22->CNT = 0;
TIM22->EGR = TIM_EGR_UG;
NVIC_EnableIRQ(TIM22_IRQn); /* Zalaczenie przerwania od TIMER'a */
NVIC_SetPriority(TIM22_IRQn,4); /* Ustawienie priorytetu przerwania od TIMER'a */
Прескейлер имел значение 1 мс, поэтому я разделил 524288 моей скорости ядра. Затем включите прерывание, сбросьте счетчик, чтобы убедиться, что он начинается с 0, а затем вручную создайте прерывание. И он делает прерывание «цикл» один раз, но с одним «если» и переменной, я могу контролировать, что он делает.
Итак, что я делаю, я вызываю функцию, которая устанавливает часы и включает счетчик внутри другой функции enable = 1; timer_init (мс);
Затем следует вызов функции
void timer_init(uint16_t ms)
{
TIM22->CNT = 65535-ms;
TIM22->CR1 |= TIM_CR1_CEN;
}
void TIM22_IRQHandler(void)
/* Up-Counter milisec */
{
if(TIM22->CR1 & TIM_CR1_CEN) {TIM22->CR1 &= ~TIM_CR1_CEN;}
if(TIM22->SR & TIM_SR_UIF) {
if(enable == 1){
GPIOB->BSRR = GPIO_BSRR_BS_7;
}
}
TIM22->SR=0;
}
И прерывание.
Большое спасибо! Веселитесь с регистрами!