#stm32
Вопрос:
Я использую микроконтроллер STM32L072CZ для своих целей разработки. Я интегрирую STM32L072CZ с LoRa communication для нашего проекта. Я написал уровень приложений на базовой прошивке LoRa LSN50-V2(узел со встроенным STM32 и чипом Lora) В этом я настраиваю 2 штыря прерывания как в восходящем, так и в падающем крае. Я настраиваю pin-код таким образом, как я упоминал ниже, а также использую макросы для контактов, часов pin-кода и порта pin-кода
Инициализация и настройка PIN-кода и деинициализация
void mainInit( void )
{
GPIO_InitTypeDef GPIO_InitStruct={0};
GPIO_MAIN_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_MAIN_PIN;
GPIO_InitStruct.Mode =GPIO_MODE_IT_RISING_FALLING;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed=GPIO_SPEED_HIGH;
HW_GPIO_Init( GPIO_MAIN_PORT, GPIO_MAIN_PIN, amp;GPIO_InitStruct );
/* Enable and set EXTI lines 4 to 15 Interrupt to the lowest priority */
HAL_NVIC_SetPriority(EXTI4_15_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI4_15_IRQn);
}
void dgInit( void )
{
GPIO_InitTypeDef GPIO_InitStruct={0};
GPIO_DG_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_DG_PIN;
GPIO_InitStruct.Mode =GPIO_MODE_IT_RISING_FALLING;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed=GPIO_SPEED_HIGH;
HW_GPIO_Init( GPIO_DG_PORT, GPIO_DG_PIN, amp;GPIO_InitStruct );
/* Enable and set EXTI lines 4 to 15 Interrupt to the lowest priority */
HAL_NVIC_SetPriority(EXTI4_15_IRQn, 1, 0);
HAL_NVIC_EnableIRQ(EXTI4_15_IRQn);
}
void mainIoDeInit( void )
{
GPIO_InitTypeDef GPIO_InitStruct={0};
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
GPIO_InitStruct.Mode =GPIO_MODE_IT_RISING_FALLING;
HW_GPIO_Init( GPIO_MAIN_PORT, GPIO_MAIN_PIN, amp;GPIO_InitStruct );
}
void dgIoDeInit( void )
{
GPIO_InitTypeDef GPIO_InitStruct={0};
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
GPIO_InitStruct.Mode =GPIO_MODE_IT_RISING_FALLING;
HW_GPIO_Init( GPIO_DG_PORT, GPIO_DG_PIN, amp;GPIO_InitStruct );
}
/* IRQ handler functionality*/
//HAL_GPIO_EXTI_IRQHandler( GPIO_PIN_14 );
if (joined_flags==1)
{
if(__HAL_GPIO_EXTI_GET_IT(GPIO_DG_PIN)!=RESET)
{
HAL_Delay(30);
mainStreamer=0;
dgStreamer=1;
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_DG_PIN);
HAL_GPIO_EXTI_IRQHandler(GPIO_DG_PIN);
}
//HAL_GPIO_EXTI_IRQHandler( GPIO_PIN_15 );
if(__HAL_GPIO_EXTI_GET_IT(GPIO_MAIN_PIN)!=RESET)
{
HAL_Delay(30);
mainStreamer=1;
dgStreamer=0;
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_MAIN_PIN);
HAL_GPIO_EXTI_IRQHandler(GPIO_MAIN_PIN);
}
}
Я использовал PB14 и PB15 в качестве вывода прерывания.
PB14-Переключатель-1 PB15-Переключатель-2
В большинстве случаев обновляется прерывание с соответствующим состоянием переключателя. Но иногда возникали проблемы.
Проблема в том, что когда коммутатор-2 находится в состоянии ожидания, я управляю только коммутатором 1, в том, что иногда я наблюдал, что прерывание ISR коммутатора-2 происходит вместо ISR коммутатора 1.
в чем причина этого?
Комментарии:
1. Существует только одно прерывание, разделяемое этими двумя контактами. Когда вы получаете это единственное прерывание, вам нужно прочитать регистры состояния, чтобы определить, что произошло. Что заставляет вас думать, что «происходит переключение 2 ISR»?
2. Я устанавливаю флаги в каждом обработчике IRQ, в соответствии с флагом записывается условие для считывания статуса pin-кода и отправки через LoRa на сетевой сервер. В этом я наблюдаю проблему такого рода.
3. Что вы имеете в виду под «каждым IRQ»? Существует только один IRQ.
4. Да!!! Но я имел в виду, что каждый пин-код обработчика IRQ!
5. В вышеупомянутом коде я фиксирую Mainstream=0, а dg streamer =1 для одного pin-кода и наоборот для другого pin-кода. Основываясь на флаге, я выполнил одну функцию, прочитав статус PIN-кода прерывания. Эту функцию я упомянул ниже. Этим заявлением о печати я подтверждаю эту проблему.