Jump to content

    

Прерывания в STM32

Как известно для групирования прерываний в STM32 заведено 5 вариантов группирования (pre-emption и subpriority). В SCB->AIRCR это выражается значениями поля PRIGROUP от 3 до 7, а при старте проца в этом регистре как бы невалидное значение 0. Это значит что прерывания не разделены и то же самое что все прерывания pre-emption (в терминах STM32 - NVIC_PriorityGroup_4)?

 

Share this post


Link to post
Share on other sites

Из отсутствующих (младших) битов приоритета читаются нули. Поэтому при дефолтном нуле в SCB->AIRCR имеем 4 бита (16 уровней) preemption и ноль уровней subpriority.

Share this post


Link to post
Share on other sites
Из отсутствующих (младших) битов приоритета читаются нули. Поэтому при дефолтном нуле в 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, то в общем то так же все и работает, просто не понятно почему так, а не начиная с НУЛЯ сделали?

Share this post


Link to post
Share on other sites

Ноль работает точно так же, как и NVIC_PriorityGroup_4.

Эти вещи общие для всего семейства Cortex-M3. То есть, дальше идут NVIC_PriorityGroup_5, NVIC_PriorityGroup_6 и NVIC_PriorityGroup_7.

Ноль - это NVIC_PriorityGroup_7. Но, поскольку STM32 значащие биты приоритета заканчиваются на NVIC_PriorityGroup_4, то все остальные варианты аналогичны NVIC_PriorityGroup_4.

Share this post


Link to post
Share on other sites

AHTOXA, спасибо!

 

И вот еще пара вопрос по теме прерываний:

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

 

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

Share this post


Link to post
Share on other sites
Группы вытесняющих прерываний могут вытеснять друг друга, это значит, что во время обработки одного прерывания возникает другое с высшим приоритетом, то оно вытесняет первое?

Да.

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

Да. Субприоритет важен только при одновременном возникновении прерываний. Скажем, два прерывания одной группы возникли одновременно (или не одновременно, но в то время, пока выполняется какое-то более приоритетное прерывание). Вот в этом случае порядок выполнения этих двух прерываний определяется субприортетом.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this