问题:使用芯片HC32F002的UART功能来通信,波特率4800,其中格式为 数据位8位,偶校验,1停止位。使用串口通信工具发送数据,单片机接收数据出现错误。
参考程序来自于(小华提供的例程HC32F002_SDK\hc32f002_ddl_beta1.0\example\lpuart\lpuart_rx_tx_it)
void App_LpUartCfg(void)
{
stc_lpuart_init_t stcInit = {0};
///<外设模块时钟使能
SYSCTRL_PeriphClkEnable(SYSCTRL_PERICLK_LPUART0);
///<LPUART 初始化
stcInit.u32StopBits = LPUART_STOPBITS_1; ///< 1停止位
stcInit.u32Parity = LPUART_PARITY_NONE; ///< 无校验
stcInit.u32FrameLength = LPUART_FRAME_LEN_8BITS; ///< 帧长8位
stcInit.u32TransMode = LPUART_MODE_TX_RX; ///< 发送模式
stcInit.stcBaudRate.u32SclkSrc = LPUART_CLKSRC_PCLK; ///< 传输时钟源
stcInit.stcBaudRate.u32Sclk = SYSCTRL_GetPCLK(); ///< PCLK获取
stcInit.stcBaudRate.u32BaudRate = 9600; ///< 波特率
LPUART_Init(M0P_LPUART0, &stcInit);
}
其中变更:
stcInit.u32Parity = LPUART_PARITY_EVEN; ///< 偶校验
stcInit.stcBaudRate.u32BaudRate = 4800; ///< 波特率
上位机发送命令如下:01 03
然而单片机中断接收的数据分别为0x81,0x03。
将校验位改为奇校验,那么单片机中断接收的数据变为0x01,0x83。
从以上结果可以得出偶校验时:接收的数据是奇数个1,则不正常;偶数个1则正常。
解决方法:
stcInit.u32FrameLength = LPUART_FRAME_LEN_9BITS; ///< 帧长9位
参考HC32F002参考手册
需要将CR.MODE改为(0x11>>6),程序内使用LPUART_FRAME_LEN_9BITS可以满足要求,即模式3。
LPUART_FRAME_LEN_8BITS是将CR.MODE改为(0x01>>6),即模式1。