- Зачем нам нужно прерывание?
- Типы прерываний в MSP430
- Управление программой прерывания в MSP430
- Схема MSP430 для проверки прерывания GPIO
- Программирование MSP430 для прерываний
- Загрузка программы на MSP430 из CCS
- Программа прерывания на MSP430
Рассмотрим простые цифровые часы, которые запрограммированы так, чтобы просто показывать вам время, а теперь представьте, что вы хотите изменить их часовой пояс. Что бы ты сделал? Вы просто нажимаете кнопку, которая вызывает меню, позволяющее изменить часовой пояс. Здесь система не может предсказать ваше внешнее прерывание для своих процессов сохранения времени и не может попросить вас подождать, так как она занята увеличением значения секунд на ваших часах. Вот здесь и пригодятся прерывания.
Прерывания не всегда должны быть внешними; он тоже может быть внутренним. В большинстве случаев встроенное прерывание также способствует обмену данными между двумя периферийными устройствами ЦП. Предположим, что предварительно установленный таймер сбрасывается и прерывание запускается, когда время достигает значения в регистре таймера. Обработчик прерывания может использоваться для запуска других периферийных устройств, таких как DMA.
В этом руководстве мы использовали внешние прерывания на MSP430 для переключения различных светодиодов. Когда внешнее прерывание выдается изменением состояния с помощью кнопки, управление передается (предварительно освобождается) ISR, и он выполняет необходимое. Чтобы узнать основы, такие как настройка среды CCS для стартовой панели MSP430G2, перейдите по этой ссылке, чтобы начать работу с MSP430 с использованием CCS, потому что мы не будем вдаваться в подробности этого в этом руководстве. Также просмотрите другие руководства на основе MSP430 с использованием Energia IDE и CCS, перейдя по ссылке.
Зачем нам нужно прерывание?
Прерывания необходимы для экономии накладных расходов на опрос во встроенной системе. Они вызываются, когда необходимо выполнить задачи с более высоким приоритетом путем упреждения текущей запущенной задачи. Его также можно использовать для вывода процессора из режима низкого энергопотребления. Когда он пробуждается переходом фронта внешнего сигнала через порт GPIO, выполняется ISR, и ЦП снова возвращается в режим низкого энергопотребления.
Типы прерываний в MSP430
Эти прерывания в MSP430 прийти в следующем types-
- Сброс системы
- Немаскируемое прерывание
- Маскируемое прерывание
- Прерывания с вектором и без вектора
Сброс системы:
Это может произойти из-за напряжения питания (Vcc) и из-за низкого сигнала на выводе RST / NMI с выбранным режимом сброса, а также может произойти по таким причинам, как переполнение сторожевого таймера и нарушение ключа безопасности.
Немаскируемое прерывание:
Эти прерывания не могут быть замаскированы инструкциями ЦП. Как только общее прерывание разрешено, немаскируемое прерывание нельзя отвлечь от обработки. Это генерируется такими источниками, как сбои осциллятора и фронтом, заданным вручную RST / NMI (в режиме NMI).
Маскируемое прерывание:
Когда происходит прерывание и если оно может быть замаскировано инструкцией ЦП, то это маскируемое прерывание. Они не всегда должны быть внешними. Они также зависят от периферийных устройств и их функций. Используемые здесь прерывания от внешнего порта попадают в эту категорию.
Прерывания с вектором и прерывания без вектора:
Вектор: в этом случае устройства, которые прерывают, предоставляют нам источник прерывания, передавая адрес вектора прерывания. Здесь адрес ISR фиксируется, и управление передается на этот адрес, а ISR позаботится обо всем остальном.
Без вектора: здесь все прерывания имеют общий ISR. Когда прерывание происходит от источника без вектора, управление передается на общий адрес, на который делятся все прерывания без вектора.
Управление программой прерывания в MSP430
Когда происходит прерывание, MCLK включается, и CPU вызывается из состояния OFF. Поскольку управление программой передается по адресу ISR после возникновения прерывания, значения в счетчике программы и регистре состояния перемещаются в стек.
Последовательно регистр состояния очищается, тем самым очищая GIE и завершая режим низкого энергопотребления. Прерывание с наивысшим приоритетом выбирается и выполняется путем помещения адреса вектора прерывания в программный счетчик. Прежде чем мы перейдем к нашему примеру кода прерывания GPIO для MSP430, важно понять, как работают регистры порта, участвующие в нем.
Регистры портов для управления GPIO на MSP430:
PxDIR: это регистр управления направлением порта. Это позволяет программисту специально выбирать его функцию, записывая 0 или 1. Если вывод выбран как 1, то он действует как выход. Считайте порт 1 8-битным портом, и если контакты 2 и 3 должны быть назначены как выходные порты, то регистру P1DIR необходимо установить значение 0x0C.
PxIN: это регистр только для чтения, и текущие значения порта могут быть прочитаны с помощью этого регистра.
PxOUT: этот конкретный регистр может использоваться для записи значений напрямую в порты. Это возможно только тогда, когда регистр подтягивания / понижения отключен.
PxREN: это 8-битный регистр, используемый для включения или отключения регистра подтягивания / опускания. Когда вывод установлен как 1 в регистрах PxREN и PxOUT, тогда конкретный вывод подтягивается.
PxDIR |
PxREN |
PxOUT |
Конфигурация ввода / вывода |
0 |
0 |
Икс |
Вход с отключенными резисторами |
0 |
1 |
0 |
Вход с включенным внутренним понижением |
0 |
1 |
1 |
Вход с включенным внутренним подтягиванием |
1 |
Икс |
Икс |
Выход - PxREN не действует |
PxSEL и PxSEL2: Поскольку все выводы в MSP430 мультиплексированы, перед использованием необходимо выбрать конкретную функцию. Когда регистры PxSEL и PxSEL2 установлены как 0 для определенного вывода, тогда выбирается ввод / вывод общего назначения. Когда для PxSEL установлено значение 1, выбирается основная периферийная функция и так далее.
PxIE: разрешает или запрещает прерывания для определенного вывода порта x.
PxIES: выбирает край, на котором генерируется прерывание. Для 0 выбирается нарастающий фронт, а для 1 выбирается спадающий фронт.
Схема MSP430 для проверки прерывания GPIO
Схема MSP430, использованная для тестирования кода нашего примера прерывания MSP430, показана ниже.
Земля платы используется для заземления как светодиода, так и кнопки. Противоположные по диагонали стороны кнопки являются нормально разомкнутыми клеммами и подключаются при нажатии кнопки. Перед светодиодом подключается резистор, чтобы избежать высокого потребления тока светодиодом. Обычно используются низкоомные резисторы в диапазоне от 100 Ом до 220 Ом.
Мы используем 3 разных кода, чтобы лучше понять прерывания порта. Первые два кода используют ту же схему, что и на принципиальной схеме 1. Давайте погрузимся в код. После подключения мои настройки выглядят так.
Программирование MSP430 для прерываний
Полную программу прерывания MSP430 можно найти внизу этой страницы, объяснение кода приводится ниже.
Следующая строка останавливает работу сторожевого таймера. Сторожевой таймер обычно выполняет две операции. Один из них предотвращает бесконечные циклы контроллера путем сброса контроллера, а другой - он запускает периодические события с использованием встроенного таймера. Когда микроконтроллер сбрасывается (или включается), он находится в режиме таймера и имеет тенденцию сбрасывать MCU через 32 миллисекунды. Эта строка останавливает контроллер от этого.
WDTCTL = WDTPW + WDTHOLD;
Установка регистра P1DIR на значение 0x07 устанавливает направление вывода pin0, pin1 и pin2 в качестве вывода. Установка P1OUT на 0x30 конфигурирует его как вход с включенными внутренними подтягивающими резисторами на контактах 4 и 5. Установка P1REN на 0x30 включает внутреннюю подтяжку на этих выводах. P1IE разрешает прерывание, где P1IES выбирает переход от высокого к низкому уровню в качестве фронта прерывания на этих выводах.
P1DIR - = 0x07; P1OUT = 0x30; P1REN - = 0x30; P1IE - = 0x30; P1IES - = 0x30; P1IFG & = ~ 0x30;
Следующая строка включает режим низкого энергопотребления и включает GIE в регистре состояния, чтобы прерывания могли приниматься.
__bis_SR_register (LPM4bits + GIE)
Программный счетчик устанавливается на адрес вектора порта 1 с помощью макроса.
ПОРТ1_ВЕКТОР . #pragma vector = PORT1_VECTOR __interrupt void Port_1 (void)
Приведенный ниже код переключает каждый из светодиодов, подключенных к pin0, pin1, pin2, по одному.
если (количество% 3 == 0) { P1OUT ^ = BIT1; P1IFG & = ~ 0x30; count ++; } иначе, если (число% 3 == 1) { P1OUT ^ = BIT1; P1IFG & = ~ 0x30; count ++; } иначе { P1OUT ^ = BIT2; P1IFG & = ~ 0x30; count ++; }
Принципиальная схема 2:
Точно так же давайте попробуем другой вывод, чтобы лучше понять концепцию. Итак, здесь кнопка подключена к выводу 2.0 вместо вывода 1.5. модифицированная схема выглядит следующим образом. Эта схема снова используется для проверки программы прерывания кнопки MSP430.
Здесь порт 2 используется для ввода. Поэтому нужно использовать другой вектор прерывания. P1.4 и P2.0 принимают входные сигналы.
Поскольку порт 2 используется только для входа, P2DIR установлен на 0. Чтобы установить контакт 0 порта 2 в качестве входа с включенными внутренними подтягивающими резисторами, регистры P2OUT и P2REN должны быть установлены на значение 1. Чтобы включить прерывание на выводе 0 порта 2, а также для выбора фронта прерывания P2IE и P2IES устанавливаются со значением 1. Чтобы сбросить флаг в порту 2, P2IFG очищается, так что флаг можно снова установить на возникновение прерывания.
P2DIR - = 0x00; P2OUT = 0x01; P2REN - = 0x01; P2IE - = 0x01; P2IES - = 0x01; P2IFG & = ~ 0x01;
Если источником прерывания является порт 1, то светодиод, подключенный к контакту 1 порта 1, светится. Если источник прерывания принадлежит порту 2, то светодиод, подключенный к контакту 2 порта 1, светится.
#pragma vector = PORT1_VECTOR __interrupt void Port_1 (void) { P1OUT ^ = BIT1; P1IFG & = ~ 0x10; для (я = 0; я <20000; я ++) { } P1OUT ^ = BIT1; } #pragma vector = PORT2_VECTOR __interrupt void Port_2 (void) { P1OUT ^ = BIT2; P2IFG & = ~ 0x01; для (j = 0; j <20000; j ++) { } P1OUT ^ = BIT2; }
Загрузка программы на MSP430 из CCS
Чтобы загрузить проект на панель запуска и отладить его, выберите проект и щелкните значок отладки на панели инструментов. Либо нажмите F11 или щелкните RunàDebug, чтобы войти в режим отладки.
После входа в режим отладки нажмите кнопку запуска зеленого цвета, чтобы свободно запустить загруженный код в MCU. Теперь, когда кнопка нажата, прерывание запускается изменением фронта, таким образом вызывая изменение состояния светодиода.
Программа прерывания на MSP430
После успешной загрузки кода мы можем протестировать его, просто нажав кнопку. Схема светодиода будет меняться в соответствии с нашей программой всякий раз, когда с помощью кнопки подается прерывание.
Полную работу можно найти в видео по ссылке ниже. Надеюсь, вам понравился урок и вы узнали что-то полезное. Если у вас есть какие-либо вопросы, оставьте их в разделе комментариев или воспользуйтесь нашим форумом, чтобы задать другие технические вопросы.