Руководство по прерываниям в MSP430 на Code Composer Studio


Прерывания играют важную роль в современных встраиваемых устройствах на основах микроконтроллеров, позволяя микроконтроллеру прерывать выполнение основной программы и переключаться на другую, более важную в данный момент задачу, связанную с обработкой поступившего прерывания. Прерывания могут быть как внешними, вызванными срабатываниями каких то внешних устройств, подключенных к микроконтроллеру (например, кнопок), так и внутренними, вызванными, например, событием переполнения таймера микроконтроллера.

Демонстрация использования прерываний в MSP430

В данной статье мы рассмотрим использования внешних прерываний в микроконтроллере MSP430, с помощью которых мы будем переключать состояние различных светодиодов. При нажатии кнопки управление из основной программы будет передаваться в функцию обработки прерывания (ISR). Написание программы для нашего проекта мы будем осуществлять в среде Code Composer Studio (CCS), основы работы с данной средой для микроконтроллеров MSP430 мы рассматривали в этой статье.

Необходимые компоненты

  1. Плата MSP430G2 LaunchPad (купить на AliExpress).
  2. Светодиод – 2 шт. (купить на AliExpress).
  3. Кнопка – 2 шт.
  4. Резистор – 2 шт. (купить на AliExpress).
  5. Макетная плата.
  6. Соединительные провода.

Зачем нужны прерывания

Прерывания необходимы для выполнения во встраиваемых системах каких то срочных возникающих задач. Они вызываются когда во время выполнения основной программы необходимо выполнить какую либо задачу более высокого приоритета. Также прерывания используются для "пробуждения" микроконтроллера из энергосберегающих/спящих режимов. После "пробуждения" и выполнения срочной задачи микроконтроллер снова может вернуться в спящий режим.

Типы прерываний в MSP430

В микроконтроллере MSP430 возможны прерывания следующих типов:

  1. System Reset (системный сброс).
  2. Non-Maskable Interrupt (не маскируемые прерывания).
  3. Maskable Interrupt (маскируемые прерывания)
  4. Vectored and Non-Vectored Interrupts (векторные прерывания и прерывания без вектора)

System Reset (системный сброс)

Данное прерывание может произойти вследствие недостаточного напряжения питания (Vcc), низкого уровня сигнала на контакте RST/NMI при выбранном режиме сброса (Reset mode), а также при переполнении сторожевого таймера (watchdog timer overflow) и нарушениях безопасности.

Non-Maskable Interrupt (не маскируемые прерывания)

Эти прерывания нельзя замаскировать (запретить) с помощью инструкций в коде программы. Если общее разрешение прерываний установлено (General Interrupt), то немаскируемым прерываниям нельзя запретить срабатывать. В большинстве случаев данные прерывания вызваны сбоями в работе кварцевого генератора и сигналами подаваемыми на контакт RST/NMI (в режиме NMI).

Maskable Interrupt (маскируемые прерывания)

Данным прерываниям можно запретить срабатывать с помощью инструкций в программе. Запрет на срабатывание данным прерываниям устанавливается с помощью так называемой маски. Эти прерывания могут быть как внешними, так и внутренними. Внешние подобные прерывания зависят от функционала периферийных устройств, подключаемых к микроконтроллеру.

Векторные прерывания и прерывания без вектора

Векторные прерывания: в этом случае при срабатывании прерывания нам передается его вектор, который представляет собой адрес расположения функции обработки данного прерывания (ISR).

Прерывания без вектора: все эти прерывания имеют одну общую функцию обработки прерываний (ISR) и при срабатывании одного из этих прерываний управление в программе передается по общему адресу для всех этих прерываний.

Обработка прерываний в MSP430

При срабатывании прерывания включается (ON) MCLK (первичный источник сигналов синхронизации) и микроконтроллер выходит из состояния OFF. Поскольку в данном случае управление в программе передается по адресу расположения функции обработки прерывания значения программного счетчика (program counter) и регистра состояния (status register) помещаются в стек.

Принцип обработки прерываний в MSP430

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

Далее рассмотрим как при обработке прерывания работают регистры портов (Port registers) микроконтроллера.

PxDIR: регистр направления передачи данных на контактах порта. В его биты можно записывать значения 0 или 1. Если записана 1, то соответствующий контакт работает на вывод данных. Если порт 8-битный, то для того чтобы задать режим работы его контактов 2 и 3 на вывод данных, в регистр P1DIR должно быть записано значение 0x0C.

PxIN: регистр, доступный только для чтения. Текущие значения на контактах порта можно считать с использованием данного регистра.

PxOUT: этот регистр может быть использован для непосредственной записи значений в контакты порта. Это возможно только в том случае когда соответствующие подтягивающие регистры (pullup/pulldown register) отключены.

PxREN: это 8-битный регистр, используемый для включения или выключения подтягивающих резисторов. Когда 1 установлена в регистры PxREN и PxOUT, то соответствующий контакт будет "подтянут".

PxDIR PxREN PxOUT I/O Config
0 0 X ввод данных с отключенными резисторами
0 1 0 ввод данных с использованием подтягивающих (pulldown) резисторов
0 1 1 ввод данных с использованием подтягивающих (pullup) резисторов
1 X X вывод данных, PxREN не используется

