
MP304F
Модуль реле на 1 канал
1601 руб.
Модуль реле на 1 канал является промежуточным звеном между слаботочным входным блоком управления и мощной нагрузкой до 500 Вт. Устройство предназначено для включения/выключения внешней нагрузки (например, лампа уличного освещения, вентилятор и т. п.) и работает в двух режимах:
1. Нагрузка включается при наличии, и затем, выключается при отсутствии входного напряжения (режим КНОПКА);
2. Нагрузка включается при появлении, и затем выключается при появлении входного напряжения (режим ТРИГГЕР).
Параметр | Значение |
Uпит. постоянное, В | +12...14 |
Uпит. ном. постоянное, В | +12 |
Iпотр. макс. при Uпит. ном., мА | ...70 |
Рекомендуемый источник питания, в комплект не входит |
PW1215B,
ES18E12-P1J, GS15E-3P1J, GS25E12-P1J, |
Нагрузочная способность выхода | 2,5А / ~220В |
Режимы работы | КНОПКА / ТРИГГЕР |
Габаритные размеры, ДхШхВ, мм | 58 x 43 |
Рекомендуемый корпус, в комплект не входит | |
Температура эксплуатации, °С | 0...+55 |
Относительная влажность эксплуатации, % | ...55 |
Производство | Контрактное производство в России |
Производство | Контрактное производство в Юго-Восточной Азии |
Гарантийный срок эксплуатации | 12 месяцев с даты покупки |
Срок эксплуатации | 5 лет |
Вес, г | 100 |
Наименование | Количество |
MP304 в сборе | 1 |
Инструкция пользователя | 1 |
Назначение органов управления:
- Расположите устройство согласно рис. ниже.
- Верхняя перемычка J1 установлена слева (по умолчанию) - контакты реле разомкнуты при включении устройства;
- Верхняя перемычка J1 установлена справа - контакты реле замкнуты при включении устройства;
- Нижняя перемычка J2 установлена слева (по умолчанию) - режим "Триггер";
- Нижняя перемычка J2 установлена справа - режим "Кнопка".
- Кнопка тактовая (вверху платы) - для проверки работоспособности устройства.
Назначение точек подключения на печатной плате:
"Т" - вход сигнала управления, сюда подайте управляющее напряжение (+3…+5В);
"IN 12V" - вход питания, сюда подключите источник питания постоянного напряжения +12В согласно маркировке на печатной плате;
Контакты реле:
"COM" - общий контакт реле;
"NO" - нормально разомкнутый контакт реле;
"NC" - нормально замкнутый контакт реле;
"OUT 12V" - выход питания для других устройств (в работе устройства не используется).
Важно!
Данное устройство использует в работе опасное для жизни переменное напряжение сети ~220В. Перед выполнением каких-либо действий с устройством, Вы обязаны отсоединить его от сети ~220В!
- Подключите к устройству источник питания постоянного напряжения +12В согласно маркировке на печатной плате. Внимание! Неправильная полярность питания может повредить устройство!
- Подсоедините к устройству внешние элементы согласно Рис.3 (например, подключите на выход лампу накаливания и вставьте вилку в розетку ~220В), после чего не прикасайтесь руками к печатной плате! На ней присутствует опасное для жизни переменное напряжение ~220В!
3. Подайте на вход управляющее напряжение, для чего кратковременно нажмите и отпустите тактовую кнопку (вверху платы). При этом контакты реле замкнулись и индикаторный светодиод засветился, что подтверждает правильность работы устройства в режиме "Триггер".
4. Подайте на вход управляющее напряжение, для чего кратковременно нажмите и отпустите тактовую кнопку (вверху платы). При этом контакты реле разомкнулись и индикаторный светодиод погас, что подтверждает правильность работы устройства в режиме "Триггер".
5. При необходимости, измените состояние реле при включении и режим работы устройства перемычками J1и J2.
Проверка работоспособности завершена.


