vlad_new 1 27 августа, 2013 Опубликовано 27 августа, 2013 · Жалоба Перетаскиваю огромный проект с F3 на F4. Обновил KEIL. Старый проект был написан в кейловском стиле и c его визартами. Теперь приходится все переводить на стандартные библиотеки. И вот с приоритетами я тут здорово засел. У меня используется 8 вытисняющик друг друга приоритетов. Делал все вроде как по описанию, а получается все как то наоборот. Объясните плиз, как все же правильно задавать, к примеру, 15 вытисняющих приоритетов: NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3); Это вроде как схема разделения групп и подгруп. Вот так я получу свои 15 приоритетов? И что тогда здесь указывать? NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = ???; NVIC_InitStructure.NVIC_IRQChannelSubPriority = ???; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); И еще. В новом кейле, (в режиме отладки) окно Nested Vectored Interrupt Controller (NVIC) в поле Pryority показывает номера от 0 до 255. Раньше было от 0 до 15. Это меня совсем в тупик завело. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 4 27 августа, 2013 Опубликовано 27 августа, 2013 · Жалоба В файле misc.c всё подробно расписано. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexandrY 3 27 августа, 2013 Опубликовано 27 августа, 2013 · Жалоба И еще. В новом кейле, (в режиме отладки) окно Nested Vectored Interrupt Controller (NVIC) в поле Pryority показывает номера от 0 до 255. Раньше было от 0 до 15. Это меня совсем в тупик завело. У STM32F4 выделено всего 4-е бита из 8-и возможных на приоритеты. Поэтому 16-и уровней приоритета добиться невозможно. Можно только 8 уровней (3-и бита на приоритет) и один бит на субприоритет если в регистре ядра SCB->AIRCR будет 0. А 256 вместо 16 стало потому, что раньше приоритеты показывали как 32-х разрядные слова, а теперь как 8-и разрядные. Типа обнаружили, что к тем словам можно побайтово обращаться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 27 августа, 2013 Опубликовано 27 августа, 2013 · Жалоба У STM32F4 выделено всего 4-е бита из 8-и возможных на приоритеты. Поэтому 16-и уровней приоритета добиться невозможно. Пишут что можно: 9.1.1 NVIC fe atures The nested vector interrupt controller NVIC includes the following features: ● 87 maskable interrupt channels (not including the 16 interrupt lines of Cortex™-M4F) ● 16 programmable priority levels (4 bits of interrupt priority are used) Можно только 8 уровней (3-и бита на приоритет) и один бит на субприоритет если в регистре ядра SCB->AIRCR будет 0.Если четыре бита на приоритет и 0 на субприоритет, то получится - 16. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexandrY 3 27 августа, 2013 Опубликовано 27 августа, 2013 · Жалоба Насколько следует из "Cortex™-M4 Devices Generic User Guide" p. 4-18 установить субприоритет меньше одного бита нельзя. Хотя согласен, 4-е младших бита байта приоритета всегда в нуле, и под субприоритет при некоторых значениях SCB->AIRCR может не быть выделено ни одного бита с доступом на запись (т.е. там будут нули). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vlad_new 1 28 августа, 2013 Опубликовано 28 августа, 2013 · Жалоба Тогда так: NVIC_PriorityGroup_0 - вытисняющих приоритетов нет. NVIC_PriorityGroup_4 - вроде то же не безопасно применять. В 3 ядре с этим были проблеммы. Ну не удается урвать 15 уровней, ну и фиг с ним. Значит, если я правильно понял, остается NVIC_PriorityGroup_3 (8 вытисняющих приоритета в 2 группах). Тогда в NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority я должен указывать приоритет от 0 до 7, а в NVIC_InitStructure.NVIC_IRQChannelSubPriority указывать всегда 0 или 1. Так будут работать 8 вытисняющих уровней? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexandrY 3 28 августа, 2013 Опубликовано 28 августа, 2013 · Жалоба Тогда так: NVIC_PriorityGroup_0 - вытисняющих приоритетов нет. NVIC_PriorityGroup_4 - вроде то же не безопасно применять. В 3 ядре с этим были проблеммы. Ну не удается урвать 15 уровней, ну и фиг с ним. Значит, если я правильно понял, остается NVIC_PriorityGroup_3 (8 вытисняющих приоритета в 2 группах). Тогда в NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority я должен указывать приоритет от 0 до 7, а в NVIC_InitStructure.NVIC_IRQChannelSubPriority указывать всегда 0 или 1. Так будут работать 8 вытисняющих уровней? Да, интересно где бы найти окончательную ясность. В документации от ARM на Cortex-M4 четко сказано, что если регистр NVIC->IPR как-то изменяется у производителей, то только занулением младших бит. А поскольку установка группы начинается от младших бит, то первые четыре установки группировки в регистре SCB->AIRCR (NVIC_PriorityGroup_0..NVIC_PriorityGroup_3) не производят никакого эффекта. Субприоритеты в этом случае установить невозможно, а уровней вытесняющих приоритетов по прежнему будет 16. Но сейчас вижу, что в BSP от уважаемой фирмы Freescale все равно считают, что под вытесняющие приоритеты есть только 3-и бита. Так словно младшие биты смещаются влево в регистре NVIC->IPR на 4-е позиции. Или программисты в солидных фирмах не просекли разницу в программировании поля PRIGROUP регистра SCB->AIRCR между Cortex-M3 и Cortex-M4 ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться