From a2c5d882c277c758b8ccd1348eb9ce7fa37b3d2c Mon Sep 17 00:00:00 2001 From: Guriy Date: Thu, 2 Jul 2026 14:12:45 +0300 Subject: [PATCH] worked on test board --- Src/main.c | 26 ++++++++++- Src/stm32f7xx_it.c | 107 ++++++++++++++++++++++++++++++--------------- 2 files changed, 96 insertions(+), 37 deletions(-) diff --git a/Src/main.c b/Src/main.c index c7ec041..4814065 100644 --- a/Src/main.c +++ b/Src/main.c @@ -218,16 +218,38 @@ int main(void) /* USER CODE BEGIN WHILE */ while (1) { + if ((HAL_GPIO_ReadPin(USB_FLAG_GPIO_Port, USB_FLAG_Pin)==GPIO_PIN_SET)&&(u_rx_flg == 0)) { - //NVIC_DisableIRQ(USART1_IRQn); + /* USB только что подключили: выкинуть весь мусор, накопленный в USART, + пока RX болтался без драйвера, — ДО включения прерываний */ + LL_USART_ClearFlag_ORE(USART1); + LL_USART_ClearFlag_FE(USART1); + LL_USART_ClearFlag_NE(USART1); + LL_USART_ClearFlag_PE(USART1); + LL_USART_RequestRxDataFlush(USART1); // выкинуть байт из RDR, снять RXNE + UART_rec_incr = 0; // сбросить недособранный пакет + flg_tmt = 0; + LL_USART_EnableIT_PE(USART1); LL_USART_EnableIT_RXNE(USART1); LL_USART_EnableIT_ERROR(USART1); NVIC_SetPriority(USART1_IRQn, 0); - NVIC_EnableIRQ(USART1_IRQn);//In other case you have FE error flag... + NVIC_EnableIRQ(USART1_IRQn); u_rx_flg = 1; } + + + // if ((HAL_GPIO_ReadPin(USB_FLAG_GPIO_Port, USB_FLAG_Pin)==GPIO_PIN_SET)&&(u_rx_flg == 0)) + // { + // //NVIC_DisableIRQ(USART1_IRQn); + // LL_USART_EnableIT_PE(USART1); + // LL_USART_EnableIT_RXNE(USART1); + // LL_USART_EnableIT_ERROR(USART1); + // NVIC_SetPriority(USART1_IRQn, 0); + // NVIC_EnableIRQ(USART1_IRQn);//In other case you have FE error flag... + // u_rx_flg = 1; + // } // else // { // //NVIC_DisableIRQ(USART1_IRQn); diff --git a/Src/stm32f7xx_it.c b/Src/stm32f7xx_it.c index 7460297..55300bc 100644 --- a/Src/stm32f7xx_it.c +++ b/Src/stm32f7xx_it.c @@ -276,45 +276,82 @@ void TIM2_IRQHandler(void) void USART1_IRQHandler(void) { /* USER CODE BEGIN USART1_IRQn 0 */ - volatile uint8_t temp; - if(LL_USART_IsActiveFlag_RXNE(USART1) && LL_USART_IsEnabledIT_RXNE(USART1)) + + //---- + // volatile uint8_t temp; + // if(LL_USART_IsActiveFlag_RXNE(USART1) && LL_USART_IsEnabledIT_RXNE(USART1)) + // { + // UART_RxCpltCallback(); + // } + // else + // { + // if(LL_USART_IsActiveFlag_ORE(USART1)) + // { + // //temp = USART1->RDR; + // LL_USART_ClearFlag_ORE(USART1); + // temp+= LL_USART_ReceiveData8(USART1); + // } + // else if(LL_USART_IsActiveFlag_FE(USART1)) + // { + // //(void) USART1->RDR; + // //LL_USART_ClearFlag_FE(USART1); + // temp+= LL_USART_ReceiveData8(USART1); + // } + // else if(LL_USART_IsActiveFlag_NE(USART1)) + // { + // //(void) USART1->RDR; + // LL_USART_ClearFlag_NE(USART1); + // temp+= LL_USART_ReceiveData8(USART1); + // } + // else if(LL_USART_IsActiveFlag_PE(USART1)) + // { + // //(void) USART1->RDR; + // LL_USART_ClearFlag_PE(USART1); + // temp+= LL_USART_ReceiveData8(USART1); + // } + // else + // { + // if(LL_USART_IsActiveFlag_TC(USART6) && LL_USART_IsEnabledIT_TC(USART6)) + // { + // LL_USART_ClearFlag_TC(USART1); + // //test_counter += 1; + // //if(UART_transmission_busy == 1){ + // LL_USART_DisableIT_TC(USART1); + // //UART_transmission_busy = 0; + // } + // } + // } + + //---- + + /* Любая ошибка приёма: снять ВСЕ флаги, выбросить битый байт, в парсер не пускать */ + if (LL_USART_IsActiveFlag_ORE(USART1) || + LL_USART_IsActiveFlag_FE(USART1) || + LL_USART_IsActiveFlag_NE(USART1) || + LL_USART_IsActiveFlag_PE(USART1)) { - UART_RxCpltCallback(); + LL_USART_ClearFlag_ORE(USART1); + LL_USART_ClearFlag_FE(USART1); + LL_USART_ClearFlag_NE(USART1); + LL_USART_ClearFlag_PE(USART1); + LL_USART_RequestRxDataFlush(USART1); // RXFRQ: сбросить RXNE, выкинуть байт из RDR + UART_rec_incr = 0; // сбросить недособранную команду от глитча + flg_tmt = 0; + //temp = temp; // подавить warning + return; } - else + + /* Нормальный приём — только чистые байты */ + if (LL_USART_IsActiveFlag_RXNE(USART1) && LL_USART_IsEnabledIT_RXNE(USART1)) { - if(LL_USART_IsActiveFlag_ORE(USART1)) - { - //temp = USART1->RDR; - temp+= LL_USART_ReceiveData8(USART1); - } - else if(LL_USART_IsActiveFlag_FE(USART1)) - { - //(void) USART1->RDR; - temp+= LL_USART_ReceiveData8(USART1); - } - else if(LL_USART_IsActiveFlag_NE(USART1)) - { - //(void) USART1->RDR; - temp+= LL_USART_ReceiveData8(USART1); - } - else if(LL_USART_IsActiveFlag_PE(USART1)) - { - //(void) USART1->RDR; - temp+= LL_USART_ReceiveData8(USART1); - } - else - { - if(LL_USART_IsActiveFlag_TC(USART6) && LL_USART_IsEnabledIT_TC(USART6)) - { - LL_USART_ClearFlag_TC(USART1); - //test_counter += 1; - //if(UART_transmission_busy == 1){ - LL_USART_DisableIT_TC(USART1); - //UART_transmission_busy = 0; - } - } + UART_RxCpltCallback(); } + else if (LL_USART_IsActiveFlag_TC(USART1) && LL_USART_IsEnabledIT_TC(USART1)) + { + LL_USART_ClearFlag_TC(USART1); + LL_USART_DisableIT_TC(USART1); + } + //--- /* USER CODE END USART1_IRQn 0 */ /* USER CODE BEGIN USART1_IRQn 1 */