- Как программировать микроконтроллеры STM32?
- Программирование микроконтроллеров STM32 подробно описано на сайте http://eugenemcu.ru, статья из которого приводится ниже.
Программирование микроконтроллеров STM32
(по материалам сайта http://eugenemcu.ru)Часть 1. GPIO, порты ввода-вывода STM32
1.1 Общие сведения
Микроконтроллеры семейства STM32 содержат в своём составе до семи 16-разрядных портов ввода-вывода c именами от PORTA до PORTG. В конкретной модели микроконтроллера без исключений доступны все выводы портов, общее количество которых зависит от типа корпуса и оговорено в DataSheet на соответствующее подсемейство.
Для включения в работу порта x необходимо предварительно подключить его к шине APB2 установкой соответствующего бита IOPxEN в регистре разрешения тактирования периферийных блоков RCC_APB2ENR:
RCC -> APB2ENR |= RCC_APB2ENR_IOPAEN; // Разрешить тактирование PORTA. td> |
Управление портами STM32 осуществляется при помощи наборов из 7 (семи) 32-разрядных регистров:
GPIOx_CRH
GPIOx_CRL – оба задают режим работы каждого из битов порта в качестве входа или выхода, определяют конфигурацию входных и выходных каскадов.
GPIOx_IDR – входной регистр данных для чтения физического состояния выводов порта x.
GPIOx_ODR – выходной регистр осуществляет запись данных непосредственно в порт.
GPIOx_BSRR – регистр атомарной установки и сброса битов порта.
GPIOx_BSR – регистр атомарной установки битов порта.
GPIOx_LCKR – регистр блокировки конфигурации выводов.
1.2 Режимы работы выводов GPIO
Режимы работы отдельных выводов определяются комбинацией битов MODEy[1:0] и CNFy [1:0] регистров GPIOx_CRH и GPIOx_CRL (здесь и далее: x - имя порта, y - номер бита порта).
GPIOx_CRH - предназначен для выбора режима работы старших выводов порта х (биты 31...15).
GPIOx_CRL - предназначен для выбора режима работы младших выводов порта х (биты 7...0).


Биты MODEy определяют направление линии вход/выход и ограничение скорости переключения в режиме выход:
MODEy[1:0] = 00 Режим входа (состояние после сброса);
MODEy[1:0] = 01 Режим выхода, максимальная скорость – 10МГц;
MODEy[1:0] = 10 Режим выхода, максимальная скорость – 2МГц;
MODEy[1:0] = 11 Режим выхода, максимальная скорость – 50МГц.
Биты CNF задают тип линии аналог/цифра (конфигурацию выходных каскадов соответствующих выводов):
в режиме входа:
CNFy[1:0] = 00 Аналоговый вход;
CNFy[1:0] = 01 Вход в третьем состоянии (состояние после сброса);
CNFy[1:0] = 10 Вход с подтягивающим резистором pull-up (если PxODR=1) или pull-down (если PxODR=0);
CNFy[1:0] = 11 Зарезервировано.
в режиме выхода:
CNFy[1:0] = 00 Двухтактный выход общего назначения;
CNFy[1:0] = 01 Выход с открытым стоком общего назначения;
CNFy[1:0] = 10 Двухтактный выход с альтернативной функцией;
CNFy[1:0] = 11 Выход с открытым стоком с альтернативной функцией.
С целью повышения помехоустойчивости все входные буферы содержат в своём составе триггеры Шмидта. Часть выводов STM32, снабженных защитными диодами, соединёнными с общей шиной и шиной питания, помечены в datasheet как FT (Five Tolerant) - совместимые с напряжением +5 В.
1.3 Защита битов конфигурации портов ввода/вывода GPIO
Для защиты битов в регистрах конфигурации от несанкционированной записи в STM32 предусмотрен регистр блокировки настроек GPIOx_LCKR.

Для защиты настроек отдельного вывода порта необходимо установить соответствующий бит LCKy. После чего осуществить
последовательную запись в разряд LCKK значений "1” - "0” - "1” и две операции чтения регистра LCKR, которые в
случае успешной блокировки дадут для бита LCKK значения "0” и "1” . Защита настроечных битов сохранит своё действие до очередной перезагрузки микроконтроллера.
Файл определений для периферии микроконтроллеров STM32 stm32f10x.h определяет отдельные группы регистров, объединённые общим функциональным назначением (в том числе и GPIO), как структуры языка Си, а сами регистры как элементы данной структуры. Например:
GPIOC -> BSRR – регистр BSRR установки/сброса битов порта GPIOC.
Воспользуемся определениями из файла stm32f10x.h для иллюстрации работы с регистрами ввода/вывода микроконтроллера STM32F100RB установленного в стартовом наборе STM32DISCOVERY:
#include "stm32F10x.h" u32 tmp; int main (void) { RCC->APB2ENR |= RCC_APB2ENR_IOPCEN; // Разрешить тактирование PORTC. GPIOC -> CRH |= GPIO_CRH_MODE8; // PC8 - выход (LED4). GPIOC -> CRH &= ~GPIO_CRH_CNF8; // PC8 - двухтактный выход. GPIOC -> CRH |= GPIO_CRH_MODE9; // PC9 - выход (LED3). GPIOC -> CRH &= ~GPIO_CRH_CNF9; // PC9 - двухтактный выход. GPIOA -> CRL &= ~GPIO_CRL_MODE0; // PA0 - вход (кнопка USER). // Заблокировать настройки выводов PC8, PC9. GPIOC -> LCKR = GPIO_LCKR_LCK8 | GPIO_LCKR_LCK9 | GPIO_LCKR_LCKK; GPIOC -> LCKR = GPIO_LCKR_LCK8 | GPIO_LCKR_LCK9; GPIOC -> LCKR = GPIO_LCKR_LCK8 | GPIO_LCKR_LCK9 | GPIO_LCKR_LCKK; tmp = GPIOC -> LCKR; tmp = GPIOC -> LCKR; } td> |
1.4 Запись и чтение GPIO
Для записи и чтения портов предназначены входной GPIOx_IDR и выходной GPIOx_ODR регистры данных. Запись в выходной регистр ODR порта настроенного на вывод осуществляет установку выходных уровней всех разрядов порта в соответствии с записываемым значением. Если вывод настроен как вход с подтягивающими резисторами, состояние соответствующего бита регистра ODR активирует подтяжку вывода к шине питания (pull-up, ODR=1) или общей шине микроконтроллера (pull-down, ODR=0).
Чтение регистра IDR возвращает значение состояния выводов микроконтроллера настроенных как входы:
// Если кнопка нажата (PA0=1), установить биты порта C, иначе сбросить. if (GPIOA -> IDR & GPIO_IDR_IDR0) { GPIOC -> ODR = 0xFFFF; } else { GPIOC -> ODR = 0x0000; } td> |
1.5 Сброс и установка битов порта
Для атомарного установки и сброса битов GPIO в микроконтроллерах STM32 предназначен регистр GPIOx_BSRR. Традиционный для архитектуры ARM способ управления битами регистров, не требующий применения операции типа "чтение-модификация-запись”, позволяет устанавливать и сбрасывать биты порта простой записью единицы в биты установки BS (BitSet) и сброса BR (BitReset) регистра BSRR. При этом запись в регистр нулевых битов не оказывает влияния на состояние соответствующих выводов.

GPIOC -> BSRR = GPIO_BSRR_BS8 | GPIO_BSRR_BR9; /* установить PC8 (зажечь LED4), сбросить РС9 (погасить LED3). */ GPIOC -> BSRR = GPIO_BSRR_BS9 | GPIO_BSRR_BR8; /* установить PC9 (зажечь LED3), сбросить PC8 (погасить LED4). */ td> |
устаноленном на STMVLDISCOVERY
- Выделите название проекта.
- Войдите вверху Project --- Options.
General Option --- Target --- Device --- ST --- ST STM32F100xB

тип семейства процессора и возможность использования библиотек
С/С++ Compiler --- Defined simbols.
$PROJ_DIR$\..\CMSIS
$PROJ_DIR$\..\PERIPH_INC
$PROJ_DIR$\..\PERIPH_SRC
$PROJ_DIR$\USER_INC
$PROJ_DIR$\USER_SRC
STM32F10X_MD_VL
USE_STDPERIPH_DRIVER

Output Convertrt --- Output --- Generate additional output --- Intel extanded

Linker --- Config --- Override default --- Edit --- Vector Table
0x08000000

Linker --- Config --- Override default --- Edit --- Vector Table
0x08000000, 0x0801FFFF
0x20000000, 0x2001FFFF

Linker --- Config --- Override default --- Edit --- Vector Table
0x400, 0x800

Debugger --- Setup --- Driver --- ST-Link

ST-Link --- ST-Link --- SWD

Используя регистр GPIOС_BSRR, например, помигаем светодиодами микроконтроллером STM32F100RBT6, установленном на плате STMVLDISCOVERY
#include "stm32f10x.h" u32 tmp; void main() { unsigned long d; /* Включим тактирование порта С, для чего установим бит IOPCEN в регистре APB2ENR модуля RCC. По-умолчанию периферийные устройства не тактируются, поэтому вначале установим биты разрешения тактирования PORTC (находится на шине APB2, для чего возьмем информацию из файла stm32f10x.h, в котором каждый модуль объявлен в виде структуры, каждый регистр - в виде поля структуры. Разрешить тактирование PORTC, где RCC - название модуля, APB2ENR - название регистра, IOPCEN - название бита (группы бит) CR - регистр конфигурации. Теперь настроим ногу9 на выход без ограничения скорости, для чего в файле stm32f10x.h, ищем "GPIO". При этом сразу попадаем на структуру, затем ищем по названию структуры "GPIO_TypeDef". При этом попадаем на порты. Нам нужен GPIOC. По даташиту узнаем, что настройки PORTC хранятся в регистре "GPIO_CRH" - ищем его. GPIOC_CRH, (настройка на ввод-вывод, настройка скорости работы), GPIOC_ODR (собственно, сам выходной регистр порта), RCC_APB2ENR регистр системы тактирования, в котором расположен бит, отвечающий за порт C */ RCC->APB2ENR |= RCC_APB2ENR_IOPCEN; GPIOC -> CRH |= GPIO_CRH_MODE8; // PC8 - выход (LED4). GPIOC -> CRH &= ~GPIO_CRH_CNF8; // PC8 - двухтактный выход. GPIOC -> CRH |= GPIO_CRH_MODE9; // PC9 - выход (LED3). GPIOC -> CRH &= ~GPIO_CRH_CNF9; // PC9 - двухтактный выход. GPIOA -> CRL &= ~GPIO_CRL_MODE0; // PA0 - вход (кнопка USER). // Заблокировать настройки выводов PC8, PC9. GPIOC -> LCKR = GPIO_LCKR_LCK8 | GPIO_LCKR_LCK9 | GPIO_LCKR_LCKK; GPIOC -> LCKR = GPIO_LCKR_LCK8 | GPIO_LCKR_LCK9; GPIOC -> LCKR = GPIO_LCKR_LCK8 | GPIO_LCKR_LCK9 | GPIO_LCKR_LCKK; tmp = GPIOC -> LCKR; tmp = GPIOC -> LCKR; while (1) { // установить PC8 (зажечь LED4), сбросить РС9 (погасить LED3). GPIOC -> BSRR = GPIO_BSRR_BS8 | GPIO_BSRR_BR9; //simple delay for (d = 0; d < 1000000UL; ++d); // установить PC9 (зажечь LED3), сбросить PC8 (погасить LED4). GPIOC -> BSRR = GPIO_BSRR_BS9 | GPIO_BSRR_BR8; //simple delay for (d = 0; d < 1000000UL; ++d); } // elihw } // niam td> |
Теперь помигаем светодиодами используя SPL (Standard Peripheral Library).
// includes #include <stm32f10x.h> #include <stm32f10x_rcc.h> // управление генератором частоты #include <stm32f10x_gpio.h> // управление GPIO // user function prototypes void delay(); void main() { // разрешаем тактирование модуля RCC_APB2Periph_GPIOC RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOC, ENABLE); // объявляем структуру данных типа GPIO_InitTypeDef для работы с PORTC GPIO_InitTypeDef gpio; // заполняем поля объявленной структуры gpio.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9; // назначить ноги для дальнейшего использования gpio.GPIO_Mode = GPIO_Mode_Out_PP; // установить режим ног - Pull-Push gpio.GPIO_Speed = GPIO_Speed_2MHz; // установить частоту переключения ног 2 МГц /* объявленная структура с помощью функции GPIO_Init() «накладывается» на регистры периферийного модуля GPIO и, соответственно, настраивает модуль RCC_APB2Periph_GPIOC. */ GPIO_Init(GPIOC, &gpio); // передача структуры - применение параметров do // основной цикл - мигаем СИДами { GPIO_SetBits(GPIOC,GPIO_Pin_8); // установить PC8 (зажечь LED4) GPIO_ResetBits(GPIOC,GPIO_Pin_9); // сбросить РС9 (погасить LED3) delay(); // waiting GPIO_SetBits(GPIOC,GPIO_Pin_9); ; // установить PC9 (зажечь LED3 GPIO_ResetBits(GPIOC,GPIO_Pin_8); ; // сбросить PC8 (погасить LED4) delay(); // waiting } while(1); // основной цикл } // end of main // user waiting function declare void delay() { unsigned int i = 0; for (; i < 1000000; i++) { __NOP(); // do nothing } // end of for } // end of delay |

1.6 Альтернативные функции GPIO и их переназначение (remapping)
Практически все внешние цепи специального назначения STM32 (включая выводы для подключения кварцевых резонаторов, JTAG/SWD и так далее) могут быть разрешены на соответствующих выводах микроконтроллера, либо отключены от них для возможности их использования в качестве выводов общего назначения. Выбор альтернативной функции вывода осуществляется при помощи регистров с префиксом "AFIO_”.
Помимо этого регистры AFIO_ позволяют выбирать несколько вариантов расположения специальных функций на выводах микроконтроллера. Это в частности относится к выводам коммуникационных интерфейсов, таймеров (регистры AFIO_MAPR), выводам
внешних прерываний (регистры AFIO_EXTICR) и т. д.
Подробнее смотрите документы "Reference manual” на соответствующую подгруппу микроконтроллеров.
Часть 2. Система тактирования STM32
В качестве источника импульсов тактовой системной частоты (SYSCLK) микроконтроллеров STM32 могут быть использованы:
Внутренний RC-генератор HSI c частотой 8 МГц.
Генератор HSE с внешним кварцевым резонатором или внешним источником тактовых импульсов.
PLL (Phase Locked Loop) – умножитель частоты HSI или HSE на основе генератора с ФАПЧ.
2.1 Генераторы HSI и HSE
HSI (High-Speed Internal) генератор представляет из себя встроенный RC-генератор на 8 МГц калиброванный в процессе производства с точностью ±1%. При запуске микроконтроллера заводское калибровочное значение автоматически заносится в биты HSICAL[7:0] регистра RCC_CR. Для компенсации воздействия окружающей температуры и изменений питающего напряжения имеется возможность дополнять калибровочное значение записью битов HSITRIM[4:0] указанного регистра.
Генератор может быть использован для системного тактирования непосредственно или через блок PLL с предварительным делением частоты на два.
Генератор HSE способен работать с кварцевыми и керамическими резонаторами на частотах от 4 до 24 МГц или c внешним источником тактовых импульсов частотой до 24 МГц и скважностью 50% подключенным к выводу OSC_IN. При работе генератора с внешним сигналом необходимо установить бит HSEBYP регистра RCC_CR.
2.2 Выбор источника тактирования
После запуска и сброса микроконтроллер тактируется от встроенного RC-генератора HSI. Далее в процессе работы возможно переключение источника тактовых импульсов записью комбинации битов SW регистра RCC_CFGR:
RCC_CFGR[1:0] - SW[1:0].
SW[1:0] = 00: тактирование от HSI;
SW[1:0] = 01: HSE;
SW[1:0] = 10: PLL;
SW[1:0] = 11: зарезервировано.
Определить какой из генераторов в данный момент времени используется в качестве тактового можно по состоянию битов SWS:
RCC_CFGR[3:2] - SWS[1:0].
SWS[1:0] = 00: используется генератор HSI;
SWS[1:0] = 01: используется генератор HSE;
SWS[1:0] = 10: тактирование от блока PLL
SWS[1:0] = 11: зарезервировано.
Перед выбором тактового источника необходимо предварительно произвести его запуск и удостовериться в его готовности к работе.
2.3 Включение, контроль готовности и выключение генераторов.
Включение генераторов HSI, HSE и PLL производится установкой битов HSION, HSEON и PLLON регистра RCC_CR. После чего готовность генераторов к работе можно проследить по установке флагов HSERDY, HSERDY или PLLRDY того же регистра:
RCC -> CR |= RCC_CR_HSEON; // Включить генератор HSE while ( !(RCC->CR & RCC_CR_HSERDY) ) { // Ожидание готовности HSE. } RCC -> CFGR &= ~RCC_CFGR_SW; // Очистить биты SW0, SW1 RCC -> CFGR |= RCC_CFGR_SW_HSE; // Выбрать HSE для тактирования SW0=1 |
Бит включения генератора HSION также может быть установлен аппаратно при входе в режимы "Stop” или "Standby”, при этом бит HSEON будет сброшен. В случае определения защитной системой сбоев в работе генератора HSE, настроенного в качестве системного напрямую или через PLL будет автоматически установлен бит HSION. Для снижения энергопотребления, генератор, который в данный момент не используется как тактовый, может быть выключен сбросом битов HSION, HSEON.
В проекте STM32RCC_emcu в конце статьи приведён пример с выбором источника тактирования нажатием кнопки и светодиодной индикацией текущего системного генератора STM32DISCOVERY.
2.4 Система защиты от нестабильной работы и отказов генератора HSE
Встроенная система контроля CSS блока тактирования микроконтроллеров STM32 способна отслеживать отказ или нестабильную работу генератора HSE, осуществлять автоматическое переключение тактирования на встроенный генератор HSI с автоматическим вызовом немаскируемого прерывания NMI.
Для включения в работу системы CSS необходимо установить бит CSSON регистра RCC_CR:
RCC -> CR |= RCC_CR_CSSON; // Разрешить работу системы защиты HSE. |
Для исключения повторных вызовов в обработчике NMI необходимо сбросить флаг системы CSS:
void NMI_Handler(void) // Обработчик NMI вызывается при сбое HSE { /* Сбросить флаг системы контроля CSS */ if (RCC->CIR & RCC_CIR_CSSF) { RCC->CIR |= RCC_CIR_CSSC; } } |
2.5 Тактирование микроконтроллера от блока PLL
Описание системы тактирования до этого момента применимо к любым микроконтроллерам семейства STM32. Далее особенности присущие конкретному подсемейству микроконтроллеров будут оговариваться отдельно или сопровождаться пометками:
*VLD – для Value Line Devices (STM32F100);
*L, M, H, XL -D – Low-, Medium-, High- и XL-density микроконтроллеров STM32F101 / STM32F102 / STM32F103.
*CLD – Connectivity Line Devices STM32F105 / STM32F107.
До того как PLL будет выбран для тактирования микроконтроллера установкой битов SW[1:0] = 10 регистра RCC_CFGR, необходимо выбрать источник входной частоты блока, а также проинициализировать параметры входных источников и самого модуля PLL. Выбор входного источника для PLL осуществляется записью бита PLLSRC конфигурационного регистра системы тактирования RCC_CFGR:
RCC_CFGR[16] – PLLSRC:
PLLSRC=0 HSI/2, выбран генератор HSI с делением частоты на 2;
PLLSRC=1 генератор HSE/PREDIV1 (для всех кроме *L,M,H,XLD);
PLLSRC=1 генератор HSE (для *L,M,H,XLD).
Биты PREDIV1 регистра RCC_CFGR2 всех устройств, кроме *L,M,H,XLD, задают коэффициент предварительного деления частоты генератора HSE от 1 до 16 перед его подачей на вход PLL по формуле
n = PREDIV1[3:0] + 1
PREDIV1[3:0] = 0000 ( 0) нет деления;
PREDIV1[3:0] = 0001 ( 1) деление на 2;
PREDIV1[3:0] = 0010 ( 2) деление на 3;
...
PREDIV1[3:0] = 1110 (14) деление на 15;
PREDIV1[3:0] = 1111 (15) деление на 16.
Блок PLL всех микроконтроллеров осуществляет умножение входной частоты в соответствии со значением комбинации битов PLLMUL регистра RCC_CFGR по формуле m = PLLMUL[3:0] + 2, но не более чем в 16 раз:
RCC_CFGR[21:18] - PLLMUL[3:0]:
PLLMUL[3:0] = 0000 ( 0) умножение на 2;
PLLMUL[3:0] = 0001 ( 1) умножение на 3;
PLLMUL[3:0] = 0010 ( 2) умножение на 4;
...
PLLMUL[3:0] = 1101 (13)
умножение на 15;
PLLMUL[3:0] = 1110 (14) умножение на 16;
PLLMUL[3:0] = 1111 (15) тоже умножение на 16.
Пример инициализации, запуска и выбора PLL для тактирования STM32F100 (VLD):
char PLL_MUL = 12; // Коэффициент умножения PLL. RCC -> CFGR2 &= ~(RCC_CFGR2_PREDIV1); // Предочистка делителя HSE. RCC -> CFGR2 |= RCC_CFGR2_PREDIV1_DIV4; // Делить частоту HSE на 4. RCC -> CFGR &= ~( (RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL) ); // Предочистка. RCC -> CFGR |= RCC_CFGR_PLLSRC_PREDIV1; // Тактировать PLL от HSE/PREDIV1. RCC -> CFGR |= ( (PLL_MUL - 2) << 18 ); // Умножать частоту на PLL_MUL. RCC -> CR |= RCC_CR_PLLON; // Запустить PLL. while ( (RCC -> CR & RCC_CR_PLLRDY) == 0 ) { } // Ожидание готовности PLL. RCC -> CFGR &= ~RCC_CFGR_SW; // Очистить биты SW0, SW1. RCC -> CFGR |= RCC_CFGR_SW_PLL; // Тактирование с выхода PLL. while ( (RCC -> CFGR & RCC_CFGR_SWS) != 0x08 ) { } // Ожидание переключения на PLL. |
Пример для STM32F103RC (256K Flash > HD):
RCC->CFGR &= ~( (RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL) ); // Предочистка. RCC->CFGR |= RCC_CFGR_PLLSRC_HSE; // Тактировать PLL от HSE (8 MHz). RCC->CFGR |= RCC_CFGR_PLLMULL9; // Умножать частоту на 9 (8*9=72 MHz). RCC->CR |= RCC_CR_PLLON; // Запустить PLL. while ( (RCC->CR & RCC_CR_PLLRDY) == 0) { } // Ожидание готовности PLL. RCC->CFGR &= ~RCC_CFGR_SW; // Очистить биты SW0, SW1. RCC->CFGR |= RCC_CFGR_SW_PLL; // Тактирование с выхода PLL. while ((RCC->CFGR & RCC_CFGR_SWS) != 0x08 ) { } // Ожидание переключения на PLL. |
2.6 Включение и настройка предварительного буфера памяти Flash
Для работы на частотах выше 24МГц (кроме LDV) необходимо разрешить буфер предварительной выборки Prefetch buffer установкой бита PRFTBE в регистре FLASH_ACR (Flash access control register):
FLASH->ACR |= FLASH_ACR_PRFTBE; // Enable Prefetch Buffer. |
А также, в зависимости от частоты задать количество пропусков тактов буфера при чтении Flash:
FLASH->ACR &= ~FLASH_ACR_LATENCY; // Предочистка. FLASH->ACR |= FLASH_ACR_LATENCY_0; // Если SystemCoreClock <= 24 МГц, без пропусков. FLASH->ACR |= FLASH_ACR_LATENCY_1; // Если 24< SystemCoreClock <= 48, пропускать 1 такт. FLASH->ACR |= FLASH_ACR_LATENCY_2; // Если 48< SystemCoreClock <= 72, пропускать 2 такта. |
Часть 3. NVIC
3.1 Общие сведения.
Контроллер вложенных векторизированных прерываний STM32 (Nested vectored interrupt controller (NVIC)), в зависимости от модели микроконтроллера, способен обслуживать до 68 источников прерываний IRQ от периферийных модулей микроконтроллера и осуществлять:
- разрешение и запрет вызова прерываний;
- назначение и динамическое изменение приоритета прерываний (16 уровней от 0 (максимального) до 15);
- автоматическое сохранение и восстановление контекста данных при обработке одиночных и вложенных прерываний;
- при одновременном вызове, механизм отложенных прерываний позволяет отложить обработку менее приоритетного прерывания, без возврата в фон и восстановления контекста данных.
3.2 Источники прерываний IRQ (Interrupt ReQuest)
WWDG_IRQn = 0; // Window WatchDog Interrupt. ... TIM7_IRQn = 55; // TIM7 Interrupt. |
Стандартный файл startup_stm32f10x_md_vl.s в виде заголовков функций-обработчиков задаёт адреса переходов при вызове соответствующих прерываний:
DCD WWDG_IRQHandler; // Window Watchdog. ... DCD TIM7_IRQHandler; // TIM7. |
3.3 События, генерирующие запросы на перывания
USART1->CR1 |= USART_CR1_TCIE | USART_CR1_RXNEIE; // Разрешить запросы по флагам TC и RXNE. |
При возникновении события и установленном флаге разрешения запроса на прерывание, соответствующий обработчик будет вызван сразу, если данный источник уже разрешён, или непосредственно после его разрешения в NVIC.
3.4 Разрешение и запрет вызова прерываний.
Модуль NVIC, как часть архитектуры Cortex M3, описан в документе: "STM32F10xxx Cortex-M3 programming manual”. Регистры разрешения прерываний (Interrupt set-enable registers) NVIC_ISER0, NVIC_ISER1 и NVIC_ISER2 в стандартном файле определений для периферии "stm32F10x.h" объявлены как массив из трёх элементов ISER[3]. Таким образом для разрешения конкретного прерывания необходимо установить соответствующий ему бит в одном из элементов-регистров указанного массива.
Регистры разрешения прерываний NVIC_ISERx.
Аналогичная структура и принцип управления применим для регистров запрета прерываний NVIC_ICERx - установка конкретного бита в регистрах массива ICER[] запрещает вызов соответствующего прерывания.
Функции CMSIS для разрешения и запрета вызова IRQ в NVIC:
NVIC_EnableIRQ (RTC_IRQn); // Разрешить прерывания от RTC в NVIC. NVIC_DisableIRQ (RTC_IRQn); // Запретить прерывания от RTC в NVIC. |
Глобальный запрет и разрешение векторизированных прерываний осуществляется вызовом функций:
__disable_irq (); // Запретить прерывания IRQ. __enable_irq (); // Разрешить прерывания IRQ. |
3.5 Приоритеты прерываний IRQ.
- вызов прерывания с более высоким приоритетом приостанавливает выполнение текущего обработчика;
- выполнение функции обработки прерывания не может быть прервано вызовом с тем же или более низким уровнем приоритета.
- при одновременном вызове, несколько прерываний будут обработаны в порядке приоритета, при одинаковом приоритете по возрастанию номера прерывания.
Функция CMSIS (из core_cm3.h) для задания приоритета без назначения групп приоритетности:
NVIC_SetPriority (USART1_IRQn, 15); // Назначить прерываниям от USART1 самый низкий проритет. |
Для задания приоритета источника прерывания STM32 предназначены двадцать 32-х разрядных регистров NVIC__IPRx, где каждый из байтов соответствует конкретному источнику. Стандарт CMSIS определяет байты внутри указанных регистров как элементы массива от IP[0] до IP[80]. Значение приоритета задаётся комбинацией битов [7:4] байтов IP[IRQn]. По состоянию после сброса для всех прерываний IRQ назначен наивысший приоритет (0).
3.6 Группы и подгруппы приоритетов прерываний.
Ненулевое значение битов [10:8] регистра AIRCR позволяет определить группы приоритетов и задать их количество, при этом значение:
AIRCR[10:8] = 011 - битами G задаёт 16 групп приоритетов: GGGG;
AIRCR[10:8] = 100 - битами G и S определяет 8 групп и 2 подгруппы приоритетов SGGG;
AIRCR[10:8] = 101 - 4 группы с 4 подгруппами SSGG;
AIRCR[10:8] = 110 - 2 группы с 8 подгруппами SSSG;
AIRCR[10:8] = 111 - 16 подгрупп SSSS.
здесь: G и S -биты [7:4] регистров приоритетов IP[IRQn], определяющие принадлежность к группе и подгруппе.
При инициализации системы приоритетов с делением на группы изменяются правила обработки прерываний:
- только приоритет группы определяет последовательность обработки прерываний; когда процессор выполняет обработку прерывания, то другое прерывание с этим же приоритетом группы не прервет обработку первоначального обработчика.
- при множественном возникновении прерываний имеющих одинаковый приоритет группы, подприоритеты определяют последовательность их обработки.
- при множественном возникновении прерываний с одинаковым приоритетом группы и подприоритетом первым обрабатывается прерывание с меньшим номером.
Часть 4. Внешние прерывания EXTI
4.1 Общие сведения
При возникновении условий, назначенных прерыванию x (фронт и/или срез внешнего сигнала) для выводов 0…4 генерируется запрос на прерывание по раздельным каналам EXTI0_IRQn … EXTI4_IRQn, для выводов 5…9 и 10…15 по групповым каналам EXTI9_5_IRQn и EXTI15_10_IRQn соответственно.
Прерывание будет вызвано при разрешении соответствующего канала NVIC и установленном бите маски разрешения прерываний регистра "Interrupt mask register” (EXTI_IMR). В процессе обработки прерывания в регистре EXTI_PR записью единицы необходимо сбросить флаг события вызвавшего данное прерывание. При этом для групповых источников, если маской EXTI_IMR разрешён более чем один из группы выводов, по флагам регистра EXTI_PR необходимо определить какой из них послужил причиной прерывания.
4.2 Назначение порта внешнего прерывания
Выбор порта, назначенного прерыванию EXTI(x), осуществляется записью комбинации четырёх битов EXTI(x)[3:0] в одном из регистров AFIO_EXTICR1 … AFIO_EXTICR4:
EXTI(n)[3:0] = 0000 Вывод (x) назначен на PORTA;
EXTI(n)[3:0] = 0001 PORTB(x);
EXTI(n)[3:0] = 0010 PORTC(x);
EXTI(n)[3:0] = 0011 PORTD(x);
EXTI(n)[3:0] = 0100 PORTE(x);
EXTI(n)[3:0] = 0101 PORTF(x);
EXTI(n)[3:0] = 0110 PORTG(x);
В стандартном файле определений для периферии "stm32F10x.h" указанные регистры объявлены как массив из четырёх элементов-регистров AFIO->EXTICR []. Так как в каждом из регистров EXTICR хранятся комбинации для четырёх выводов, делением номера на четыре можно выбрать нужный элемент массива:
AFIO->EXTICR [3 >> 0x02] |= AFIO_EXTICR1_EXTI3_PA; // Прерывание INT3 на PORTA. AFIO->EXTICR [7 >> 0x02] |= AFIO_EXTICR2_EXTI7_PC; // Прерывание INT7 на PORTC. |
4.4 Разрешение запросов и задание условий вызова внешних прерываний
Разрешение запроса на прерывание по состоянию вывода x осуществляется установкой соответствующего бита MR(x) в регистре EXTI_IMR (Interrupt Mask Register).
EXTI_IMR - маска запросов внешних прерываний:
Условия формирования запросов на прерывание EXTI(x) определяются состоянием битов TR(x) в регистрах "Rising trigger selection register” (EXTI_RTSR) и "Falling trigger selection register" (EXTI_FTSR).
EXTI_RTSR – прерывание по фронту "Rising Edge”
EXTI_FTSR – прерывание по срезу "Falling Edge”
При установленных битах регистров RTSR и FTSR соответствующие прерывания будут вызываться или по фронту внешнего сигнала или по срезу, или по обоим событиям вместе, например:
EXTI->IMR |= (1 << 7); // Разрешить запрос от EXTI7. EXTI->FTSR |= (1 << 7); // Прерывание от EXTI7 по срезу. NVIC_EnableIRQ (EXTI9_5_IRQn); // Разрешить EXTI9_5 в NVIC. |
4.5 Обработка прерываний
После настройки выбранного прерывания достаточно разместить в тексте программы функцию его обработки с именем, указанным в файле startup – "EXTI(x)_IRQHandler”. Возникшие прерывания вызывают установку флагов событий PR(x) регистра EXTI_PR, которые должны быть сброшены записью в них единичных битов.
void EXTI9_5_IRQHandler (void) { if (EXTI->PR & (1 << 5) ) // Прерывание от EXTI5? { EXTI->PR |= (1 << 5); // Сбросить флаг EXTI5. // Обработка события EXTI5 } if (EXTI->PR & (1 << 7) ) // Прерывание от EXTI7? { EXTI->PR |= (1 << 7); // Сбросить флаг EXTI7. // Обработка события EXTI7 } ... } |
Ну вот... как-то так. Удачных Вам программ!