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

Как правильно записать бит в регистр NVIC_ISER1?

Здравствуйте, ситуация такая: использую STM32F10x и хочу без использования функций CMSIS и StdPeriphLib разрешить прерывание от SPI1.

У SPI1_IRQn номер равный 35, следовательно я должен записать 1 во второй по счету регистр NVIC_ISER[1] в 4-ый бит (если считать с нуля). А так как SPI1_IRQn равен 35 (мы не можем сдвинуть 1 на 35 бит), то нам надо вычесть 32 из SPI1_IRQn (итого получается сдвигаем 1 на 3 бита и записываем это в регистр NVIC_ISER[1]).

Итак у меня получается запись такого вида:

 

NVIC->ISER[1] |= (1 << (SPI1_IRQn - 32 ));

 

Но это выглядит плохо читаемым и не универсальным. Может кто-нибудь посоветует как лучше такие вещи делать, что бы код стал более понятным?

 

В CMSIS например есть вот такая функция:

 

static __INLINE void NVIC_EnableIRQ(IRQn_Type IRQn)
{
  NVIC->ISER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* enable interrupt */
}

Изменено пользователем r44083

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


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

Думаю, это неправильное желание.

 

Аккуратнее, чем NVIC_EnableIRQ() можно сделать только битбангом. И то, не факт, что оно лучше будет (наверное, даже хуже - ядро будет делать read-modify-write, вместо записи одного бита).

И смысл тогда этого велосипеда, если он будет такой же, только нестандартный?

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


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

Думаю, это неправильное желание.

 

Аккуратнее, чем NVIC_EnableIRQ() можно сделать только битбангом. И то, не факт, что оно лучше будет (наверное, даже хуже - ядро будет делать read-modify-write, вместо записи одного бита).

И смысл тогда этого велосипеда, если он будет такой же, только нестандартный?

Я понимаю что вы хотите мне сказать, но мною движет желание сделать код более прозрачным.

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


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

а разве с функцией NVIC_EnableIRQ(SPI1_IRQn) он стал менее прозрачным?

Даже если вы доведете до вида NVIC->ISER[1] |= (1 << (SPI1_IRQn & 0x1F)); запись понятней не станет

Изменено пользователем ЯadiatoR

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


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

Прозрачнее дальше некуда:

LDR R0, =NVIC_BASE_ADDRSS

LDR R1, =(ID25_IRQ | ID21_IRQ | ID15_IRQ)

STR R1, [R0, #REG_NVIC_ISER0]// в ядре разрешены прерывания от TC0_Ch2, SPI и USART1_SPImode

 

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


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

а разве с функцией NVIC_EnableIRQ(SPI1_IRQn) он стал менее прозрачным?

Даже если вы доведете до вида NVIC->ISER[1] |= (1 << (SPI1_IRQn & 0x1F)); запись понятней не станет

Вот-вот, не надо NVIC_EnableIRQ() переписывать.

Потому что в

NVIC->ISER[1] |= (1 << (SPI1_IRQn & 0x1F));

уже есть ошибка. При дальнейшем увеличении прозрачности количество ошибок будет только расти...

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


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

Посмотрите в core_cm3.h, и увидите, что проще сделать невозможно.

static __INLINE void NVIC_EnableIRQ(IRQn_Type IRQn)
{
  NVIC->ISER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* enable interrupt */
}

Поэтому надо использовать. В отличие от StdPeriph_lib.

О, я и не заметил, что уже в вопросе есть ответ.

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


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

Посмотрите в core_cm3.h, и увидите, что проще сделать невозможно.

Можно сдвиг заменить на деление, а побитовое И - на остаток от деления. Кому-то, может быть, и станет нагляднее, но если имеешь дело с Си и впадаешь в ступор от битовых операций, то лучше или сменить род занятий, или подучить Си.

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


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

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

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

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

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

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

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

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

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

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