Перейти к содержанию
    

STM32 StdPeriph Driver

Господа, объясните пожалуйста, это я дурак или этот код в принципе неработоспособен?

 

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, все приоритеты автоматически получаются нулями.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

SCB->AIRCR по умолчанию равен 0xFA500000

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

 

[31:16] VECTKEYSTAT Reads as 0xFA05.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, извиняюсь за опечатку. Впрочем, это константа, чтобы при случайном доступе не повредить данные; в данном случае нам вообще без разницы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

SCB->AIRCR по умолчанию равен 0xFA500000, и tmppre автоматически принимает какое-то безумное значение.
Почему? На значение SCB->AIRCR накладывается маска 0x700, далее результат вычитается из 0x700 и сдвигается на 8 разрядов. В tmppriority оказывается число от 0 до 7. Не вижу криминала.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...