Главная
страница 1
Отчет по лабораторной работе №2

«Прерывания.Разработка обработчика прерываний.Таймер»

Цель работы:

Ознакомиться с программированием прерываний и таймеров микроконтроллеров STM32.



Краткий конспект теоретической части

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

Флаг прерывания – бит регистра который показывает что в данный момент время выполняется прерывание.

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

Вектор прерываний – адрес памяти контроллера с которого начинается выполнение обработчика прерывания.

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

Контроллер вложенных векторизованных прерываний

Контроллер вложенных векторизованных прерываний (КВВП) является стандартным блоком ядра Cortex. Это означает, что у любого Cortex-микроконтроллера будет присутствовать одна и та же структура прерываний, независимо от его производителя. Таким образом, прикладной код и операционные системы можно легко портировать с одного МК на любой другой и, при этом, программисту не потребуется изучение нового набора регистров. При разработке КВВП также учитывалось, что задержка реагирования на прерывание должна быть очень малой. Данная задача решена двояким образом: собственно возможностями КВВП, а также набором инструкций Thumb-2, многоцикловые инструкции которого, как например, инструкции многократного чтения/записи, являются прерываемыми. Задержка реагирования на прерывание то же является детерминистичной, что важно для систем реального времени. Как следует из наименования КВВП, им поддерживаются вложенные прерывания и, в частности, у МК STM32 используется 16 уровней приоритетов. Структура прерываний КВВП разработана с учетом программирования полностью на Си и исключает потребность в написании каких-либо ассемблерных макросов или специальных, несовместимых с ANSI, директив.




Несмотря на то, что КВВП является стандартным блоком ядра Cortex, в целях минимизации количества логических вентилей, разработчик МК может сконфигурировать количество линий прерываний, идущих к КВВП. Контроллер поддерживает одно немаскируемое прерывание и еще до 240 внешних линий прерывания, которые можно подключить к пользовательским УВВ. В ядре Cortex поддерживается еще 15 дополнительных источников прерываний, использующихся для обработки внутренних исключительных ситуаций ядра Cortex. Максимальное число маскируемых линий прерывания КВВП микроконтроллеров STM32 равно 43.

Если прерывание инициируется УВВ, то КВВП подключит ЦПУ Cortex к обработке прерывания. После перехода ЦПУ Cortex в режим прерывания, он помещает набор регистров в стек. Эта операция выполняется с помощью специального микрокода, что упрощает прикладной код. В процессе записи данных в стек на шине инструкций осуществляется выборка начального адреса процедуры обработки прерывания. Благодаря этому, с момента возникновения прерывания до выполнения первой инструкции его обработки проходит всего лишь 12 циклов.



К числу помещаемых в стек данных относятся регистр статуса программы, счетчик программы и регистр связи. Благодаря этому, запоминается состояние, в котором находилось ЦПУ Cortex CPU. Кроме того, также сохраняются регистры R0 - R3. Эти регистры широко используются в инструкциях для передачи параметров, поэтому, помещение в стек делает возможным их использование в процедуре обработке прерывания. Замыкает список помещаемых в стек регистров - R12. Он выступает в роли рабочего регистра внутри подпрограммы. Например, если в компиляторе активизировать проверку стека, то будет генерироваться дополнительный код, который при потребности в регистре ЦПУ будет использовать R12. По завершении обработки прерывания все действия выполнятся в обратном порядке: с помощью микрокода извлекается содержимое стека и, параллельно с этим, осуществляется выборка адреса возврата, таким образом, для возобновления выполнения фоновой программы потребуется 12 циклов.

Задание№1 Разработать программу которая мигает светодиодиком PC8 и обработчик прерываний который по нажатию кнопки PA0 зажигает светодиод PC9 отладочной платы STM32VL-Discovery.

#include "stm32f10x.h" //файл содержащий имена всех регисторов контроллера

void EXTI0_IRQHandler(void);//объявляем функцию обработчика прерываний

int main(void)//тело основной программы

{

int i;


RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;//тактируем порт C

GPIOC->CRH &= ~GPIO_CRH_CNF8;//настраиваем на выход PC8

GPIOC->CRH |= GPIO_CRH_MODE8_1;
GPIOC->CRH &= ~GPIO_CRH_CNF9;//настраиваем на выход PC9

GPIOC->CRH |= GPIO_CRH_MODE9_1;


EXTI->IMR |= EXTI_IMR_MR0; //маскируем прерывание

EXTI->RTSR |= EXTI_RTSR_TR0;//триггер срабатывет по фронту сигнала


//Настройка кнопки

RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;

GPIOA->CRL |= GPIO_CRL_CNF0_0;

GPIOA->CRL &= ~GPIO_CRL_MODE0;


NVIC_EnableIRQ(EXTI0_IRQn);//Разрешаем прерывание по кнопке

while(1)


{

GPIOC->ODR |= GPIO_ODR_ODR8; //мигаем светодиодиком PC 8

for (i=1; i<1000000; i++);//задержка

GPIOC->ODR &= ~GPIO_ODR_ODR8;

for (i=1; i<1000000; i++);

}

}



