HC32F030J8串口1通信不正常,请分析下原因
串口0能正常通信,但是我配置串口1用串口0一样的方法,死活通信不正常,发送给电脑上位机的数据动不动就少了几个位。感觉设置的波特率偏差比较大造成的。我用的是内部时钟,RCH=24MHZ。波特率我配置成9600bps也不行。不知道问题出在哪里?
void App_Uart1Init(void)
{
uint16_t u16Scnt = 0;
stc_uart_config_tstcConfig;
stc_uart_irq_cb_t stcUartIrqCb;
stc_uart_multimode_t stcMulti;
stc_uart_baud_t stcBaud;
stc_gpio_config_t stcGpioCfg;
DDL_ZERO_STRUCT(stcConfig);
DDL_ZERO_STRUCT(stcUartIrqCb);
DDL_ZERO_STRUCT(stcMulti);
DDL_ZERO_STRUCT(stcBaud);
DDL_ZERO_STRUCT(stcGpioCfg);
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE);//使能GPIO模块时钟
Sysctrl_SetPeripheralGate(SysctrlPeripheralUart1,TRUE);//使能uart1模块时钟
stcGpioCfg.enDir = GpioDirOut;
Gpio_Init(GpioPortA,GpioPin2,&stcGpioCfg);
Gpio_SetAfMode(GpioPortA,GpioPin2,GpioAf1);
stcGpioCfg.enDir = GpioDirIn;
Gpio_Init(GpioPortA,GpioPin3,&stcGpioCfg);
Gpio_SetAfMode(GpioPortA,GpioPin3,GpioAf1);
stcUartIrqCb.pfnRxIrqCb = RxIntCallback1;//中断入口地址
stcUartIrqCb.pfnTxIrqCb = TxIntCallback1;
stcUartIrqCb.pfnRxFEIrqCb = ErrIntCallback1;
stcUartIrqCb.pfnPEIrqCb = PErrIntCallBack1;
stcUartIrqCb.pfnCtsIrqCb= CtsIntCallBack1;
stcConfig.pstcIrqCb = &stcUartIrqCb;
stcConfig.bTouchNvic = TRUE;
if(TRUE == stcConfig.bTouchNvic)
{
EnableNvic(UART1_IRQn,IrqLevel2,TRUE);
}
stcConfig.enRunMode = UartMode1;//模式1
stcConfig.enStopBit = Uart1bit;//1bit停止位
Uart_Init(UARTCH1, &stcConfig);//串口初始化
Uart_SetClkDiv(UARTCH1,Uart8Or16Div);//采样分频
stcBaud.u32Pclk = Sysctrl_GetPClkFreq();
stcBaud.enRunMode = UartMode1;
stcBaud.u32Baud = 9600;
u16Scnt = Uart_CalScnt(UARTCH1,&stcBaud);//波特率计算
Uart_SetBaud(UARTCH1,u16Scnt);//波特率设置
Uart_ClrStatus(UARTCH1,UartRC);//清接收请求
Uart_EnableIrq(UARTCH1,UartRxIrq);//使能串口中断
Uart_EnableFunc(UARTCH1,UartRx);//使能收发
}
下面这个是发送函数,每隔1s发送这个数据给上位机
void Uart1_ACK_modbus(void)
{
uint8_t sendtab;
uint16_t crcnum;
uint8_t i;
sendtab=0XAA;
sendtab=0xBB;
sendtab=0xCC;
sendtab=0xDD;
sendtab=0xEE;
sendtab=0XFF;
sendtab=0;
for(i=0;i<7;i++)
{
Uart_SendData(UARTCH1,sendtab);
}
}
没用过,时钟看看是不是没有配置正确。 weifeng90 发表于 2022-7-4 07:59
没用过,时钟看看是不是没有配置正确。
时钟频率是24MHZ的 这个跟IO的配置有很大的关系 是不是RCC时钟没有使能? 配置串口1和0都是一样的。 看看官网的例程吧。 是不是相应的io也需要配置啊 串口配置应该不差啥 主要看io配置那部分 时间间隔正确吗 硬件上如何分配的呢 关掉串口0试试看 估计是干扰问题了 如果是直接在原来uart0的代码上改的,那应该就是你硬件的PA2/PA3上有滤波电容造成这个无法通信 for(i=0;i<7;i++)
{
Uart_SendData(UARTCH1,sendtab);
//在这里加延时阻塞
} 多看看官方给出的例程
页:
[1]