8 Декабря 2016, Четверг        63.91      Карта сайта » Главная » Исполнительные элементы » MP304 . . .

MP304 (122K)
MP304F
Модуль реле на 1 канал
1278 руб.

Модуль реле на 1 канал является промежуточным звеном между слаботочным входным блоком управления и мощной нагрузкой до 500 Вт. Устройство предназначено для включения/выключения внешней нагрузки (например, лампа уличного освещения, вентилятор и т. п.) и работает в двух режимах:
1. Нагрузка включается при наличии, и затем, выключается при отсутствии входного напряжения (режим КНОПКА);
2. Нагрузка включается при появлении, и затем выключается при появлении входного напряжения (режим ТРИГГЕР).

Технические характеристики MP304

ПараметрЗначение
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

НаименованиеКоличество
MP304 в сборе1
Инструкция пользователя 1

Описание MP304

Назначение органов управления:
- Расположите устройство согласно рис. ниже.
- Верхняя перемычка J1 установлена слева (по умолчанию) - контакты реле разомкнуты при включении устройства;
- Верхняя перемычка J1 установлена справа - контакты реле замкнуты при включении устройства;
- Нижняя перемычка J2 установлена слева (по умолчанию) - режим "Триггер";
- Нижняя перемычка J2 установлена справа - режим "Кнопка".
- Кнопка тактовая (вверху платы) - для проверки работоспособности устройства.

Назначение точек подключения на печатной плате:
"Т" - вход сигнала управления, сюда подайте управляющее напряжение (+3…+5В);
"IN 12V" - вход питания, сюда подключите источник питания постоянного напряжения +12В согласно маркировке на печатной плате;
Контакты реле:
"COM" - общий контакт реле;
"NO" - нормально разомкнутый контакт реле;
"NC" - нормально замкнутый контакт реле;
"OUT 12V" - выход питания для других устройств (в работе устройства не используется).

Важно!
Данное устройство использует в работе опасное для жизни переменное напряжение сети ~220В. Перед выполнением каких-либо действий с устройством, Вы обязаны отсоединить его от сети ~220В!

Проверка работоспособности MP304

- Подключите к устройству источник питания постоянного напряжения +12В согласно маркировке на печатной плате. Внимание! Неправильная полярность питания может повредить устройство!
- Подсоедините к устройству внешние элементы согласно Рис.3 (например, подключите на выход лампу накаливания и вставьте вилку в розетку ~220В), после чего не прикасайтесь руками к печатной плате! На ней присутствует опасное для жизни переменное напряжение ~220В!
3. Подайте на вход управляющее напряжение, для чего кратковременно нажмите и отпустите тактовую кнопку (вверху платы). При этом контакты реле замкнулись и индикаторный светодиод засветился, что подтверждает правильность работы устройства в режиме "Триггер".
4. Подайте на вход управляющее напряжение, для чего кратковременно нажмите и отпустите тактовую кнопку (вверху платы). При этом контакты реле разомкнулись и индикаторный светодиод погас, что подтверждает правильность работы устройства в режиме "Триггер".
5. При необходимости, измените состояние реле при включении и режим работы устройства перемычками J1и J2.
Проверка работоспособности завершена.

Схема электрическая принципиальная MP304

MP304_board (32K)

Схема электрическая принципиальная MP304

Часто задаваемые вопросы

- Как программировать микроконтроллеры STM32?
- Программирование микроконтроллеров STM32 подробно описано на сайте http://eugenemcu.ru, статья из которого приводится ниже.

