STM32 прерывания NVIC и внешние прерывания.

Кто любит RISC в жизни, заходим, не стесняемся.
TmYAG
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн окт 14, 2013 21:39:47

STM32 прерывания NVIC и внешние прерывания.

Сообщение TmYAG »

Здравствуйте! Помогите пожалуйста разобраться с прерываниями. Вернее с тем как их настраивать используя только CMSIS.
Мой девайс STM32F4DISCOVERY программирую под IARом.
Для структуризации разделю свои вопросы на две части по внутренним прерываниям и по внешним.
Логичнее начать с внутренних.
NVIC
Разрешение прерываний. С функцией NVIC_EnableIRQ(IRQ) все понятно, просто запихнуть в ее аргумент нужный обработчик.
Вопрос как разрешить прерывания с использованием регистров. Насколько я понял для разрешения прерываний используется регистр ISER, более того он разбит на три элемента. Вот тут и возникает вопрос Как используя тот или иной элемент разрешить прерывания по нужной мне периферии? Например USART
Приоритеты и группы приоритетов прерываний Вот здесь для меня вообще темный лес.
Как с помощью регистров расставлять приоритеты. IPRx как раз отвечает за приоритет. Но их 20 шутк Как определить какой из них отвечает за выставление приоритета у того же USART и какой байт мне нужен?
Что касается подгрупп то дело еще темнее. Вообще читая RM часто вижу обожначение РЕГИСТР[x:y] например: AIRCR[10:8] что в скобках? Как я могу это использовать?

EXTI
Собственно вопросы те же самые. Единственное, что хочу прописать здесь для собственного понимания это то, что для прерываний по состоянию ножки эту самую ножку я должен сконфигурировать как альтернативную функцию. Про софтверный вызов я пока молчу.
Если быть конкретнее, то вот вопросы:
У нас 16 линий EXTI каждому номеру соответствует номер порта, то есть EXTI1 отвечает за ножки номер 1 портов A-E (в моем случае) Но как назначить порт?
Далее непонятно, если у нас 16 линий EXTI0-EXTI15, то что такое EXTI0_IRQn до EXTI4_IRQn и EXTI5_9_IRQn и EXTI10_15IRQn
В примерах кода видел такую запись: AFIO->EXTICR[1] AFIO - очевидно, что-то связанное с Альтернативной функцией. Посмотрел в IAR у меня подобного нет, но есть SYSCFG->EXTICR[1] или эти вещи не связаны? Еще что такое EXTICR[1] (в заголовках вообще объявлен массив из 4-х элементов)?
Ну и собственно непонятен опять же момент с разрешением прерываний с использование регистра IMR. Вот я выбрал ногу микроконтроллера, вот я выбрал порт. Как разрешить именно это прерывание?

Уффф. Пока все. Вопросов много. Не пинайте, я честно сидел и разбирался в примерами и читал RM. Отсюда и возникли вопросы.
Реклама
Аватара пользователя
amv2000
Опытный кот
Сообщения: 723
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

Re: STM32 прерывания NVIC и внешние прерывания.

Сообщение amv2000 »

TmYAG писал(а):Здравствуйте! Помогите пожалуйста разобраться с прерываниями. Вернее с тем как их настраивать используя только CMSIS.
А Вы тут не смотрели ? http://eugenemcu.ru/publ/13-1-0-76
Реклама
TmYAG
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн окт 14, 2013 21:39:47

Re: STM32 прерывания NVIC и внешние прерывания.

Сообщение TmYAG »

amv2000 писал(а):
TmYAG писал(а):Здравствуйте! Помогите пожалуйста разобраться с прерываниями. Вернее с тем как их настраивать используя только CMSIS.
А Вы тут не смотрели ? http://eugenemcu.ru/publ/13-1-0-76
Как раз оттуда и пришел) Там разжевано, но некоторые моменты лично мне показались неясными. Поэтому решил уточнить тут на форуме.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32 прерывания NVIC и внешние прерывания.

Сообщение dosikus »

TmYAG писал(а): Для структуризации разделю свои вопросы на две части по внутренним прерываниям и по внешним.
Логичнее начать с внутренних.
Для начала надо осознать что NVIC это ядро а EXTI периферия и не* мешать мух с котлетами ...
EXTI можно осознать как простой мультиплексор с выводом сигнала к NVIC.
TmYAG писал(а): Разрешение прерываний. С функцией NVIC_EnableIRQ(IRQ) все понятно, просто запихнуть в ее аргумент нужный обработчик.
Вопрос как разрешить прерывания с использованием регистров.
Вообще-то NVIC_EnableIRQ(IRQ), NVIC_SetPriority и остальные - это не SPL это HAL от CMSIS .
Смысл их переписывать? Если интересно их устройство, для F4 смотри core_cm4.h...
Последний раз редактировалось dosikus Пн окт 13, 2014 14:39:14, всего редактировалось 1 раз.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
amv2000
Опытный кот
Сообщения: 723
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

Re: STM32 прерывания NVIC и внешние прерывания.

Сообщение amv2000 »

