Поиск
Показаны результаты для тегов 'stm32f1 gpio interrupt'.
-
Работаю с приемопередатчиком 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);