Похожие презентации:
q
1.
Программирование микроконтроллеровЛекция 2. Настройка частоты тактирования,
таймера, портов ввода-вывода
Доцент ОИТ ИШИТР Мыцко Евгений Алексеевич
evgenvt@tpu.ru
https://vk.com/evgentomsk70
Томск 2023
2. Схема тактирования в STM32
23. Настройка тактирования в STM32
Настройка системной частотытактирования в STM32 (SYSCLK)
осуществляется путем записи
специальных значений в
регистры RCC_CR и RCC_CFGR
Настройка регистров CR и CFGR
осуществляется согласно схеме
тактирования.
В примере SYSCLK настроена
на 72 МГц
RCC_CR
RCC_CFGR
3
4.
Настройка тактирования в STM32Работа с частотами осуществляется через настройки значений в
специальных регистрах RCC_CR (clock control register) и RCC_CFGR
RCC_CR
Описание полей всех регистров приведено в специальном документе,
называемом reference manual (для каждой архитектуры как правило
есть свой reference manual).
Основные поля RCC_CR имеют следующее описание:
HSION – включить генератор HSI (1-включить, 0 выключить);
HSIRDY – генератор HSI готов (1-готов, 0-не готов);
HSEON, HSERDY по аналогии с HSI;
PLLON – включить PLL;
PLLRDY – PLL готов;
4
5.
Настройка тактирования в STM32Работа с частотами осуществляется через настройки значений в
специальных регистрах RCC_CR (clock control register) и RCC_CFGR
RCC_CFGR
Основные поля RCC_CFGR имеют следующее описание:
• SW – выбор источника тактирования (00: HSI; 01: HSE 10: PLL; 11: не
разрешен);
• SWS – выбранный источник тактирования (00: HIS; 01: HSE 10: PLL;
11: не применим);
• PLLSRC – источник сигнала для PLL (0: HSI/2; 1: HSE);
• PLLMUL – значение множителя PLL (0000 – коэффициент 2, 1111 –
коэффициент 16);
5
6. CMSIS.Настройка тактирования
<stm32f10x.h>#define PERIPH_BASE
#define AHBPERIPH_BASE
#define RCC_BASE
#define RCC
((uint32_t)0x40000000)
(PERIPH_BASE + 0x20000)
(AHBPERIPH_BASE + 0x1000)
((RCC_TypeDef *) RCC_BASE)
6
7. CMSIS. Настройка тактирования
<stm32f10x.h>#define PERIPH_BASE
#define AHBPERIPH_BASE
#define RCC_BASE
#define RCC
((uint32_t)0x40000000)
(PERIPH_BASE + 0x20000)
(AHBPERIPH_BASE + 0x1000)
((RCC_TypeDef *) RCC_BASE)
typedef struct
{
__IO uint32_t CR;
__IO uint32_t CFGR;
__IO uint32_t CIR;
__IO uint32_t APB2RSTR;
__IO uint32_t APB1RSTR;
__IO uint32_t AHBENR;
__IO uint32_t APB2ENR;
__IO uint32_t APB1ENR;
__IO uint32_t BDCR;
__IO uint32_t CSR;
} RCC_TypeDef;
7
8. CMSIS. Настройка тактирования
typedef struct{
__IO uint32_t CR;
__IO uint32_t CFGR;
__IO uint32_t CIR;
__IO uint32_t APB2RSTR;
__IO uint32_t APB1RSTR;
__IO uint32_t AHBENR;
__IO uint32_t APB2ENR;
__IO uint32_t APB1ENR;
__IO uint32_t BDCR;
__IO uint32_t CSR;
} RCC_TypeDef;
8
9.
Устройство таймера TIMx• Отсчет импульсов или времени происходит на 16-ти разрядном
счетчике CNT. Когда код счетчика достигает значения регистра
перезагрузки, счетчик сбрасывается в 0. Таким образом, счетчик
считает по циклу от 0 до значения регистра перезагрузки (ARR).
• Частота сигнала тактирования таймера может быть уменьшена с
помощью 16-ти разрядного предделителя PSC.
• Перезагрузка счетчика формирует событие (прерывание). Частота
его появления также может быть уменьшена счетчиком повторов (8
разрядов). Коэффициент деления задается в регистре повторов.
9
10.
Настройка TIM3• Разрешить тактирование таймера TIM3 в регистре RCC_APB1ENR;
• Записать нужное значение (напр. 23599) предделителя в регистр PSC;
• Записать нужное значение (напр. 999) перезагрузки в регистр ARR;
• Разрешить глобальное прерывание по таймеру в регистре NVIC_ISER0;
• Разрешить прерывание по событию обновления таймера в регистре DIER;
• Включить (запустить) счетчик в регистре CR1
10
11. CMSIS.Настройка таймера
void TIM3_Init () {RCC -> APB1ENR |= RCC_APB1ENR_TIM3EN;
TIM3->PSC = (SystemCoreClock / 2) / 1000 - 1;
TIM3->ARR = 1000 - 1;
TIM3->DIER |= TIM_DIER_UIE;
NVIC_EnableIRQ (TIM3_IRQn);
TIM3 -> CR1 = TIM_CR1_CEN;
}
#define PERIPH_BASE
((uint32_t)0x40000000)
#define APB1PERIPH_BASE
PERIPH_BASE
#define TIM3_BASE (APB1PERIPH_BASE + 0x0400)
#define TIM3
((TIM_TypeDef *) TIM3_BASE)
typedef struct
{
__IO uint16_t CR1;
uint16_t RESERVED0;
__IO uint16_t CR2;
uint16_t RESERVED1;
__IO uint16_t SMCR;
uint16_t RESERVED2;
__IO uint16_t DIER;
uint16_t RESERVED3;
__IO uint16_t SR;
uint16_t RESERVED4;
__IO uint16_t EGR;
uint16_t RESERVED5;
__IO uint16_t CCMR1;
uint16_t RESERVED6;
__IO uint16_t CCMR2;
uint16_t RESERVED7;
__IO uint16_t CCER;
uint16_t RESERVED8;
__IO uint16_t CNT;
….
11
} TIM_TypeDef;
12. Порты ввода/вывода
Порт ввода-вывода – логическое объединение сигнальных линий, черезкоторое принимаются и передаются данные.
GPIO – General Purpose Input Output.
Каждая линия порта, как правило, обозначается как Pnx или Pn.x, где
• n – обозначение порта;
• x – номер бита (линии) в порте.
• Например PA5, P1.5
Каждый порт ввода-вывода обслуживают как минимум 3 служебных
регистра:
• регистр, содержащий данные (уровни сигналов) на всех линиях порта и
используемый для записи сигналов в порт;
• регистр, содержащий состояния входов порта, доступен только для
чтения, используется при чтении данных из порта;
• регистр направления линий порта: каждая линия порта может быть
сконфигурирована как вход или как выход в зависимости от значения
12
бита этого регистра.
13. Устройство порта ввода/вывода STM32
Выходная часть пина состоит из двух полевых транзисторов, подключенных кпитанию Vdd (P-MOS) и земле Vss (N-MOS).
Выход (пин) можно настроить как push-pull или open-drain.
13
14. Работа выхода в режиме push-pull
Cхему выхода в режиме push-pull можно привести к эквивалентной схеме ввиде двух ключей.
При подаче на выход порта логической единицы, верхний ключ
замыкается, а нижний размыкается. Таким образом, от Vdd через
замкнутый ключ и резистор R31 пойдет ток и зажжется светодиод LD2. При
подаче логического нуля, верхний ключ закроется, нижний откроется, и шина
порта будет притянута к земле Vss, т.е. ток не пойдет и светодиод не
загорится.
14
15. Работа выхода в режиме open-drain
При настройке режима open-drain (открытый коллектор или открытыйсток), верхний транзистор становится закрытым, т.е. по сути блокирует
доступ к источнику питания для протекания тока по шине (по сути, будто этой
части совсем нет, есть только нижний транзистор или в эквивалентной схеме
нижний ключ, подключенный к земле).
В таком случае, при нашей схеме подключения светодиода, току просто не
откуда взяться, т.е. нет источника напряжения, от которого через наш
резистор R31 пошел бы ток и зажег светодиод. Поэтому при подаче любого
уровня 0 или 1, светодиод не горит, т.к. даже открыв транзистор N-MOS, шина
будет притянута к земле, а светодиод тоже подключен к земле, т.е. источника
напряжения нет.
15
16. Работа выхода в режиме open-drain
Чтобы светодиод горел при open-drain, нужно его включить инверсно и егоанод подключить к питанию.
Тогда, при открытии транзистора N-MOS, шина порта будет притянута к
земле (Vss) и ток пойдет от Vdd через резистор и светодиод на землю Vss ,
таким образом, светодиод зажжется. Если транзистор N-MOS будет закрыт,
то ток от Vdd не потечёт по цепи и светодиод гореть не будет.
Примеры шин в режиме open-drain: 1-Wire, I2C.
Подробное объяснение режимов приведено в файле лекции
Объяснение режимов push-pull_open-drain.docx
16
17. GPIO в STM32
1718. Настройка GPIO в STM32
Чтобы записывать данные в порт или считывать данные с портанеобходимо разрешить его тактирование.
Разрешение тактирования
RCC_APB2ENR.
порта
осуществляется
через
регистр
Например, чтобы разрешить тактирование порта А (Port A), необходимо
установить логическую единицу в поле IOPAEN.
Сделать это можно, записав в регистр RCC_APB2ENR значение:
00000000000000000000000000000100 или 0x4 или 1 << 2
RCC->APB2ENR |= (1 << 2); // язык Си, пример на ассемблере см. в файлах лекции
18
19. Настройка GPIO в STM32
Чтобы настроить режим работы пинов порта, необходимо записатьопределенные значения в регистр GPIOA_CRL для пинов 0-7 и
GPIO_CRH для пинов 8-15.
Для настройки каждого пина используется 4 бита: СNFx[1:0] и MODEx[1:0]
GPIOA->CRL |= (( 1 << 4*5)); // записать в MODE5 - 01 и в CNF5 - 00
19
20. Настройка GPIO в STM32
GPIOA->CRL |= (( 1 << 4*5));MODE5 = 01 – output mode, 10 МГц
CNF5 = 00 – GPO push-pull
20
21. Регистр входных и выходных данных
Чтобы считать данные с порта x, необходимо обратиться к региструGPIOx_IDR.
Биты IDR0 – IDR15 соответствуют входным пинам 0-15 порта x.
x = GPIOA->IDR; y = (GPIOA->IDR & 0x20) >> 5;
Чтобы записать данные в порт x, необходимо записать значение в регистр
GPIOx_ODR.
Биты ODR0 – ODR15 соответствуют выходным пинам 0-15 порта x.
GPIOA->ODR = x; GPIOA->ODR |= 0x20; GPIOA->ODR &= ~0x20;
21
22. Запись выходных значений
Другим способом записи значений н выход порта является использованиерегистра GPIOx_BSRR
Запись логической единицы в поля BS0 – BS15 установить значение
логической единицы на соответствующих выходах 0-15 порта x.
Запись логической единицы в поля BR0 – BR15 установить значение
логического нуля на соответствующих выходах 0-15 порта x.
GPIOA->BSRR = 1 << 5 // PA5 = 1
GPIOA->BSRR = 1 << 21 // PA5 = 0
22
23. Запись выходных значений
Принцип работы данного регистра напоминает работу RS – триггера. Тольков данном случае, состояние R = 1, S = 1 не является запрещенным, а
оговаривается документацией (BS имеет приоритет).
GPIOA->BSRR = 1 << 5 // PA5 = 1
GPIOA->BSRR |= 1 << 21 // PA5 = 1
23
24. CMSIS.Настройка GPIO
void GPIO_Init (void) {RCC->APB2ENR |= (1UL << 2
GPIOA->CRL &= ~((15ul << 4*5));
GPIOA->CRL |= (( 1ul << 4*5));
}
#define PERIPH_BASE
#define APB2PERIPH_BASE
#define GPIOA_BASE
#define GPIOA
typedef struct
{
__IO uint32_t CRL;
__IO uint32_t CRH;
__IO uint32_t IDR;
__IO uint32_t ODR;
__IO uint32_t BSRR;
__IO uint32_t BRR;
__IO uint32_t LCKR;
} GPIO_TypeDef;
((uint32_t)0x40000000)
(PERIPH_BASE + 0x10000)
(APB2PERIPH_BASE + 0x0800)
((GPIO_TypeDef *) GPIOA_BASE)
24
25. Формирование импульсов на GPIO (Cи)
GPIOA->BSRR = 1ul << 5GPIOA->BSRR = 1ul << 21
25
26. Формирование импульсов на GPIO (Си)
2627. Формирование импульсов на GPIO c таймером
void LED_BLINKING () {GPIOA->BSRR = (GPIOA->ODR & (1ul << 5) ) ? 1ul << 21 : 1ul << 5;
}
void TIM3_IRQHandler () {
TIM3->SR &= ~TIM_SR_UIF;
TIM3_interrupts++;
LED_BLINKING ();
}
27
28. Зажигание светодиода с задержкой 0.5 сек
void TIM3_IRQHandler () {TIM3->SR &= ~TIM_SR_UIF;
TIM3_interrupts++;
LED_BLINKING ();
}
28
29.
Программирование микроконтроллеровЛекция 2. Настройка частоты тактирования,
таймера, портов ввода-вывода
Доцент ОИТ ИШИТР Мыцко Евгений Алексеевич
evgenvt@tpu.ru
https://vk.com/evgentomsk70
Томск 2023
Электроника