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

STM32F105 GPIO interrupts

Работаю с приемопередатчиком DW1000 и МК STM32F105RC. Приемопередатчик настроен таким образом ,что на отправку и прием сообщений он генерирует прерывание,которое поступает на PB5 микроконтроллера. Работаем по TDMA схеме, проблема в том,что МК видит прерывания каждые 60мс (прерывания по отправке синхросообщения), но при этом пропускает прерывания,которые генерирует микросхема на приеме. (к линии прерывания подключаемся логическим анализатором и видим,что эти прерывания идут четко после каждого синхросообщения). Однако в получение сообщения мы попадаем каждые 1-2с, а по идее должны попадать в промежутке из 60мс.  Обработчик прерывания составляет из себя чтение регистров приемопередатчика с последующим определением,что вызвало прерывание.

Таким образом на одном и том же пине вижу стабильные прерывания по отправке, но прерывания,которые генерирует приемопередатчик по приему,пропускаются. В коде есть только один запрет на прием прерываний,в момент записи и чтения регистров по SPI. Однако это происходит только в момент обработки прерывания, SPI работает на скорости 8МГц, если верить системному таймеру общее время работы прерывания меньше 1мс. Те это не должно влиять на прерывание,которое идет через несколько мс.

На всякий случай выкладываю код инициализации

	GPIO_InitTypeDef GPIO_InitStructure;
	EXTI_InitTypeDef EXTI_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	// Enable GPIO used as DECA IRQ for interrupt
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
	GPIO_InitStructure.GPIO_Mode = 	GPIO_Mode_IPD;	//IRQ pin should be Pull Down to prevent unnecessary EXT IRQ while DW1000 goes to sleep mode
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(DECAIRQ_GPIO, &GPIO_InitStructure);

	/* Connect EXTI Line to GPIO Pin */
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource5);

	/* Configure EXTI line */
	EXTI_InitStructure.EXTI_Line = EXTI_Line5;
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;	//MPW3 IRQ polarity is high by default
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
	EXTI_Init(&EXTI_InitStructure);

	/* Set NVIC Grouping to 16 groups of interrupt without sub-grouping */
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);

	/* Enable and set EXTI Interrupt to the lowest priority */
	NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 15;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

	NVIC_Init(&NVIC_InitStructure);

int.thumb.jpg.47bf01dc6465ed666fcf05c8b37eea7c.jpg

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


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

В порядке эксперимента предлагаю добавить во все (!) обработчики прерываний код "на входе установили ножку в единичку, на выходе в ноль" и посмотреть анализатором. Ну и в критическую секцию аналогично.

Ещё одной ножкой хорошо б отображать вход-выход в обработчик EXTI.

 

Чудес не бывает. Сталкивался с "чудом", что сброс флага прерывания непосредственно в самом конце обработчика работает плохо (до NVIC'а это доходит медленно, и прерывание вызывается ещё раз), но это не Ваш случай.

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


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

Не задействованы ли в схеме прерывания на других ногах, скажем, PA5 или PC5?

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


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

Just now, Сергей Борщ said:

Не задействованы ли в схеме прерывания на других ногах, скажем, PA5 или PC5?

Нет ,проверил данный факт первым делом, использованы прерывания 3 таймеров. Один для счета 60 мс для включения приема или передачи, другой для счета таймаут по приему, третий выдает время когда ведомый должен послать.  У ведомых еще задействована линия PA1 (EXTI_Line1)

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


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

Тогда махать ногами, как советует esaulenka. Чудес не бывает, использовал EXTI в F107, F407, F100 - везде работает по документации.

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


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

On 3/25/2019 at 1:30 PM, Сергей Борщ said:

Тогда махать ногами, как советует esaulenka. Чудес не бывает, использовал EXTI в F107, F407, F100 - везде работает по документации.

 

On 3/25/2019 at 11:40 AM, esaulenka said:

В порядке эксперимента предлагаю добавить во все (!) обработчики прерываний код "на входе установили ножку в единичку, на выходе в ноль" и посмотреть анализатором. Ну и в критическую секцию аналогично.

Ещё одной ножкой хорошо б отображать вход-выход в обработчик EXTI.

 

Чудес не бывает. Сталкивался с "чудом", что сброс флага прерывания непосредственно в самом конце обработчика работает плохо (до NVIC'а это доходит медленно, и прерывание вызывается ещё раз), но это не Ваш случай.

esaulenka и Сергей Борщ

Большое спасибо за помощь, с прерываниями все было в порядке, а вот с логикой обработки прерывания было не в порядке. В прерывании я устанавливал флаг, только вот этот флаг мог быть обработан не моментально, а по истечению 3-4мс, таким образом я читал не те данные,которые вызвали прерывание

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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