dosikus писал(а):"Вообще-то NVIC_EnableIRQ(IRQ), NVIC_SetPriority и остальные - это не SPL это HAL от CMSIS .
Смысл их переписывать? Если интересно их устройство, для F4 смотри core_cm4.h...
Я поэтому у TmYAG и спрашивал читали по ссылке, там же явно указано
Функции CMSIS для разрешения и запрета вызова IRQ в NVIC:
NVIC_EnableIRQ (RTC_IRQn); // Разрешить прерывания от RTC в NVIC.
NVIC_DisableIRQ (RTC_IRQn); // Запретить прерывания от RTC в NVIC.
и т.д.
TmYAG писал(а):Как используя тот или иной элемент разрешить прерывания по нужной мне периферии? Например USART
Приоритеты и группы приоритетов прерываний
Соответственно
NVIC_EnableIRQ (USART1_IRQn);
и приоритет
NVIC_SetPriority (USART1_IRQn, 15); // Назначить прерываниям от USART1 самый низкий проритет.
Реклама
TmYAG
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн окт 14, 2013 21:39:47

Re: STM32 прерывания NVIC и внешние прерывания.

Сообщение TmYAG »

dosikus писал(а): Вообще-то NVIC_EnableIRQ(IRQ), NVIC_SetPriority и остальные - это не SPL это HAL от CMSIS .
Смысл их переписывать? Если интересно их устройство, для F4 смотри core_cm4.h...
Ну если честно, то я нигде и не писал, что вышеперечисленные функции относятся к SPL.
Что касается устройства функций, то я их смотрел. Отсюда и вопросы.
Если быть конкретнее, то меня интересует как в регистре ISER указывается информация о разрешении тому или иному периферийному блоку вызывать прерывания. Как в ISER передать инфу, что я хочу разрешить прерывания от USART, DAC или еще чего. ISER целых три штуки. Какой из них соответствует нужной мне периферии. Как это увидеть?
Не говоря уже про вопросы с приоритетами и подгруппами.
Реклама
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32 прерывания NVIC и внешние прерывания.

Сообщение dosikus »

Ищите и обрящите ...
ARM®v7-M Architecture Reference Manual - Chapter 6 Nested Vectored Interrupt Controller
ARM®Cortex™-M4 Processor Technical Reference Manual
- B3.4 Nested Vectored Interrupt Controller (NVIC)
Interrupts and events RM0090 стр 247
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: STM32 прерывания NVIC и внешние прерывания.

Сообщение oleg110592 »

