Перейти к содержанию
    

М3/М4 - как сделать трюк с прерываниями?

Или можно просто после всех инициализаций, которые у меня есть сейчас, написать:

        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        NVIC_SetPriority(SPI2_IRQn,                1);  //    SPI priority=1
        NVIC_SetPriority(EXTI15_10_IRQn,       2);  //    SW interrupt priority=2
        NVIC_SetPriority(USART3_IRQn_IRQn,  3);  //    UART=3
        NVIC_SetPriority(SysTick_IRQn,            4);  //    SysTick priority=4

Можно так и написать.

Странно что приоритеты не от 0 задаёте (0 - умолчание), а от 1.

 

Нужно вызвать NVIC_PriorityGroupConfig с соответствующим параметром (например 0 - отмена групп).

 

 

Т.е. если я хочу чтобы прерывание с более высоким приоритетом прерывало прерывание с более низким, они обязательно долдны быть в разных группах?

 

 

А если они из одной группы, и выполняется прерывание с бОльшим номером подгруппы (т.е. менее приоритетное), то прерывание той-же группы с меньшим номером (по идее более приоритетное) его не прервет?

Прерывания одного приритета друг друга не могут прервать. исполняемое прерывание может быть прервано только более приоритетным.

 

 

Т.е. если в момент выполнения высокоприоритетного прерывания возникает другое, менее приоритетное, то оно подождет и будет выполнено после

Подождёт.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть ещё удобная функция

uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority)

 

Я обычно делаю так:

где-то в начале задаю группировку:

NVIC_SetPriorityGrouping(5); // 2 bit preemption (0..3), 2 bit of subprio (0..3)

 

И по месту, при настройке нужного прерывания:

NVIC_SetPriority(SPI2_IRQn,
    NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 1, 2));

- задаёт приоритет с preemtion priority = 1 и subpriority = 2.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Понятно, вначале я включаю приоритеты вызовом NVIC_PriorityGroupConfig() с ненулевым аргументом.

Далее надо ля каждого прерывания расставить приоритет.

Если я это делаю при инициализации соотв. прерывания, при заполнении структуры:

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0F;

 

то как я понимаб, потом уже не нужно делать для каждого NVIC_SetPriority - оно может понадобиться только если я захочу изменить приоритет, так?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Понятно, вначале я включаю приоритеты вызовом NVIC_PriorityGroupConfig() с ненулевым аргументом.

Можно и нулём , тогда в SBC->AIRCR поле PRIGGRUP станет равным 0.

 

 

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0F;

Это в ST-шной либе такие структуры? Страшно выглядят...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это в ST-шной либе такие структуры? Страшно выглядят...

:)

Это Вы ещё вычисление BRR в USART_Init() не видели...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Страшно выглядят...
Зажмуриваемся и используем:-)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...