adnega 11 2 ноября, 2011 Опубликовано 2 ноября, 2011 · Жалоба Друзья, пока не дописал в main() NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4) долго мучился с очередями и прерываниями. Насколько это "не красиво"? PS.: FreeRTOSConfig.h: #define configKERNEL_INTERRUPT_PRIORITY (0xF0) #define configMAX_SYSCALL_INTERRUPT_PRIORITY (0xC0) init-usart: NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = (uint8_t)(configKERNEL_INTERRUPT_PRIORITY >> 4); NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1kvi1 0 4 ноября, 2011 Опубликовано 4 ноября, 2011 · Жалоба Можно более подробно - про уровни приоритетов прерываний? Как правильно инициализировать? Сделал как в примерах, но ничего не помогает... Который день мучаюсь с прерываниями первого последовательного порта в STM32L. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
diwil 0 4 ноября, 2011 Опубликовано 4 ноября, 2011 · Жалоба Можно более подробно - про уровни приоритетов прерываний? Как правильно инициализировать? Сделал как в примерах, но ничего не помогает... Который день мучаюсь с прерываниями первого последовательного порта в STM32L. значится так - для кортекса м3 - у котрекса наименьшему число соответствует больший приоритет. Приоритеты прерываний проца ось не использует. Поэтому если надо,чтобы прерывания использовали средства оси, то NVIC_IRQChannelPreemptionPriority должно быть больше max syscal prio оси сдвинутого на 4, ибо используются только старшие 4 бита значения. эти прерывания будут запрещаться осью. сли не надо - то меньше. эти прерывания не будут запрещаться осью, но и средства оси они использовать не могут, иначе ось виснет (я об это спотыкался). также надо чтобы была строчка NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4), чтобы не сильно менять определения приоритетов порта. Например у меня определено max syscal prio как 0xb0. Таймерные прерывания не используют средств оси, а лишь запускают SPI, поэтому у него NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0a. А SPI по окончании передачи шлет сообщение из прерывания, что данные приняты. Поэтому у него приоритет == 13 Приоритеты задач в самой оси никак не пересекаются с приоритетами прерываний и там чем число больше, тем приоритет выше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Altair 0 7 декабря, 2011 Опубликовано 7 декабря, 2011 · Жалоба также надо чтобы была строчка NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4), чтобы не сильно менять определения приоритетов порта. Я вот так сделал: #define AIRCR_VECTKEY_MASK ((uint32_t)0x05FA0000) /* Ensure that all 4 interrupt priority bits are used as the pre-emption priority. */ SCB->AIRCR = (AIRCR_VECTKEY_MASK | SCB_AIRCR_PRIGROUP_0 |SCB_AIRCR_PRIGROUP_1); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться