Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32 StdPeriph Driver
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
esaulenka
Господа, объясните пожалуйста, это я дурак или этот код в принципе неработоспособен?

Код
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
Цитата(esaulenka @ Apr 3 2014, 03:38) *
SCB->AIRCR по умолчанию равен 0xFA500000

Я только что прочел, что:

[31:16] VECTKEYSTAT Reads as 0xFA05.
esaulenka
Да, извиняюсь за опечатку. Впрочем, это константа, чтобы при случайном доступе не повредить данные; в данном случае нам вообще без разницы.
Сергей Борщ
Цитата(esaulenka @ Apr 3 2014, 10:38) *
SCB->AIRCR по умолчанию равен 0xFA500000, и tmppre автоматически принимает какое-то безумное значение.
Почему? На значение SCB->AIRCR накладывается маска 0x700, далее результат вычитается из 0x700 и сдвигается на 8 разрядов. В tmppriority оказывается число от 0 до 7. Не вижу криминала.
esaulenka
Криминал здесь:
Код
uint8_t tmppre = 0x00;
...
tmppre = (0x4 - tmppriority);
kan35
Полагаю, что tmppriority на данном этапе лежит в диапазоне от 0 до 4.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.