PxSEL и PxSEL2: поскольку все контакты в микроконтроллере MSP430 мультиплексированы (могут выполнять несколько различных функций), то перед их использованием должны быть выбрана определенная функция. Когда оба регистра PxSEL и PxSEL2 установлены в 0 для определенного контакта, то выбран режим работы контакта ввода/вывода общего назначения (general purpose I/O). Когда PxSEL установлен в 1, то устанавливается на контакте функция работы с периферийными устройствами и т.д.

PxIE: разрешает или запрещает прерывания для конкретного контакта порта x.

PxIES: выбирает край импульса, по которому происходит срабатывание прерывания. Если 0, то выбирается восходящий край импульса, а если 1 – падающий край импульса.

Схема проекта № 1

Схема проекта для демонстрации возможностей использования прерываний в плате MSP430G2 представлена на следующем рисунке.

Схема проекта для демонстрации возможностей использования прерываний в плате MSP430G2Земля платы используется в качестве общего провода (земли) для светодиодов и кнопок. В отжатом состоянии контакты кнопок разомкнуты, в нажатом – замкнуты. Последовательно со светодиодами включены токоограничивающие резисторы, их номинал можно выбрать в диапазоне 100-220 Ом.

Мы будем использовать 3 различных кода программ для лучшего понимания работы прерываний в MSP430. Первые два из этих кодов используют одну и ту же схему, представленную в этом пункте.

Внешний вид собранной конструкции проекта показан на следующем рисунке.

Внешний вид собранной конструкции проекта

Объяснение кода программы

Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.

Первым делом в коде программы остановим работу сторожевого таймера (watchdog timer). Сторожевой таймер выполняет две основные функции. Первая из них заключается в предотвращении выполнения микроконтроллером бесконечных циклов при помощи его сброса, а вторая – в формировании периодических событий при помощи встроенного таймера. Когда на микроконтроллер подано питание или сигнал сброса, сторожевой таймер находится в режиме таймера и будет пытаться осуществить сброс микроконтроллера через 32 миллисекунды. Следующая строчка кода запрещает ему делать это.

Далее запишем необходимые значения в регистры. В регистр P1DIR запишем значение 0x07 чтобы установить режим работы контактов pin0, pin1 и pin2 на вывод данных. В регистр P1OUT запишем 0x30 чтобы для контактов pin4 и pin5 установить режим работы на ввод данных с использованием внутренних подтягивающих резисторов. Установка в P1REN 0x30 включает использование подтягивающих резисторов на этих контактах. Регистр P1IE разрешает прерывания, а P1IES выбирает переключение импульса с состояния high на low чтобы задать по какому краю импульса будет срабатывать прерывание.

Следующая команда включает режим энергосбережения (low power mode) и включает глобальное разрешение прерываний (GIE) в регистре состояния – необходимое условие для срабатывания прерываний.

Программный счетчик (program counter) устанавливается по адресу вектора порта 1 с помощью макро команды.

Следующий фрагмент кода последовательно переключает все светодиоды подключенные к контактам pin0, pin1, pin2.

Схема проекта № 2

Вторая схема проекта для демонстрации возможностей использования прерываний в плате MSP430G2 представлена на следующем рисунке.

Вторая схема проекта для демонстрации возможностей использования прерываний в плате MSP430G2

По сравнению с предыдущей схемой на этой схеме кнопка подключена к контакту 2.0 вместо контакта 1.5.

В этом случае порт 2 используется для ввода данных, поэтому необходимо использовать различные векторы прерываний. P1.4 и P2.0 будут считывать состояния кнопок.

Поскольку в этом случае порт 2 используется только для ввода, то P2DIR устанавливается в 0. Чтобы установить pin0 порта 2 в режим для ввода данных с внутренним подтягивающим резистором, в регистры P2OUT и P2REN необходимо записать значение 1. Чтобы использовать прерывания на pin0 порта 2 и выбрать край срабатывания прерывания, в P2IE и P2IES записывается значение 1. Чтобы сбросить флаг на порту 2 очищается P2IFG, этот флаг может быть установлен снова при появлении прерывания.

Когда источником прерывания является порт 1, светодиод, подключенный к pin1 порта 1, загорается. Когда источником прерывания является порт 2, загорается светодиод, подключенный к pin2 порта 1.

Загрузка кода программы в MSP430 с помощью CCS

Чтобы загрузить программу в MSP430 launchpad и отладить ее, выберите проект и нажмите на иконку debug в панели инструментов. Либо же можно нажать F11 или RunàDebug для того чтобы войти в режим отладки.

Иконка debug в панели инструментов CCS

После того как будет выбран режим отладки (debug mode), нажмите кнопку run зеленого цвета чтобы свободно загрузить код программы в микроконтроллер. После этого после нажатия кнопки будет срабатывать прерывание, что будет приводить к изменению состояния светодиода.

Иконка запуска программы в панели инструментов CCS

Тестирование работы проекта

После загрузки кода программы в MSP430 мы можем протестировать работу проекта нажимая кнопки, при этом должны загораться соответствующие светодиоды.

Тестирование работы прерываний в MSP430

Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.

Исходный код программы

Видео, демонстрирующее работу проекта

Источник статьи

(Проголосуй первым!)
Загрузка...
279 просмотров

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *