Копаю таймеры.
Взял в качестве подопытного Таймер2. Обычный такой, 16-разрядный, общего назначения.
Запилил на нем мыргание светика раз в секунду.
В общем случае инициализация и запуск таймера выглядит так -
NVIC_EnableIRQ(TIM2_IRQn); //Запускаем контроллер прерываний, прицепляем к нему Таймер2.
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; //Подаем клок на Таймер2, он болтается на АРВ1.
TIM2->PSC = 16000-1UL; // Делитель на входе таймера. Делит до 65536 при желании. У нас частота, приходящая на АРВ1 - 16Мгц, поэтому делим на 16000.
TIM2->ARR = 1000-1UL; // До скольки считает таймер. Типа TCNT на AVR... При значении 1000 мы получаем прерывания 16000000/16000/1000 = 1 прерывание в секунду.
TIM2->DIER = TIM_DIER_UIE; // Включим прерывания от события update. Т.е., по достижению счета до ARR, происходит апдейт счетчика, и это событие инициирует прерывание.
TIM2->CR1 = TIM_CR1_CEN; // Собственно, включаем таймер2.
TIM2->CNT = 0; // Сбросим текущее значение таймера в 0, пускай считает дальше сам.
Для ловли прерывания от таймера используем дежурную функцию -
Как бы и всё...Код:void TIM2_IRQHandler(void) { if(TIM2->SR & TIM_SR_UIF) { TIM2->SR &= ~TIM_SR_UIF; //сброс флага прерывания, иначе его зациклит. } //обработчик прерывания }
Пойду дальше разбираться.




ScorpEvo ZS 1024 turbo+ CF-HDD/FDD/Mouse/SMUC 3.1/ProfROMse/NeoGS/ZC
Ответить с цитированием