Программирование микроконтроллеров STM32
(по материалам сайта http://eugenemcu.ru)

Часть 1. GPIO, порты ввода-вывода STM32

par (1K)  1.1 Общие сведения

Микроконтроллеры семейства STM32 содержат в своём составе до семи 16-разрядных портов ввода-вывода c именами от PORTA до PORTG. В конкретной модели микроконтроллера без исключений доступны все выводы портов, общее количество которых зависит от типа корпуса и оговорено в DataSheet на соответствующее подсемейство.
Для включения в работу порта x необходимо предварительно подключить его к шине APB2 установкой соответствующего бита IOPxEN в регистре разрешения тактирования периферийных блоков RCC_APB2ENR:


  RCC -> APB2ENR |= RCC_APB2ENR_IOPAEN; // Разрешить тактирование PORTA.

Управление портами STM32 осуществляется при помощи наборов из 7 (семи) 32-разрядных регистров:

GPIOx_CRH
GPIOx_CRL
– оба задают режим работы каждого из битов порта в качестве входа или выхода, определяют конфигурацию входных и выходных каскадов.

GPIOx_IDR – входной регистр данных для чтения физического состояния выводов порта x.
GPIOx_ODR – выходной регистр осуществляет запись данных непосредственно в порт.

GPIOx_BSRR – регистр атомарной установки и сброса битов порта.
GPIOx_BSR – регистр атомарной установки битов порта.

GPIOx_LCKR – регистр блокировки конфигурации выводов.

par (1K)  1.2 Режимы работы выводов GPIO

Режимы работы отдельных выводов определяются комбинацией битов MODEy[1:0] и CNFy [1:0] регистров GPIOx_CRH и GPIOx_CRL (здесь и далее: x - имя порта, y - номер бита порта).

GPIOx_CRH - предназначен для выбора режима работы старших выводов порта х (биты 31...15).
GPIOx_CRL - предназначен для выбора режима работы младших выводов порта х (биты 7...0).

Назначение битов регистра GPIOx_CRL

STM32_GPIO_CRL1 (2K)

STM32_GPIO_CRL0 (2K)

Биты 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 В.

par (1K)  1.3 Защита битов конфигурации портов ввода/вывода GPIO

Для защиты битов в регистрах конфигурации от несанкционированной записи в STM32 предусмотрен регистр блокировки настроек GPIOx_LCKR.

Назначение битов регистра GPIOx_LCKR

STM32_GPIOX_LCKR (1K)

Для защиты настроек отдельного вывода порта необходимо установить соответствующий бит 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;
  }

par (1K)  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;
  }

par (1K)  1.5 Сброс и установка битов порта

Для атомарного установки и сброса битов GPIO в микроконтроллерах STM32 предназначен регистр GPIOx_BSRR. Традиционный для архитектуры ARM способ управления битами регистров, не требующий применения операции типа "чтение-модификация-запись”, позволяет устанавливать и сбрасывать биты порта простой записью единицы в биты установки BS (BitSet) и сброса BR (BitReset) регистра BSRR. При этом запись в регистр нулевых битов не оказывает влияния на состояние соответствующих выводов.

Назначение битов регистра GPIOx_BSRR

STM32_GPIOX_BSRR (1K)


  GPIOC -> BSRR = GPIO_BSRR_BS8 | GPIO_BSRR_BR9; /* установить PC8 (зажечь LED4), сбросить РС9 (погасить LED3). */
  GPIOC -> BSRR = GPIO_BSRR_BS9 | GPIO_BSRR_BR8; /* установить PC9 (зажечь LED3), сбросить PC8 (погасить LED4). */

Настройка среды разработки IAR для программирования STM32F100RBT6,
устаноленном на STMVLDISCOVERY

- Выделите название проекта.
- Войдите вверху Project --- Options.

1. Выберите тип используемого процессора
General Option --- Target --- Device --- ST --- ST STM32F100xB

iar_1 (37K)

2. Укажите путь к папке с заголовочными файлами,
тип семейства процессора и возможность использования библиотек
С/С++ 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

iar_2 (49K)

3. Для создания hex. файла укажите это в
Output Convertrt --- Output --- Generate additional output --- Intel extanded

iar_3 (34K)

4. Укажите начальный адрес векторов прерываний, размер ROM и RAM памяти, размер стека и кучи
Linker --- Config --- Override default --- Edit --- Vector Table
0x08000000

iar_4 (41K)

5. Укажите начальные и конечные адреса ROM и RAM памяти
Linker --- Config --- Override default --- Edit --- Vector Table
0x08000000, 0x0801FFFF
0x20000000, 0x2001FFFF

iar_5 (42K)

6. Укажите размер стека и кучи и сохраните установленные настройки в новом файле
Linker --- Config --- Override default --- Edit --- Vector Table
0x400, 0x800

iar_6 (41K)

7. Укажите тип отладчика
Debugger --- Setup --- Driver --- ST-Link

iar_7 (41K)

8. Укажите интерфейс связи с отладчиком ST-Link на плате
ST-Link --- ST-Link --- SWD

iar_8 (27K)

Используя регистр 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

Теперь помигаем светодиодами используя 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

Схема электрическая принципиальная STM32VLDISCOVERY

stm32vldiscovery_el (83K)

par (1K)  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 на основе генератора с ФАПЧ.

par (1K)  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.

par (1K)  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: зарезервировано.

Перед выбором тактового источника необходимо предварительно произвести его запуск и удостовериться в его готовности к работе.

par (1K)  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.

par (1K)  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;
    }   }

par (1K)  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.

par (1K)  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

par (1K)  3.1 Общие сведения.

