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