СОВРЕМЕННАЯ ЭЛЕКТРОНИКА №9/2014
ЭЛЕМЕНТЫ И КОМПОНЕНТЫ 27 WWW.SOEL.RU СОВРЕМЕННАЯ ЭЛЕКТРОНИКА ◆ № 9 2014 частота; PSC – содержимое регистра TIMx_PSC таймера, определяющее коэффициент деления. Если записать в регистр TIMx_PSC значение 23999, то счётный регистр TIMx_CNT при тактовой частоте 24 МГц будет изменять своё значение 1000 раз в секунду. Регистр автоматической загрузки хранит значение для загрузки счёт- ного регистра TIMx_CNT. Обновление содержимого регистра TIMx_CNT про- изводится после его переполнения или обнуления, в зависимости от заданно- го для него направления счёта. Регистр управления TIMх_CR1 име- ет несколько управляющих разрядов. Разряд ARPE разрешает и запрещает буферирование записи в регистр авто- матической загрузки TIMx_ARR. Если этот бит равен нулю, то при записи нового значения в TIMx_ARR оно будет загружено в него сразу. Если бит ARPE равен единице, то загрузка в регистр произойдёт после события достиже- ния счётным регистром предельного значения. Разряд OPM включает режим «одно- го импульса». Если он установлен, после переполнения счётного регистра счёт останавливается и происходит сброс разряда CEN. Разряд UDIS разрешает и запрещает генерирование события от таймера. Если он обнулён, то событие будет гене- рироваться при наступлении условия генерирования события, то есть при переполнении таймера или при про- граммной установке в регистре TIMx_ EGR разряда UG. Разряд CEN включает и отключает таймер. Если обнулить этот разряд, то будет остановлен счёт, а при его уста- новке счёт будет продолжен. Входной делитель при этом начнёт счёт с нуля. Регистр управления TIMх_CR2 име- ет три управляющих разряда MMS2… MMS0, которые определяют режим мастера для таймера. В регистре TIMx_DIER использует- ся два разряда. Разряд UDE разреша- ет и запрещает выдавать запрос DMA (ПДП) при возникновении события. Разряд UIE разрешает и запрещает пре- рывание от таймера. В регистре TIMx_SR задействован только один разряд UIF в качестве фла- га прерывания. Он устанавливается аппаратно, при возникновении собы- тия от таймера. Сбрасывать его нужно программно. Регистр TIMx_EGR содержит разряд UG, который позволяет программно генерировать событие «переполне- ние счётного регистра». При установ- ке этого разряда, происходит генера- ция события и сброс счётного регистра и предварительного делителя. Обнуля- ется этот разряд аппаратно. Благода- ря этому разряду можно программно генерировать событие от таймера, и тем самым принудительно вызывать функ- цию обработчика прерывания таймера. Карта регистров для базовых таймеров TIM6 и TIM7 Сдвиг Регистр 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 0x00 TIMx_CR1 Резерв ARPE Резерв OPM URS UDIS CEN Исх.значение 0 0 0 0 0 0x04 TIMx_CR2 Резерв MMS[2:0] Резерв Исх.значение 0 0 0 0x08 Резерв 0x0C TIMx_DIER Резерв UDE Резерв UIE Исх.значение 0 0 0x10 TIMx_SR Резерв UIF Исх.значение 0 0x14 TIMx_EGR Резерв UG Исх.значение 0 0x18 Резерв 0x1C Резерв 0x20 Резерв 0x24 TIMx_CNT Резерв CNT[15:0] Исх.значение 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0x28 TIMx_PSC Резерв PSC[15:0] Исх.значение 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0x2C TIMx_ARR Резерв ARR[15:0] Исх.значение 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Листинг 1 #define FAPB1 24000000 // Тактовая частота шины APB1 // Функция задержки в миллисекундах и микросекундах void delay(unsigned char t, unsigned int n) { // Загрузить регистр предварительного делителя PSC If(t = = 0) TIM7->PSC = FAPB1/1000000-1; // для отсчёта микросекунд If(t = = 1) TIM7->PSC = FAPB1/1000-1; // для отсчёта миллисекунд TIM7->ARR = n; // Загрузить число отсчётов в регистр автозагрузки ARR TIM7->EGR |= TIM_EGR_UG; // Сгенерировать событие обновления // для записи данных в регистры PSC и ARR TIM7->CR1 |= TIM_CR1_CEN|TIM_CR1_OPM; // Пуск таймера // путём записи бита разрешения счёта CEN // и бита режима одного прохода OPM в регистр управления CR1 while (TIM7->CR1&TIM_CR1_CEN != 0); // Ожидание окончания счёта }
RkJQdWJsaXNoZXIy MTQ4NjUy