GZZXB 发表于 2023-8-15 18:33:19

写flash后串口接收失效,该如何修改?

   用的是PY32,但是我看HAL库函数和ST基本一致,看规格书寄存器也一致。

现象:
    初始串口收发正常,只要有写flash动作(当eeporm用),就会将CR1的 PEIE RXNEIE 及 CR3的EIE 3个中断清0,这样后续串口就无法接收数据了。
怀疑写flash时,flash中代码不能被执行而USART1是外设依然在运行。 就会出现OVE等错误。在 void HAL_UART_IRQHandler(UART_HandleTypeDef *huart) 函数中
当有错误产生时将会调用UART_EndRxTransfer(huart); 清除上面的3个中断使能,从而后续无法进入中断接收。

尝试解决:
    1) 添加错误回调函数重新打开上述3个中断
                    void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
                {
                  printf("Uart Error, ErrorCode = %d\r\n", huart->ErrorCode);
                  if (huart->Instance == USART1)
                        {
                          uint32_t isrflags   = READ_REG(huart->Instance->SR);
                        uint32_t cr1its   = READ_REG(huart->Instance->CR1);
                        uint32_t cr3its   = READ_REG(huart->Instance->CR3);
                        //do{
                        //isrflags   = READ_REG(huart->Instance->SR);
                        //cr1its   = READ_REG(huart->Instance->CR1);
                        //cr3its   = READ_REG(huart->Instance->CR3);
                        //}while(isrflags & 0x0000003f);
                          HAL_UART_Receive_IT(&UartHandle, (uint8_t *)aRxBuffer, 1);
                        }
                }
       调试,故障依旧。
    2)写完flash后对USART1寄存器重新赋值,相当于重新初始化。 调试,故障依旧。
    3)在写flash前   USART1->CR1 &= (uint16_t)(~USART_CR1_UE);写完后恢复 USART1->CR1 |=(uint16_t)(~USART_CR1_UE);
    调试,故障依旧。

    到这个步骤还是认为是写flash导致CR1的 PEIE RXNEIE 及 CR3的EIE 3个中断清0,虽然用代码重新置位了,可能有潜伏的错误接下来又清除了。

    4)直接将void HAL_UART_IRQHandler(UART_HandleTypeDef *huart) 中的UART_EndRxTransfer(huart); 注释掉,看起来是没有哪里会执行
    对CR1的 PEIE RXNEIE 及 CR3的EIE 3个中断清0了。 调试故障依旧{:sad:}

    郁闷头大中{:dizzy:} ,没弄明白还有什么情况会对中断使能清0.有意思的是在keil调试窗口当出现异常时,在USART1观察窗口里直接将PEIE RXNEIE 及 EIE打勾
观察窗口会自动修改几次,就是一会0一会1,像led闪烁那样闪几下,最后显示打勾接收正常。



页: [1]
查看完整版本: 写flash后串口接收失效,该如何修改?