Skip to content
Tags

РАБОТА ТАЙМЕРОВ МК STM32F100RB В РЕЖИМЕ OUTPUT MODE

by admin on May 16th, 2012

РАБОТА ТАЙМЕРОВ МК STM32F100RB В РЕЖИМЕ OUTPUT MODE

В даной статье описан процес конфигурации таймеров МК STM32F100RB для работы в режиме Output mode.
Начиная изучать любой МК, одним из первых периферийных устройств с которым мы стыкаемся есть Таймеры/Счетчики. Это один из необходимых инструментов для построения почти любого изделия на базе микроконтроллера.
В STM32F100RB представлено большое количество таймеров (TIM1, TIM2, TIM3, TIM4, TIM6, TIM7, TIM15, TIM16, TIM17), все они 16-ти разрядные. В свою очередь таймеры деляться в зависимости от количества возможных режимов работы: самый «продвинутый» таймер/счетчик - TIM1; таймеры/счетчики общего назначения - TIM2, TIM3, TIM4, TIM15, TIM16, TIM17; базовые таймеры/счетчики TIM4, TIM6, TIM7.
Не буду углублять в особенности каждой из груп, скажу только что все что будет написано ниже касаеться «продвинутого» и базовых таймеров/счетчиков.
Output mode – это режим управления уровнем на ножке МК средствами таймера/счетчика без участи ядра МК (исключает необходимость использования прерываний). Даное свойство используеться для генерации ШИМ, генерации тактового сигнала с людой величиной скважности и многое другое.
Сразу оговорюсь, почему я начал писать эту статью. В документации на даный МК не описано (по пунктам) как отконфигурировать такой режим. Самым наглядным пособием являеться рисунок 173. Поэтому, как правило, это вызвает опредиленные трудности.
Итак, перейдем к конфигурации.
Для начала общие настройки:
- выбрать таймер (в примерах ниже я работаю с TIM16), включить тактирование;
- включить тактирование порта, ножки которого управляються OС (Output Chanel – внешний канал таймера), таймера;
- включить тактирование альтернативных функций;
- настроить ножки OС в альтернативный режим работы.
Теперь конкретно о настройках таймера.
Для начала необходимо задать общие настройки: коэфициент деления, включить/выключить предзагрузочный регистр (для уменшения величины счета), включить/выключить необходимые прерывания.
Далее определить сколько у выбраного таймера каналов на выход OС, и какие каналы мы хотим задействовать. При этом следует учесть, что для каждого канала есть две управляимые ножки: OСx и OСxN (здесь и далее по тексту TIMх – таймер номер х, OСx и OСxN – внешняя ножка канала канала OС номер х). Даные ножки работают последовательно – при установке OСx, происходит сброс OСxN и наоборот.
Output mode поддерживает несколько подрежимов работы, поэтому нужно выбрать один из них: устанока канала в активное/не активное состояние при совпадении счетного регистра с регистром сравнения; принудительная устанвка канала в активное/не активное состояние; переключение канала при совпадении счетного регистра с регистром сравнения;один из двух режимов ШИМ.
Так же можно выбрать уровень активного состояния ножки.
При ипользовании канала OС, можно задать время запаздывания при переключении OСx/OСxN. Даное свойство называеть Dead-Time generators. Его использование позволяет избежать возникновению сквозных токов во внешних цепях в момент смены уровня на ножках. Докладнее описывать включение Output mode с использованием Dead-Time generators я описывать не буду, поскольку такая задачка мне еще не подворачивалась. Хотя по личным просьбам читателей, могу описать. Адрес почты в подвале статьи.
Для того чтобы перевести таймер/счетчик в режим управления внешним каналом (Output mode), который связан с ножками микроконтроллера, необходимо выполнить действия согласно рисунку 173, страница 387.
(бит OC1EC регистра TIMx_CCMR1 присутствует только в Таймерах/Счетчика 1-5).
Далее опишу необходимые конфигурации битов регистров для того чтобы включить Output mode, выбрать подрежим работы и отконфигурировать:
1. Задать каналу захвата/сравнения исходящий режим работы (Output mode). Для этого отконфигурировать биты CC1S[1:0] регистра TIMx_CCMR1 :
0 0 – канал ССх канал х сконфигурирован в исходящий (Output mode) режим работы
(все остальные комбинации битов относяться к режиму input mode).
ЭТИ БИТЫ МОЖНО УСТАНОВИТЬ ТОЛЬКО ПРИ СБРОШЕННОМ БИТЕ CC1E РЕГИСТРА TIM16_CCER !
2. Выбрать необходимый режим переключения внешнего канала (тоесть поведение канал OC в случаи превышение величины счетного регистра TIMx_CNT над величиной регистра Захвата/сравнения TIMx_CCRx ).Для этого сконфигурировать биты OC1M[2:0] в регистре TIMx_CCMR1:
0 0 0 – сравнение между счетным регистром и регистром захвата/сравнения не влияет на поведение внешнего канала ;
0 0 1 –установить канал OC в активное состояние когда TIMx_CNT >TIMx_CCRx;
0 1 0 –установить канал OC в не активное состояние когда TIMx_CNT >TIMx_CCRx;
0 1 1 –переключение канала OC когда TIMx_CNT = TIMx_CCRx ;
1 0 0 – принудительно установить канал OC в не активное состояние (независимо от величины TIMx_CNT и TIMx_CCRx);
1 0 1 – принудиткльно установить канал OC в в активное состояние (независимо от величины TIMx_CNT и TIMx_CCRx);
1 10 – режим ШИМ №1. Для инкрементного счета: канал OС в активном состоянии до тех пор, пока TIMx_CNT TIMx_CCRx - активный, далее – не активный);
1 11 – режим ШИМ №2. Для инкрементного счета: канал OС в активном состоянии до тех пор, пока TIMx_CNT >TIMx_CCRx, в противном слущае – не активный. Для декриментного счета – наоборот (TIMx_CNT Необходимо заметить, что указаными выше битами регулируеться только режим переключения, уровень активного состояния конфигурируеться битами CC1N, CC1NE регистра TIMx_CCRE.
3. Указать момент обновления регистра Захвата/сравнения TIMx_CCRx. Для этого отконфигурировать бит OCPE в регистре TIMx_CCMR1:
0 – предзагрузочный регистр регистра Захвата/сравнения TIMx_CCRx выключен, это означает, что при записив в регистр Захвата /сравнения TIMx_CCRx, он обновляеться немедленно;
1 – предзагрузочный регистр регистра Захвата/сравнения TIMx_CCRx включен, это означает, что при записив в регистр Захвата /сравнения TIMx_CCRx, он обновляеться после выполнения операции обновления (переполнения, принудительного обновления );
4. Разрешить упарвление ножками OСx и OСxN контроллера таймеру. Для этого необходимо сконфигурировать биты CC1E и CC1NE в регистре TIMx_CCER (CC1E |CC1NE):
0 – управление (ОСх| OСxN) таймером запрещено;
1 – управление (ОСх| OСxN) таймером разрешено. Дальнейшее поведение канала OС (и ножек соответствено) зависит от конфигурации битов MOE, OSSI, OSSR, OIS1, OIS1N, CC1NE.
5. Задать логичесий уровень «активного состояния» ножек OСx и OСxN. Для этого отконфигурировать биты CC1P – для ножки OСx и CC1NP для ножки OСxN в регистре TIMx_CCER:
0 – активный уровень высокий;
1 – активный уровень низкий.
6. Включить управление ножками МК выходному каналу тамера/счетчика. Для этого необходимо установить бит MOE регистра TIMх_BDTR.

Ниже приведу пример настройки TIM16 для работы в режиме Output mode, подрежим - ШИМ №1.В даном таймере есть только один канал ОС, который соединен с ножками РВ6 – OС1N, РВ8 – OС1. Проэкт создан в IDE Atollic TrueSTUDIO.

#include 
#include "stm32f10x.h"

// коэфмцмэнт заполнения ШИМ
#define K_PWM 0.2331
// период ШИМ, с
#define T_PWM 0.001
// частота счета таймера (для наглядности)
#define F_SYS 24000000

void main(void){
u16 q;
    RCC->APB2ENR|=(RCC_APB2ENR_AFIOEN);   // вкла тактирование альтернативных функций
    RCC->APB2ENR|=(RCC_APB2ENR_IOPBEN);   // вкла тактирование порта В
    RCC->APB2ENR|=(RCC_APB2ENR_IOPCEN);   // вкла тактирование порта С
	RCC->APB2ENR|=(RCC_APB2ENR_TIM16EN);  // вкла тактирование таймера
	// конфигураци на выход ножки С9 (светодиод, индикация)
    GPIOC->CRH&=(~(GPIO_CRH_CNF9)|(GPIO_CRH_MODE9));
    GPIOC->CRH|=((GPIO_CRH_MODE9_0));
	GPIOC->ODR|=GPIO_ODR_ODR9;
	// ножка CH1
	GPIOB->CRH&=(~(GPIO_CRH_CNF8)|(GPIO_CRH_MODE8)); // конфигурируем PB8 для альтернативного режима работы
	GPIOB->CRH|=((GPIO_CRH_CNF8_1)|(GPIO_CRH_MODE8_1));//-----------
	// ножка CH1N
	GPIOB->CRL&=(~(GPIO_CRL_CNF6)|(GPIO_CRL_MODE6)); // конфигурируем PB6 для альтернативного режима работы
	GPIOB->CRL|=((GPIO_CRL_CNF6_1)|(GPIO_CRL_MODE6_1));//-----------

// ОБЩИЕ НАСТРОЙКИ ТАЙМЕРА

	TIM16->PSC=10;   // коэфициэнт деления таймера
	TIM16->ARR=(F_SYS*T_PWM)/TIM16->PSC;  // ограничиваем период
	TIM16->CCR1=TIM16->ARR*K_PWM; // задаем коэфицмент заполнения (ограничиваем величину счета)
	TIM16->CR1|=TIM_CR1_ARPE;  // включить регистр предзагрузки (ограничивающий величину счета)
	TIM16->DIER|=TIM_DIER_UIE; // разрешить прерывание при переполнении
	TIM16->CCMR1=0;            // сбросить регистр CCMR1
	TIM16->CCMR1|=((TIM_CCMR1_OC1M_2)|(TIM_CCMR1_OC1M_1)); // output mode подрежим - ШИМ №1

// КОНФИГУРАЦИЯ ТАЙМЕРА ДЛЯ РАБОТЫ В РЕЖИМЕ OUTPUT MODE

	TIM16->CCER=0;             // сбросить регистр CCER
	TIM16->CCER|=((TIM_CCER_CC1E)|(TIM_CCER_CC1NE)|(TIM_CCER_CC1NP)); // разрешить таймеру управление
	// ножками ОС, для ножки OC1 при активном состоянии логический уровень высокий (РВ8), для ножки OC1N
	// при активном состоянии логический уровень низкий (РВ6)
	TIM16->BDTR|=TIM_BDTR_MOE; // Включить управление ножками МК таймером

	TIM16->EGR|=TIM_EGR_UG;   // генерация обновления
	TIM16->CR1|=(TIM_CR1_CEN); // включить таймер
	NVIC_EnableIRQ(TIM1_UP_TIM16_IRQn);
	__enable_irq();  // разрешаем прервания

	while (1){};

};

// Обработка прерывания по переполнению таймера/счетчика 16
void TIM1_UP_TIM16_IRQHandler(void){
    static char a;
    TIM16->SR^=TIM_SR_UIF; // очистить флаг прерывания
    a++;
    if (a==0){GPIOC->ODR^=GPIO_ODR_ODR9;}; // Переключение светодиода при количестве //прерываний больше 256
};

From → STM32, timers

Comments are closed.