Страница 1 из 3

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

Добавлено: Пн окт 13, 2014 10:44:48
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. Отсюда и возникли вопросы.

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

Добавлено: Пн окт 13, 2014 11:10:56
amv2000
TmYAG писал(а):Здравствуйте! Помогите пожалуйста разобраться с прерываниями. Вернее с тем как их настраивать используя только CMSIS.
А Вы тут не смотрели ? http://eugenemcu.ru/publ/13-1-0-76

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

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

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

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

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

Добавлено: Пн окт 13, 2014 18:40:13
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 самый низкий проритет.

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

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

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

Добавлено: Пн окт 13, 2014 20:15:28
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

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

Добавлено: Пн окт 13, 2014 20:43:38
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

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

Добавлено: Пн окт 13, 2014 20:52:39
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
Спасибо большое! С этим разобрался!!!

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

Добавлено: Пн окт 13, 2014 21:24:16
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 - наша периферия.
Тут надобно не только читать, но и пробовать на конкретном примере. Без обид ибо сам долго въезжал.

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

Добавлено: Вт окт 14, 2014 14:04:18
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++);

  }
}
Но почему-то прерывание не срабатывает((( После нажатия висит.

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

Добавлено: Вт окт 14, 2014 14:10:41
dosikus
TmYAG, EXTI не для кнопок , вбей это себе раз и навсегда ...

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

Добавлено: Вт окт 14, 2014 14:18:50
TmYAG
http://microtechnics.ru/stm32f3-ispolzo ... reryvanij/
Вот тут пример с прерываниями и кнопками рассмотрен

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

Добавлено: Вт окт 14, 2014 14:24:27
dosikus
Очередная кухарка и только ...

Однако даже там кнопка висит не на EXTI, читай внимательней...

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

Добавлено: Вт окт 14, 2014 14:33:12
TmYAG
dosikus писал(а):Очередная кухарка и только ...

Однако даже там кнопка висит не на EXTI, читай внимательней...
http://ziblog.ru/2011/05/18/stm32-ndash ... yitiy.html ну вот получается еще одна кухарка.

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

Добавлено: Вт окт 14, 2014 14:57:31
dosikus
Ну ZiB явно не кухарка. :)))
Да и пример только поиграться, никакого практического применения...

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

Добавлено: Вт окт 14, 2014 15:03:16
TmYAG
dosikus писал(а):Ну ZiB явно не кухарка. :)))
Да и пример только поиграться, никакого практического применения...
Ну так и для меня попробовать. Понять как работает. Написать свой код и увидеть при отладке, что обработчик прерывания работает.
Поэтому я и хочу понять, что мне лучше изменить, чтобы увидеть как работают прерывания.
Почему нельзя вызывать прерывания по кнопке? Ведь внешние прерывания возникают при изменении состояния пина. Нажатие на кнопку чем не изменение?

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

Добавлено: Вт окт 14, 2014 15:04:44
dosikus
TmYAG писал(а): и увидеть при отладке, что обработчик прерывания работает.
Выложить свой проект целиком, абы не гадалось ...
TmYAG писал(а): Нажатие на кнопку чем не изменение?
Обычный косяк нубов c кнопкой без pullup(pulldown) - думают если пин в воздухе то на нем стабильные 0 (1) .
А так же постоянно забывают про дребезг ...

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

Добавлено: Вт окт 14, 2014 15:17:07
TmYAG
Выложил. CMSIS исключил из архива, так как не загружалось.
Lesson 2. Blinking LED PushButton.zip
(536.11 КБ) 307 скачиваний

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

Добавлено: Вт окт 14, 2014 15:25:13
dosikus
TmYAG поздно, собрал проект с твоим исходником - все работает .
Keil, STM32F4 дискаверина .

Изображение



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