大家好,我在使用STM32L431进行RS485开发时遇到了一个问题。我使用了ISO7041隔离芯片,在初始状态下,DE引脚为低,而TX和RX都为高。目前的问题是,当我打开电源、重置并插入485时,485的传输和接收都正常。然而,当我拔下并再次插入485时,发生了FE错误。这是为什么?是因为插入485后电压电平不匹配吗?
调试发现errorsflags=2,这应该是FE错误
以下是我的一些代码:
[C] 纯文本查看 复制代码 int main()
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_LPUART1_UART_Init();
HAL_GPIO_WritePin(DE485_GPIO_Port, DE485_Pin, GPIO_PIN_RESET);
initSqQueue(&uart[_LPCOM].Rx, lpuartRxBuff, sizeof(lpuartRxBuff));
initSqQueue(&uart[_LPCOM].Tx, lpuartTxBuff, sizeof(lpuartTxBuff));
__HAL_UART_ENABLE_IT(&hlpuart1, UART_IT_RXNE);
__HAL_UART_ENABLE_IT(&hlpuart1, UART_IT_IDLE);
while(1)
{
Process_Modbus_Receive(_LPCOM); // MODBUS
}
}
void USER_LPUART1_IRQHandler(void)
{
uint8_t lpuart1_data;
if (__HAL_UART_GET_FLAG(&hlpuart1, UART_FLAG_RXNE) != RESET)
{
lpuart1_data = (uint8_t)hlpuart1.Instance->RDR & (uint8_t)0x00fff;
wrEleQueue(&uart[_LPCOM].Rx, lpuart1_data);
uart[_LPCOM].active = true;
}
if (__HAL_UART_GET_FLAG(&hlpuart1, UART_FLAG_IDLE) != RESET)
{
uart[_LPCOM].rxIdle = true;
__HAL_UART_CLEAR_IDLEFLAG(&hlpuart1);
}
else
{
uart[_LPCOM].rxIdle = false;
}
}
void LPUART1_IRQHandler(void)
{
USER_LPUART1_IRQHandler();
HAL_UART_IRQHandler(&hlpuart1);
}
我目前的解决方案是修改CUBEMX生成的HAL库,直接删除CR3 EIE值的判断并清除标志位。这是正确的吗?它是否会影响其他串行端口的传输和接收,或者这个标志是否会在其他地方被检测到并在其他地方清除。
[C] 纯文本查看 复制代码 // if (((isrflags & USART_ISR_FE) != 0U) && ((cr3its & USART_CR3_EIE) != 0U))
if (((isrflags & USART_ISR_FE) != 0U) )
{
__HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_FEF);
huart->ErrorCode |= HAL_UART_ERROR_FE;
}
|