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

 
 
> STM32F207 - проблемы с bitband при доступе к EXTI->PR
Непомнящий Евген...
сообщение Jul 1 2015, 04:33
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Есть код, который использует внешние прерывания. Примерно такой
CODE
template<class T>
constexpr T* bitbandAddr(T *addr, unsigned bit); // возвращает адрес в bitband-области для адреса addr и бита bit

struct ExternalInterrupt {
unsigned no;
// ...
static bool checkIfInterrupt(unsigned no) { return *bitbandAddr(&EXTI->PR, no); }

bool checkIfInterruptAndClear() {
bool r = checkIfInterrupt(no);
if ®
*bitbandAddr(&EXTI->PR, no) = 1;
return r;
}
};

extern "C" void EXTI9_5_IRQHandler() {
/* 1 */
for (unsigned i = 5; i < 10; ++i)
if (ExternalInterrupt::checkIfInterrupt(i))
interrupts.exti[i].fire(); // вызов коллбэка, если он есть
}

void onIntA() { // этот коллбэк связан с interrupts.exti[8]
if (ei[0].checkIfInterruptAndClear()) {
/* 2 */
}
}

void onIntB() { // этот коллбэк связан с interrupts.exti[9]
if (ei[1].checkIfInterruptAndClear()) {
/* 3 */
}
}


Оба прерывания настроены на изменение фронта на входе.

По факту иногда код пропускает изменение фронта. Сделал инвертирование контролек в некоторых местах, оказалось что иногда в /* 1 */ оно попадает, а в /* 2 */ или /* 3 */ - нет.

Переписал функции checkIfInterruptXXX без использования bitband (и больше ничего не трогал) - все стало хорошо. Регистр EXTI->PR типа rc_w1 (чтение, сброс бита записью 1). bitband тут собственно не нужен, поставил в свое время по инерции. Но не ясно, почему с ним работает как-то избирательно.

Никто с подобным не сталкивался?

Сообщение отредактировал IgorKossak - Jul 1 2015, 06:01
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Непомнящий Евгений   STM32F207 - проблемы с bitband при доступе к EXTI->PR   Jul 1 2015, 04:33
- - Golikov A.   возможно для битбанга нужно барьеров напихать?   Jul 1 2015, 04:41
|- - Непомнящий Евгений   Цитата(Golikov A. @ Jul 1 2015, 07:41) во...   Jul 1 2015, 04:58
|- - adnega   Цитата(Непомнящий Евгений @ Jul 1 2015, 07...   Jul 1 2015, 06:03
|- - Непомнящий Евгений   Цитата(adnega @ Jul 1 2015, 09:03) Мне вс...   Jul 1 2015, 06:31
||- - adnega   Цитата(Непомнящий Евгений @ Jul 1 2015, 09...   Jul 3 2015, 04:14
|- - LightElf   QUOTE (adnega @ Jul 1 2015, 09:03) Мне вс...   Jul 1 2015, 06:54
- - Golikov A.   ну да скорее всего... вместо записи 1 бита вы все...   Jul 1 2015, 06:55
- - Golikov A.   а регистра поставить бит, снять бит для портов нет...   Jul 3 2015, 05:16
|- - adnega   Цитата(Golikov A. @ Jul 3 2015, 08:16) а ...   Jul 3 2015, 05:35
- - Golikov A.   Чем удобнее? Макросом через дефайн не решается?   Jul 3 2015, 08:21
|- - adnega   Цитата(Golikov A. @ Jul 3 2015, 11:21) Че...   Jul 3 2015, 08:29
- - Golikov A.   Обычно дефайнами, так как пины обычно дергаю рукам...   Jul 3 2015, 10:06
|- - Непомнящий Евгений   Цитата(Golikov A. @ Jul 3 2015, 13:06) По...   Jul 3 2015, 10:29
|- - adnega   Цитата(Непомнящий Евгений @ Jul 3 2015, 13...   Jul 3 2015, 17:28
- - Golikov A.   ну в этом случае вам одного адреса не хватит, ведь...   Jul 3 2015, 10:45


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

 


RSS Текстовая версия Сейчас: 27th June 2025 - 20:40
Рейтинг@Mail.ru


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