Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Прерывания в STM32
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
kan35
Как известно для групирования прерываний в STM32 заведено 5 вариантов группирования (pre-emption и subpriority). В SCB->AIRCR это выражается значениями поля PRIGROUP от 3 до 7, а при старте проца в этом регистре как бы невалидное значение 0. Это значит что прерывания не разделены и то же самое что все прерывания pre-emption (в терминах STM32 - NVIC_PriorityGroup_4)?
AHTOXA
Из отсутствующих (младших) битов приоритета читаются нули. Поэтому при дефолтном нуле в SCB->AIRCR имеем 4 бита (16 уровней) preemption и ноль уровней subpriority.
kan35
Цитата(AHTOXA @ Dec 27 2010, 15:08) *
Из отсутствующих (младших) битов приоритета читаются нули. Поэтому при дефолтном нуле в SCB->AIRCR имеем 4 бита (16 уровней) preemption и ноль уровней subpriority.

Код
#define NVIC_PriorityGroup_0         ((uint32_t)0x700) /*!< 0 bits for pre-emption priority
                                                            4 bits for subpriority */
#define NVIC_PriorityGroup_1         ((uint32_t)0x600) /*!< 1 bits for pre-emption priority
                                                            3 bits for subpriority */
#define NVIC_PriorityGroup_2         ((uint32_t)0x500) /*!< 2 bits for pre-emption priority
                                                            2 bits for subpriority */
#define NVIC_PriorityGroup_3         ((uint32_t)0x400) /*!< 3 bits for pre-emption priority
                                                            1 bits for subpriority */
#define NVIC_PriorityGroup_4         ((uint32_t)0x300) /*!< 4 bits for pre-emption priority
                                                            0 bits for subpriority */

Я имею в виду, что все варианты - это не НУЛИ. А при старте в SCB->AIRCR - НОЛЬ. наеврное я торможу, не понимаю.
Ну когда я назначаю например NVIC_PriorityGroup_4, то в общем то так же все и работает, просто не понятно почему так, а не начиная с НУЛЯ сделали?
AHTOXA
Ноль работает точно так же, как и NVIC_PriorityGroup_4.
Эти вещи общие для всего семейства Cortex-M3. То есть, дальше идут NVIC_PriorityGroup_5, NVIC_PriorityGroup_6 и NVIC_PriorityGroup_7.
Ноль - это NVIC_PriorityGroup_7. Но, поскольку STM32 значащие биты приоритета заканчиваются на NVIC_PriorityGroup_4, то все остальные варианты аналогичны NVIC_PriorityGroup_4.
kan35
AHTOXA, спасибо!

И вот еще пара вопрос по теме прерываний:
Группы вытесняющих прерываний могут вытеснять друг друга, это значит, что во время обработки одного прерывания возникает другое с высшим приоритетом, то оно вытесняет первое?

А если прерывание возникло из той же группы, что первое прерывание, то новое, даже с более высоким sub-приоритеторм начнет обрабатываться только после того как текущее закончит обрабатываться?
AHTOXA
Цитата(kan35 @ Dec 27 2010, 20:51) *
Группы вытесняющих прерываний могут вытеснять друг друга, это значит, что во время обработки одного прерывания возникает другое с высшим приоритетом, то оно вытесняет первое?

Да.
Цитата
А если прерывание возникло из той же группы, что первое прерывание, то новое, даже с более высоким sub-приоритеторм начнет обрабатываться только после того как текущее закончит обрабатываться?

Да. Субприоритет важен только при одновременном возникновении прерываний. Скажем, два прерывания одной группы возникли одновременно (или не одновременно, но в то время, пока выполняется какое-то более приоритетное прерывание). Вот в этом случае порядок выполнения этих двух прерываний определяется субприортетом.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.