STM32 прерывания NVIC и внешние прерывания.
STM32 прерывания NVIC и внешние прерывания.
Здравствуйте! Помогите пожалуйста разобраться с прерываниями. Вернее с тем как их настраивать используя только 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. Отсюда и возникли вопросы.
Мой девайс 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 и внешние прерывания.
А Вы тут не смотрели ? http://eugenemcu.ru/publ/13-1-0-76TmYAG писал(а):Здравствуйте! Помогите пожалуйста разобраться с прерываниями. Вернее с тем как их настраивать используя только CMSIS.
Re: STM32 прерывания NVIC и внешние прерывания.
Как раз оттуда и пришел) Там разжевано, но некоторые моменты лично мне показались неясными. Поэтому решил уточнить тут на форуме.amv2000 писал(а):А Вы тут не смотрели ? http://eugenemcu.ru/publ/13-1-0-76TmYAG писал(а):Здравствуйте! Помогите пожалуйста разобраться с прерываниями. Вернее с тем как их настраивать используя только CMSIS.
Re: STM32 прерывания NVIC и внешние прерывания.
Для начала надо осознать что NVIC это ядро а EXTI периферия и не* мешать мух с котлетами ...TmYAG писал(а): Для структуризации разделю свои вопросы на две части по внутренним прерываниям и по внешним.
Логичнее начать с внутренних.
EXTI можно осознать как простой мультиплексор с выводом сигнала к NVIC.
Вообще-то NVIC_EnableIRQ(IRQ), NVIC_SetPriority и остальные - это не SPL это HAL от CMSIS .TmYAG писал(а): Разрешение прерываний. С функцией NVIC_EnableIRQ(IRQ) все понятно, просто запихнуть в ее аргумент нужный обработчик.
Вопрос как разрешить прерывания с использованием регистров.
Смысл их переписывать? Если интересно их устройство, для F4 смотри core_cm4.h...
Последний раз редактировалось dosikus Пн окт 13, 2014 14:39:14, всего редактировалось 1 раз.
- amv2000
- Опытный кот
- Сообщения: 723
- Зарегистрирован: Вт апр 26, 2011 13:58:36
- Откуда: Ростовская область
Re: STM32 прерывания NVIC и внешние прерывания.
Я поэтому у TmYAG и спрашивал читали по ссылке, там же явно указаноdosikus писал(а):"Вообще-то NVIC_EnableIRQ(IRQ), NVIC_SetPriority и остальные - это не SPL это HAL от CMSIS .
Смысл их переписывать? Если интересно их устройство, для F4 смотри core_cm4.h...
Функции 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 и внешние прерывания.
Ну если честно, то я нигде и не писал, что вышеперечисленные функции относятся к SPL.dosikus писал(а): Вообще-то NVIC_EnableIRQ(IRQ), NVIC_SetPriority и остальные - это не SPL это HAL от CMSIS .
Смысл их переписывать? Если интересно их устройство, для F4 смотри core_cm4.h...
Что касается устройства функций, то я их смотрел. Отсюда и вопросы.
Если быть конкретнее, то меня интересует как в регистре ISER указывается информация о разрешении тому или иному периферийному блоку вызывать прерывания. Как в ISER передать инфу, что я хочу разрешить прерывания от USART, DAC или еще чего. ISER целых три штуки. Какой из них соответствует нужной мне периферии. Как это увидеть?
Не говоря уже про вопросы с приоритетами и подгруппами.
Re: STM32 прерывания NVIC и внешние прерывания.
Ищите и обрящите ...
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
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 и внешние прерывания.
посмотреть RM, пункт Nested vectored interrupt controller (NVIC)ISER целых три штуки. Какой из них соответствует нужной мне периферии. Как это увидеть?
смотрим: например для 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 и внешние прерывания.
Спасибо большое! С этим разобрался!!!oleg110592 писал(а):посмотреть RM, пункт Nested vectored interrupt controller (NVIC)ISER целых три штуки. Какой из них соответствует нужной мне периферии. Как это увидеть?
смотрим: например для 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 и внешние прерывания.
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 */
}Тут надобно не только читать, но и пробовать на конкретном примере. Без обид ибо сам долго въезжал.
Re: STM32 прерывания NVIC и внешние прерывания.
Вот наваял код, для включения по нажатию кнопки светодиодов.
Но почему-то прерывание не срабатывает((( После нажатия висит.
Код: Выделить всё
#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 и внешние прерывания.
TmYAG, EXTI не для кнопок , вбей это себе раз и навсегда ...
Re: STM32 прерывания NVIC и внешние прерывания.
http://microtechnics.ru/stm32f3-ispolzo ... reryvanij/
Вот тут пример с прерываниями и кнопками рассмотрен
Вот тут пример с прерываниями и кнопками рассмотрен
Re: STM32 прерывания NVIC и внешние прерывания.
Очередная кухарка и только ...
Однако даже там кнопка висит не на EXTI, читай внимательней...
Однако даже там кнопка висит не на EXTI, читай внимательней...
Re: STM32 прерывания NVIC и внешние прерывания.
http://ziblog.ru/2011/05/18/stm32-ndash ... yitiy.html ну вот получается еще одна кухарка.dosikus писал(а):Очередная кухарка и только ...
Однако даже там кнопка висит не на EXTI, читай внимательней...
Re: STM32 прерывания NVIC и внешние прерывания.
Ну ZiB явно не кухарка.
Да и пример только поиграться, никакого практического применения...
Да и пример только поиграться, никакого практического применения...
Re: STM32 прерывания NVIC и внешние прерывания.
Ну так и для меня попробовать. Понять как работает. Написать свой код и увидеть при отладке, что обработчик прерывания работает.dosikus писал(а):Ну ZiB явно не кухарка.![]()
Да и пример только поиграться, никакого практического применения...
Поэтому я и хочу понять, что мне лучше изменить, чтобы увидеть как работают прерывания.
Почему нельзя вызывать прерывания по кнопке? Ведь внешние прерывания возникают при изменении состояния пина. Нажатие на кнопку чем не изменение?
Последний раз редактировалось TmYAG Вт окт 14, 2014 15:05:04, всего редактировалось 1 раз.
Re: STM32 прерывания NVIC и внешние прерывания.
Выложить свой проект целиком, абы не гадалось ...TmYAG писал(а): и увидеть при отладке, что обработчик прерывания работает.
Обычный косяк нубов c кнопкой без pullup(pulldown) - думают если пин в воздухе то на нем стабильные 0 (1) .TmYAG писал(а): Нажатие на кнопку чем не изменение?
А так же постоянно забывают про дребезг ...
Re: STM32 прерывания NVIC и внешние прерывания.
Выложил. CMSIS исключил из архива, так как не загружалось.
Re: STM32 прерывания NVIC и внешние прерывания.
TmYAG поздно, собрал проект с твоим исходником - все работает .
Keil, STM32F4 дискаверина .

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

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