ISER целых три штуки. Какой из них соответствует нужной мне периферии. Как это увидеть?
посмотреть RM, пункт Nested vectored interrupt controller (NVIC)
смотрим: например для USART1 в Vector table позиция = 27, следовательно выбираем NVIC->ISER[0] - в нем первые 32 вектора и устанавливаем 27 бит, типа NVIC->ISER[0] = (1 << ((uint32_t)(27));
если не прав - более продвинутые товарищи поправят
может поможет http://mcucpu.ru/index.php/platformy-32 ... ya-v-stm32
TmYAG
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн окт 14, 2013 21:39:47

Re: STM32 прерывания NVIC и внешние прерывания.

Сообщение TmYAG »

oleg110592 писал(а):
ISER целых три штуки. Какой из них соответствует нужной мне периферии. Как это увидеть?
посмотреть RM, пункт Nested vectored interrupt controller (NVIC)
смотрим: например для USART1 в Vector table позиция = 27, следовательно выбираем NVIC->ISER[0] - в нем первые 32 вектора и устанавливаем 27 бит, типа NVIC->ISER[0] = (1 << ((uint32_t)(27));
если не прав - более продвинутые товарищи поправят
может поможет http://mcucpu.ru/index.php/platformy-32 ... ya-v-stm32
Спасибо большое! С этим разобрался!!!
Аватара пользователя
amv2000
Опытный кот
Сообщения: 723
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

Re: STM32 прерывания NVIC и внешние прерывания.

Сообщение amv2000 »

oleg110592 писал(а):
например для USART1 в Vector table позиция = 27, следовательно выбираем NVIC->ISER[0] - в нем первые 32 вектора и устанавливаем 27 бит, типа NVIC->ISER[0] = (1 << ((uint32_t)(27));если не прав - более продвинутые товарищи поправят
TmYAG писал(а):Что касается устройства функций, то я их смотрел. Отсюда и вопросы.
Ну да, в самой функции это и расписано

Код: Выделить всё

__STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn)
{
  NVIC->ISER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* enable interrupt */
}
Где IRQn - наша периферия.
Тут надобно не только читать, но и пробовать на конкретном примере. Без обид ибо сам долго въезжал.
TmYAG
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн окт 14, 2013 21:39:47

Re: STM32 прерывания NVIC и внешние прерывания.

Сообщение TmYAG »

Вот наваял код, для включения по нажатию кнопки светодиодов.

Код: Выделить всё

#include "stm32f4xx.h"
void EXTI0_IRQHandler(void)
{
  GPIOD->BSRRL |= (1 << 15)|(1 << 14)|(1 << 13)|(1 << 12);
  EXTI->PR |= EXTI_PR_PR0;//Сбрасываем флаг прерывания
}

int main()
{
  RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN; /*Включаем тактирование порта D*/
  RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;/*Включаем тактирование порта A*/
  RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN;/* Включаем тактирование SYSCFG*/
  
  GPIOD->MODER |= 0x55000000;/* Устанавливаем 15-й, 14-й, 13-й, 12-й pin на выход*/
  GPIOD->OTYPER = 0; /*Устанавливаем двухтактный выход порта D*/
  GPIOD->OSPEEDR = 0; /*Устанавливаем скорость порта*/
  GPIOD->ODR |= 0;/*Сбрасываем регистр ODR*/
  /*GPIOA->MODER = 0; Устанавливаем 0 pin порта A в 0, т.к. такая конфигурация соответствует входу
  GPIOA->MODER &= (~(1 << 0)|~(1 << 1));*/
  GPIOA->MODER &= ~GPIO_MODER_MODER0;
  /*GPIOA->MODER &=~0x3;*/
  SYSCFG->EXTICR[0] = SYSCFG_EXTICR1_EXTI0_PA; /*В качестве источника прерываний 0 порт A*/
  EXTI->RTSR |= EXTI_RTSR_TR0; /*Выбираем срабатывание прерывания по растущему фронту*/
  NVIC_EnableIRQ(EXTI0_IRQn); /*Разрешаем прерывания*/
  NVIC_SetPriority (EXTI0_IRQn, 2);
  EXTI->IMR |=EXTI_IMR_MR0;//Разрешаем прерывания
  while(1)
  {    
      GPIOD->BSRRL |= (1 << 15)|(1 << 14);
      for (int i = 0; i < 2000000; i++);
      GPIOD->BSRRH |= (1 << 15)|(1 << 14);
      for (int i = 0; i < 2000000; i++);

  }
}
Но почему-то прерывание не срабатывает((( После нажатия висит.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32 прерывания NVIC и внешние прерывания.

Сообщение dosikus »

TmYAG, EXTI не для кнопок , вбей это себе раз и навсегда ...
TmYAG
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн окт 14, 2013 21:39:47

Re: STM32 прерывания NVIC и внешние прерывания.

Сообщение TmYAG »

http://microtechnics.ru/stm32f3-ispolzo ... reryvanij/
Вот тут пример с прерываниями и кнопками рассмотрен
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32 прерывания NVIC и внешние прерывания.

Сообщение dosikus »

Очередная кухарка и только ...

Однако даже там кнопка висит не на EXTI, читай внимательней...
TmYAG
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн окт 14, 2013 21:39:47

Re: STM32 прерывания NVIC и внешние прерывания.

Сообщение TmYAG »

dosikus писал(а):Очередная кухарка и только ...

Однако даже там кнопка висит не на EXTI, читай внимательней...
http://ziblog.ru/2011/05/18/stm32-ndash ... yitiy.html ну вот получается еще одна кухарка.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32 прерывания NVIC и внешние прерывания.

Сообщение dosikus »

Ну ZiB явно не кухарка. :)))
Да и пример только поиграться, никакого практического применения...
TmYAG
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн окт 14, 2013 21:39:47

Re: STM32 прерывания NVIC и внешние прерывания.

Сообщение TmYAG »

dosikus писал(а):Ну ZiB явно не кухарка. :)))
Да и пример только поиграться, никакого практического применения...
Ну так и для меня попробовать. Понять как работает. Написать свой код и увидеть при отладке, что обработчик прерывания работает.
Поэтому я и хочу понять, что мне лучше изменить, чтобы увидеть как работают прерывания.
Почему нельзя вызывать прерывания по кнопке? Ведь внешние прерывания возникают при изменении состояния пина. Нажатие на кнопку чем не изменение?
Последний раз редактировалось TmYAG Вт окт 14, 2014 15:05:04, всего редактировалось 1 раз.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32 прерывания NVIC и внешние прерывания.

Сообщение dosikus »

TmYAG писал(а): и увидеть при отладке, что обработчик прерывания работает.
Выложить свой проект целиком, абы не гадалось ...
TmYAG писал(а): Нажатие на кнопку чем не изменение?
Обычный косяк нубов c кнопкой без pullup(pulldown) - думают если пин в воздухе то на нем стабильные 0 (1) .
А так же постоянно забывают про дребезг ...
TmYAG
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн окт 14, 2013 21:39:47

Re: STM32 прерывания NVIC и внешние прерывания.

Сообщение TmYAG »

Выложил. CMSIS исключил из архива, так как не загружалось.
Lesson 2. Blinking LED PushButton.zip
(536.11 КБ) 305 скачиваний
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32 прерывания NVIC и внешние прерывания.

Сообщение dosikus »

TmYAG поздно, собрал проект с твоим исходником - все работает .
Keil, STM32F4 дискаверина .

Изображение



TmYAG, мда , тебе надо с азов начинать .
Сперва научись сам проект создавать ...
Ответить

Вернуться в «ARM»