Схема тактирования в STM32
Настройка тактирования в STM32
CMSIS.Настройка тактирования
CMSIS. Настройка тактирования
CMSIS. Настройка тактирования
CMSIS.Настройка таймера
Порты ввода/вывода
Устройство порта ввода/вывода STM32
Работа выхода в режиме push-pull
Работа выхода в режиме open-drain
Работа выхода в режиме open-drain
GPIO в STM32
Настройка GPIO в STM32
Настройка GPIO в STM32
Настройка GPIO в STM32
Регистр входных и выходных данных
Запись выходных значений
Запись выходных значений
CMSIS.Настройка GPIO
Формирование импульсов на GPIO (Cи)
Формирование импульсов на GPIO (Си)
Формирование импульсов на GPIO c таймером
Зажигание светодиода с задержкой 0.5 сек
2.27M
Категория: ЭлектроникаЭлектроника

q

1.

Программирование микроконтроллеров
Лекция 2. Настройка частоты тактирования,
таймера, портов ввода-вывода
Доцент ОИТ ИШИТР Мыцко Евгений Алексеевич
evgenvt@tpu.ru
https://vk.com/evgentomsk70
Томск 2023

2. Схема тактирования в STM32

2

3. Настройка тактирования в 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

17

18. Настройка 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 << 5
GPIOA->BSRR = 1ul << 21
25

26. Формирование импульсов на GPIO (Си)

26

27. Формирование импульсов на 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
English     Русский Правила