void EXTI0_IRQHandler(void)//обработчик прерываний

{

GPIOC->ODR ^= GPIO_ODR_ODR9;//мигаем светодиодом PC 9



EXTI->PR = EXTI_PR_PR0;//обнуляем флаг прерывания

}
Таймеры общего назначения и многофункциональные таймеры


У МК STM32 имеется четыре блока таймеров. Таймер 1 - расширенный таймер, предназначенный для управления электродвигателем. Остальные таймеры являются таймерами общего назначения. Все таймеры выполнены по общей архитектуре, а расширенный таймер отличается лишь добавлением специальных аппаратных блоков. В данном разделе мы вначале рассмотрим таймеры общего назначения, а затем перейдем к изучению особенностей расширенного таймера.

Все блоки таймеров выполнены на основе 16-битного перезагружаемого счетчика, который синхронизируется с выхода 16-битного предделителя. Перезагружаемое значение хранится в отдельном регистре. Счет может быть прямой, обратный или двунаправленный (сначала прямой до определенного значения, а затем обратный). Вход синхронизации счетчика можно связать с одним из восьми различных источников. В их число входят: специальный сигнал синхронизации, производный от сигнала главной системной синхронизации; выходной сигнал синхронизации одного из других таймеров или внешний сигнал синхронизации, связанный с выводами захвата /сравнения.

Помимо составляющего основу таймера счетчика, в каждый блок таймера также входит четырехканальный блок захвата/сравнения. Данный блок выполняет, как стандартные функции захвата и сравнения, так и ряд специальных функций. Каждый из таймеров может генерировать прерывания и поддерживает ПДП.
Задание №2 Написать таймер который генерирует прерывание и обработчик прерывания – мигание светодиодом PC8.

#include "stm32f10x.h"

//Изучаем таймеры и прерывания

void TIM1_TRG_COM_TIM17_IRQHandler(void);//объявление функции обработчика

int main(void)

{

RCC->APB2ENR=RCC_APB2ENR_TIM17EN;//тактирование генератора



TIM17->PSC=64000-1;//установка предделителя 64 000 (частота 125 Нz)

TIM17->ARR=1250-1;//максимальное значение до которого считает таймер = 1250

TIM17->DIER=TIM_DIER_UIE;//разрешаем генерацию событий

TIM17->CR1 = TIM_CR1_CEN | TIM_CR1_ARPE;//разрешение работы и сброс по достижении макс.значения

NVIC_SetPriority(TIM1_TRG_COM_TIM17_IRQn, 15);//устанавливаем приоритет

NVIC_EnableIRQ(TIM1_TRG_COM_TIM17_IRQn);//разрешаем прерывание

RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;//тактируем порт C

GPIOC->CRH &= ~GPIO_CRH_CNF8;//настраиваем на выход PC8

GPIOC->CRH |= GPIO_CRH_MODE8_1;

while (1)//зацикливаем выполнение программы

{

}

}



void TIM1_TRG_COM_TIM17_IRQHandler()//обработчик прерываний

{

if(TIM17->SR&TIM_SR_UIF)// проверяем наличие флага UIF (прерывание)



{

TIM17->SR&=~TIM_SR_UIF;// сбросили флаг UIF (сброс программный!!!)

GPIOC->ODR^=GPIO_ODR_ODR8;

}
}
Выводы


В данной работе мы рассмотрели принципы работы с прерываниями и таймерами контроллера STM32. Мы разобрали только основы – возможности прерываний и таймеров STM32 гораздо шире.


Смотрите также:
Отчет по лабораторной работе №2 «Прерывания. Разработка обработчика прерываний. Таймер»
69.38kb.
1 стр.
Программа должна содержать средства, подтверждающие исполнение прерывания, например, с использованием других обработчиков прерываний
10.73kb.
1 стр.
Отчет по лабораторной работе №3 «Модели стационарных рядов arma, и нестационарных arima»
55.97kb.
1 стр.
Лекция. Питание, система команд и архитектура микроконтроллеров avr
76.06kb.
1 стр.
Отчет по лабораторной работе №7 студент 3 курса гр. И-912 Алиева М. И. Проверила : ст
484.17kb.
4 стр.
Отчет по лабораторной работе №3 «Модели стационарных рядов arma и нестационарных arima»
36.42kb.
1 стр.
Отчет по лабораторной работе №3 «Модели стационарных рядов arma и нестационарных arima»
21.05kb.
1 стр.
Отчет по лабораторной работе №2 по курсу «Электроника»
177.26kb.
1 стр.
Отчет по лабораторной работе «Изучение конструкции цилиндрического зубчатого редуктора»
44.97kb.
1 стр.
Инструкция по эксплуатации включение тфт: Откройте отсек для батареек и установите две батарейки типа ааа
44.36kb.
1 стр.
Отчет о лабораторной работе №1 Барнаул 2011 Лабораторная №1 Вариант 6 Задача
278.51kb.
1 стр.
Отчет по лабораторной работе №2 по курсу «Операционные системы»
38.12kb.
1 стр.