r44083 0 19 октября, 2015 Опубликовано 19 октября, 2015 (изменено) · Жалоба Здравствуйте, ситуация такая: использую 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 */ } Изменено 19 октября, 2015 пользователем r44083 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 19 октября, 2015 Опубликовано 19 октября, 2015 · Жалоба Думаю, это неправильное желание. Аккуратнее, чем NVIC_EnableIRQ() можно сделать только битбангом. И то, не факт, что оно лучше будет (наверное, даже хуже - ядро будет делать read-modify-write, вместо записи одного бита). И смысл тогда этого велосипеда, если он будет такой же, только нестандартный? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
r44083 0 19 октября, 2015 Опубликовано 19 октября, 2015 · Жалоба Думаю, это неправильное желание. Аккуратнее, чем NVIC_EnableIRQ() можно сделать только битбангом. И то, не факт, что оно лучше будет (наверное, даже хуже - ядро будет делать read-modify-write, вместо записи одного бита). И смысл тогда этого велосипеда, если он будет такой же, только нестандартный? Я понимаю что вы хотите мне сказать, но мною движет желание сделать код более прозрачным. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RadiatoR 2 19 октября, 2015 Опубликовано 19 октября, 2015 (изменено) · Жалоба а разве с функцией NVIC_EnableIRQ(SPI1_IRQn) он стал менее прозрачным? Даже если вы доведете до вида NVIC->ISER[1] |= (1 << (SPI1_IRQn & 0x1F)); запись понятней не станет Изменено 19 октября, 2015 пользователем ЯadiatoR Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 38 19 октября, 2015 Опубликовано 19 октября, 2015 · Жалоба Прозрачнее дальше некуда: LDR R0, =NVIC_BASE_ADDRSS LDR R1, =(ID25_IRQ | ID21_IRQ | ID15_IRQ) STR R1, [R0, #REG_NVIC_ISER0]// в ядре разрешены прерывания от TC0_Ch2, SPI и USART1_SPImode Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 19 октября, 2015 Опубликовано 19 октября, 2015 · Жалоба а разве с функцией NVIC_EnableIRQ(SPI1_IRQn) он стал менее прозрачным? Даже если вы доведете до вида NVIC->ISER[1] |= (1 << (SPI1_IRQn & 0x1F)); запись понятней не станет Вот-вот, не надо NVIC_EnableIRQ() переписывать. Потому что в NVIC->ISER[1] |= (1 << (SPI1_IRQn & 0x1F)); уже есть ошибка. При дальнейшем увеличении прозрачности количество ошибок будет только расти... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 19 октября, 2015 Опубликовано 19 октября, 2015 · Жалоба Посмотрите в 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. О, я и не заметил, что уже в вопросе есть ответ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 19 октября, 2015 Опубликовано 19 октября, 2015 · Жалоба Посмотрите в core_cm3.h, и увидите, что проще сделать невозможно. Можно сдвиг заменить на деление, а побитовое И - на остаток от деления. Кому-то, может быть, и станет нагляднее, но если имеешь дело с Си и впадаешь в ступор от битовых операций, то лучше или сменить род занятий, или подучить Си. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
r44083 0 19 октября, 2015 Опубликовано 19 октября, 2015 · Жалоба Ок, я понял. Всем спасибо. Буду использовать функцию из CMSIS. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться