реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> STM32 StdPeriph Driver, очередной лучик ненависти
esaulenka
сообщение Apr 3 2014, 08:38
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



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

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


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
Aleksandr Barano...
сообщение Apr 3 2014, 09:41
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 169
Регистрация: 31-08-05
Из: New York
Пользователь №: 8 118



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

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

[31:16] VECTKEYSTAT Reads as 0xFA05.


--------------------
ASB
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Apr 3 2014, 09:59
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



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


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 3 2014, 10:25
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(esaulenka @ Apr 3 2014, 10:38) *
SCB->AIRCR по умолчанию равен 0xFA500000, и tmppre автоматически принимает какое-то безумное значение.
Почему? На значение SCB->AIRCR накладывается маска 0x700, далее результат вычитается из 0x700 и сдвигается на 8 разрядов. В tmppriority оказывается число от 0 до 7. Не вижу криминала.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Apr 3 2014, 11:34
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Криминал здесь:
Код
uint8_t tmppre = 0x00;
...
tmppre = (0x4 - tmppriority);


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
kan35
сообщение Apr 6 2014, 12:18
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594



Полагаю, что tmppriority на данном этапе лежит в диапазоне от 0 до 4.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 21:54
Рейтинг@Mail.ru


Страница сгенерированна за 0.01372 секунд с 7
ELECTRONIX ©2004-2016