esaulenka 7 3 апреля, 2014 Опубликовано 3 апреля, 2014 · Жалоба Господа, объясните пожалуйста, это я дурак или этот код в принципе неработоспособен? void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct) { uint8_t tmppriority = 0x00, tmppre = 0x00, tmpsub = 0x0F; /* Check the parameters */ assert_param(IS_FUNCTIONAL_STATE(NVIC_InitStruct->NVIC_IRQChannelCmd)); assert_param(IS_NVIC_PREEMPTION_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority)); assert_param(IS_NVIC_SUB_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelSubPriority)); if (NVIC_InitStruct->NVIC_IRQChannelCmd != DISABLE) { /* Compute the Corresponding IRQ Priority --------------------------------*/ tmppriority = (0x700 - ((SCB->AIRCR) & (uint32_t)0x700))>> 0x08; tmppre = (0x4 - tmppriority); tmpsub = tmpsub >> tmppriority; tmppriority = NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority << tmppre; tmppriority |= (uint8_t)(NVIC_InitStruct->NVIC_IRQChannelSubPriority & tmpsub); tmppriority = tmppriority << 0x04; NVIC->IP[NVIC_InitStruct->NVIC_IRQChannel] = tmppriority; /* Enable the Selected IRQ Channels --------------------------------------*/ NVIC->ISER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] = (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F); } else { /* Disable the Selected IRQ Channels -------------------------------------*/ NVIC->ICER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] = (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F); } } SCB->AIRCR по умолчанию равен 0xFA500000, и tmppre автоматически принимает какое-то безумное значение. Далее все tmppriority становятся огромными и не влезают в uint8_t, все приоритеты автоматически получаются нулями. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aleksandr Baranov 1 3 апреля, 2014 Опубликовано 3 апреля, 2014 · Жалоба SCB->AIRCR по умолчанию равен 0xFA500000 Я только что прочел, что: [31:16] VECTKEYSTAT Reads as 0xFA05. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 3 апреля, 2014 Опубликовано 3 апреля, 2014 · Жалоба Да, извиняюсь за опечатку. Впрочем, это константа, чтобы при случайном доступе не повредить данные; в данном случае нам вообще без разницы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 3 апреля, 2014 Опубликовано 3 апреля, 2014 · Жалоба SCB->AIRCR по умолчанию равен 0xFA500000, и tmppre автоматически принимает какое-то безумное значение.Почему? На значение SCB->AIRCR накладывается маска 0x700, далее результат вычитается из 0x700 и сдвигается на 8 разрядов. В tmppriority оказывается число от 0 до 7. Не вижу криминала. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 3 апреля, 2014 Опубликовано 3 апреля, 2014 · Жалоба Криминал здесь: uint8_t tmppre = 0x00; ... tmppre = (0x4 - tmppriority); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kan35 7 6 апреля, 2014 Опубликовано 6 апреля, 2014 · Жалоба Полагаю, что tmppriority на данном этапе лежит в диапазоне от 0 до 4. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться