andy93762 发表于 2022-7-3 22:28

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

没用过,时钟看看是不是没有配置正确。

andy93762 发表于 2022-7-4 14:03

weifeng90 发表于 2022-7-4 07:59
没用过,时钟看看是不是没有配置正确。

时钟频率是24MHZ的

jonas222 发表于 2022-7-9 19:55

这个跟IO的配置有很大的关系   

fentianyou 发表于 2022-7-9 21:25

是不是RCC时钟没有使能?

sheflynn 发表于 2022-7-10 14:16

配置串口1和0都是一样的。

zerorobert 发表于 2022-7-10 14:43

看看官网的例程吧。   

tpgf 发表于 2022-8-1 11:22

是不是相应的io也需要配置啊

nawu 发表于 2022-8-1 11:31

串口配置应该不差啥 主要看io配置那部分

aoyi 发表于 2022-8-1 11:38

时间间隔正确吗

zljiu 发表于 2022-8-1 11:46

硬件上如何分配的呢

gwsan 发表于 2022-8-1 11:57

关掉串口0试试看

tfqi 发表于 2022-8-1 12:04

估计是干扰问题了

wubangmi 发表于 2022-8-1 12:27

如果是直接在原来uart0的代码上改的,那应该就是你硬件的PA2/PA3上有滤波电容造成这个无法通信

zdy_999 发表于 2022-8-1 15:43

for(i=0;i<7;i++)
          {
                        Uart_SendData(UARTCH1,sendtab);
                        //在这里加延时阻塞
          }      

海滨消消 发表于 2022-8-16 10:11

多看看官方给出的例程
页: [1]
查看完整版本: HC32F030J8串口1通信不正常,请分析下原因