diff --git a/Vsrc/SM_Sys.c b/Vsrc/SM_Sys.c index 5b65396..a171d63 100644 --- a/Vsrc/SM_Sys.c +++ b/Vsrc/SM_Sys.c @@ -127,7 +127,19 @@ void SM_Sys_Init(TSM_Sys *p) { extern int *g_pfnVectors; SCB->VTOR = (uint32_t) (&g_pfnVectors); #endif - NVIC_SetPriorityGrouping(3); // 4 bit preemption, 0 bit of subprio + + /* + У микроконтроллера К1921ВК028 производителем заложено 4 бита из 8-ми битного поля PRI_n [7:0] для настройки приоритетов прерываний и + задается это в стандартном армовском макросе __NVIC_PRIO_BITS. Получается, что младшие биты [3:0] не используются и для настройки + предназначены только биты [7:4]. В зависимосоти от другого параметра PRIGROUP мы можем сказать как использовать эти 4 бита, сколько бит из 4-х + отвести под группы, а сколько под подгруппы, т.е. как бы ставя разделяющую точку, где часть справа от точки кодирует подгруппу, а левая - группу. + Если PRIGROUP = 0, то поле PRI_n интерпритируется как 0bxxxxxxxx, где x - биты задания уровня приоритета групп. Если PRIGROUP = 3, то поле PRI_n + интерпритируется как 0bxxxx.yyyy, где x - биты задания уровня приоритета групп, y - биты задания уровня приоритета подгрупп. И т.д. + Выходит, что задание PRIGROUP от 0 до 3 будет иметь один и тот же результат, отсавляя во всех этих случаях 4 бита под группу и 0 под подгруппу + (не забываем, что у нас используются только 4 крайних слева бита поля PRI_n, т.е. биты [7:4]), когда как PRIGROUP от 4 до 7 уже будет иметь влияние + на соотношения между максимальным возможным количеством групп и подгрупп. + */ + NVIC_SetPriorityGrouping(3); // 4 бита под группу, 0 под подгруппу. После этого мы можем передавать аргумент priority в функцию NVIC_SetPriority от 0 до 15 для задания уровня приоритета прерывания. 0 - наивысший, 15 - самый низкий приоритет. NVIC_DisableIRQ(TMR0_IRQn); NVIC_DisableIRQ(TMR1_IRQn);