Контроллер вложенных векторизированных прерываний STM32 (Nested vectored interrupt controller (NVIC)), в зависимости от модели микроконтроллера, способен обслуживать до 68 источников прерываний IRQ от периферийных модулей микроконтроллера и осуществлять:
- разрешение и запрет вызова прерываний;
- назначение и динамическое изменение приоритета прерываний (16 уровней от 0 (максимального) до 15);
- автоматическое сохранение и восстановление контекста данных при обработке одиночных и вложенных прерываний;
- при одновременном вызове, механизм отложенных прерываний позволяет отложить обработку менее приоритетного прерывания, без возврата в фон и восстановления контекста данных.

par (1K)  3.2 Источники прерываний IRQ (Interrupt ReQuest)

Определённым событиям, связанным с работой периферийных модулей STM32, назначены отдельные источники прерываний с соответствующими порядковыми номерами. Номера прерываний IRQn для микроконтроллеров определённой подгруппы объявлены в разделе "STM32 specific Interrupt Numbers” заголовочного файла "stm32F10x.h":

   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.

par (1K)  3.3 События, генерирующие запросы на перывания

Большинству источников прерываний IRQ сопоставлены несколько событий, связанных с работой конкретного периферийного блока. Так, например, прерывание по каналу USART может быть вызвано при переносе принятого байта в приёмный буфер (флаг RXNE=1), по готовности передающего буфера к приёму нового байта для отправки (TXE=1) и так далее. При этом должны быть установлены флаги разрешения запросов на прерывания по выбранным событиям, а какое из них стало причиной вызова по данному источнику можно определить в обработчике по состоянию соответствующих флагов. Например, разрешение запросов на прерывание по завершению приёма и передачи кадра USART1:

   USART1->CR1 |= USART_CR1_TCIE | USART_CR1_RXNEIE; // Разрешить запросы по флагам TC и RXNE.

При возникновении события и установленном флаге разрешения запроса на прерывание, соответствующий обработчик будет вызван сразу, если данный источник уже разрешён, или непосредственно после его разрешения в NVIC.

par (1K)  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.

par (1K)  3.5 Приоритеты прерываний IRQ.

По-умолчанию, при сброшенных битах группировки приоритетов прерываний AIRCR[10:8] (состояние после перезагрузки), каждому из прерываний может быть назначен собственный приоритет от 0 до 15. При этом прерывания будут обрабатываться по следующим правилам:
- вызов прерывания с более высоким приоритетом приостанавливает выполнение текущего обработчика;
- выполнение функции обработки прерывания не может быть прервано вызовом с тем же или более низким уровнем приоритета.
- при одновременном вызове, несколько прерываний будут обработаны в порядке приоритета, при одинаковом приоритете по возрастанию номера прерывания.
Функция 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).

par (1K)  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

par (1K)  4.1 Общие сведения

Микроконтроллеры STM32 способны генерировать прерывание по состоянию вывода x = {0, 1, 2, .... 15} порта, назначенного пользователем для данного номера вывода. Так, например прерывание EXTI3 может быть назначено на выводы PA3 или PB3 или PC3… и так далее для одного из портов доступных в данном корпусе микроконтроллера.
При возникновении условий, назначенных прерыванию 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 необходимо определить какой из них послужил причиной прерывания.

par (1K)  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.

par (1K)  4.4 Разрешение запросов и задание условий вызова внешних прерываний

Разрешение запроса на прерывание по состоянию вывода x осуществляется установкой соответствующего бита MR(x) в регистре EXTI_IMR (Interrupt Mask Register).
EXTI_IMR - маска запросов внешних прерываний:

stm32_EXTI_EMR (1K)

Условия формирования запросов на прерывание EXTI(x) определяются состоянием битов TR(x) в регистрах "Rising trigger selection register” (EXTI_RTSR) и "Falling trigger selection register" (EXTI_FTSR).

EXTI_RTSR – прерывание по фронту "Rising Edge”

stm32_EXTI_RTSR (1K)

EXTI_FTSR – прерывание по срезу "Falling Edge”

stm32_EXTI_RTSR (1K)

При установленных битах регистров RTSR и FTSR соответствующие прерывания будут вызываться или по фронту внешнего сигнала или по срезу, или по обоим событиям вместе, например:


  EXTI->IMR |= (1 << 7); // Разрешить запрос от EXTI7.
  EXTI->FTSR |= (1 << 7); // Прерывание от EXTI7 по срезу.
  NVIC_EnableIRQ (EXTI9_5_IRQn); // Разрешить EXTI9_5 в NVIC.

par (1K)  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
  }
  ...
}

Ну вот... как-то так. Удачных Вам программ!

Яндекс.Метрика