Артём__ 0 23 октября, 2012 Опубликовано 23 октября, 2012 · Жалоба Или можно просто после всех инициализаций, которые у меня есть сейчас, написать: 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 - отмена групп). Т.е. если я хочу чтобы прерывание с более высоким приоритетом прерывало прерывание с более низким, они обязательно долдны быть в разных группах? А если они из одной группы, и выполняется прерывание с бОльшим номером подгруппы (т.е. менее приоритетное), то прерывание той-же группы с меньшим номером (по идее более приоритетное) его не прервет? Прерывания одного приритета друг друга не могут прервать. исполняемое прерывание может быть прервано только более приоритетным. Т.е. если в момент выполнения высокоприоритетного прерывания возникает другое, менее приоритетное, то оно подождет и будет выполнено после Подождёт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 23 октября, 2012 Опубликовано 23 октября, 2012 · Жалоба Есть ещё удобная функция 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 23 октября, 2012 Опубликовано 23 октября, 2012 · Жалоба Понятно, вначале я включаю приоритеты вызовом NVIC_PriorityGroupConfig() с ненулевым аргументом. Далее надо ля каждого прерывания расставить приоритет. Если я это делаю при инициализации соотв. прерывания, при заполнении структуры: NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0F; то как я понимаб, потом уже не нужно делать для каждого NVIC_SetPriority - оно может понадобиться только если я захочу изменить приоритет, так? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 23 октября, 2012 Опубликовано 23 октября, 2012 · Жалоба Понятно, вначале я включаю приоритеты вызовом NVIC_PriorityGroupConfig() с ненулевым аргументом. Можно и нулём , тогда в SBC->AIRCR поле PRIGGRUP станет равным 0. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0F; Это в ST-шной либе такие структуры? Страшно выглядят... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 6 24 октября, 2012 Опубликовано 24 октября, 2012 · Жалоба Это в ST-шной либе такие структуры? Страшно выглядят... :) Это Вы ещё вычисление BRR в USART_Init() не видели... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 24 октября, 2012 Опубликовано 24 октября, 2012 · Жалоба Страшно выглядят...Зажмуриваемся и используем:-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться