| 
 
| HC32F460片上有4路串口,驱动使用了HC32官方的库函数,一般初始化流程如下代码,一开始验证没有问题,能正常收发数据。 
 //HC32F460串口初始化
 {
 stc_usart_uart_init_t init;
 memset(&init, 0, sizeof(init));
 
 init.enClkMode   = UsartIntClkCkNoOutput;
 init.enClkDiv    = UsartClkDiv_1;
 init.enDataLength= UsartDataBits8;
 init.enDirection = UsartDataLsbFirst;
 init.enStopBit   = UsartOneStopBit;
 init.enParity    = (en_usart_parity_t)parity;
 init.enSampleMode= UsartSampleBit8;
 init.enDetectMode= UsartStartBitFallEdge;
 init.enHwFlow    = UsartRtsEnable;
 USART_UART_Init(hw->uart, &init);
 
 USART_SetBaudrate(hw->uart, baudrate);
 USART_FuncCmd(hw->uart, UsartTx, Enable);
 USART_FuncCmd(hw->uart, UsartRx, Enable);
 USART_FuncCmd(hw->uart, UsartRxInt, Enable);
 }
 后来实际项目中,接入一个RS485设备,发现不能正常接收数据,故障表现是MCU不进接收中断。
 检查了硬件,没有发现问题,外部设备->板载485芯片->MCU_RX,示波器都能看到引脚有波形过来。
 最后通过Keil的外设查看窗口,看看UART的寄存器,发现SR->FE标记置1。
 这意味着接收发现帧错误。
 
 于是怀疑是波特率的问题了,用串口调试工具测试发现,果然UART在9600波特率下不能正常接收。
 之前验证驱动用的是115200,波特率较高收发都正常。
 问题发生在下面这一行代码,UART的时钟分频值太低,无法产生9600这么低的波特率。
 
 init.enClkDiv    = UsartClkDiv_1;
 将这个值改为16,结果可以通信了。
 
 init.enClkDiv    = UsartClkDiv_16;
 
 
 
 | 
 |