问答

汇集网友智慧,解决技术难题

21ic问答首页 - 请教HC32L196KCTA 串口0只能发送 无法接收

嵌入式 HC 串口 GPIO IO pi

请教HC32L196KCTA 串口0只能发送 无法接收

IchBinMarcel2021-08-18
最近在使用HC32L196这款芯片进行开发,但是发现UART0 只能发送 不能接收,代码我贴在下面,个位大佬帮我看看问题出在哪里      
      下载视频         

        //uart0 gpio配置
        stc_gpio_cfg_t stcGpioCfg;   
            DDL_ZERO_STRUCT(stcGpioCfg);

            Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE);  ///<使能GPIO外设时钟门控开关

        //配置PB8、PB9为串口0
            stcGpioCfg.enDir = GpioDirOut;
        stcGpioCfg.enPu = GpioPuEnable;
        stcGpioCfg.enOD = GpioOdEnable;
            Gpio_Init(GpioPortB,GpioPin8,&stcGpioCfg);
            Gpio_SetAfMode(GpioPortB,GpioPin8,GpioAf7);             ///<配置PB8 为UART0 TX
       
            stcGpioCfg.enDir = GpioDirIn;
        stcGpioCfg.enPu = GpioPuEnable;
            stcGpioCfg.enOD = GpioOdEnable;
            Gpio_Init(GpioPortB,GpioPin9,&stcGpioCfg);
            Gpio_SetAfMode(GpioPortB,GpioPin9,GpioAf7);             ///<配置PB9 为UART0 RX
       
        //uart0配置
        stc_uart_cfg_t  stcCfg;
            stc_uart_baud_t stcBaud;

            DDL_ZERO_STRUCT(stcCfg);
            DDL_ZERO_STRUCT(stcBaud);

            Sysctrl_SetPeripheralGate(SysctrlPeripheralUart0,TRUE); ///<使能UART0外设时钟门控开关

            ///<UART Init
            stcCfg.enRunMode        = UartMskMode3;                 ///<模式3
            stcCfg.enStopBit           = UartMsk1bit;                  ///<1bit停止位
            stcCfg.enMmdorCk        = UartMskDataOrAddr;            ///<多机模式时
            stcCfg.stcBaud.u32Baud  = 57600;                       ///<波特率57600
            stcCfg.stcBaud.enClkDiv = UartMsk8Or16Div;              ///<通道采样分频配置
            stcCfg.stcBaud.u32Pclk  = Sysctrl_GetPClkFreq();        ///<获得外设时钟(PCLK)频率值
            Uart_Init(M0P_UART0, &stcCfg);                          ///<串口初始化

            ///<UART中断使能
            Uart_ClrStatus(M0P_UART0,UartRC);                       ///<清接收请求
            Uart_ClrStatus(M0P_UART0,UartTC);                       ///<清接收请求
            Uart_EnableIrq(M0P_UART0,UartRxIrq);                    ///<使能串口接收中断
//        Uart_EnableIrq(M0P_UART0,UartTxIrq);                    ///<使能串口发送中断       
            EnableNvic(UART0_2_IRQn, IrqLevel3, TRUE);              ///<系统中断使能


void Uart0_IRQHandler(void)
{
    if(Uart_GetStatus(M0P_UART0, UartRC))             //UART0数据接收
    {
        Uart_ClrStatus(M0P_UART0, UartRC);            //清中断状态位
        u8RxData[u8RxCnt]=Uart_ReceiveData(M0P_UART0);
        u8RxCnt++;
    }

    if(Uart_GetStatus(M0P_UART0, UartTC))         //UART0数据发送
    {
        Uart_ClrStatus(M0P_UART0, UartTC);        //清中断状态位
    }

}


以上代码我用了串口调试软件,可以正常接收到板子发出来的信息,但是用串口软件向板子发信息,无法进入串口0的接收中断!

而且,对于串口发送函数我也比较疑惑
HC32L196提供了两个串口发送函数
1、en_result_t Uart_SendDataPoll(M0P_UART_TypeDef* UARTx, uint8_t u8Data)
2、en_result_t Uart_SendDataIt(M0P_UART_TypeDef* UARTx, uint8_t u8Data)

在开启串口发送中断的情况下,用第一个函数是发不出去消息的,只能关了发送中断才能正常发
如果想用第二个发送函数,就要开启中断,然后在中断里进行数据的发送,非常的不方便。

各位有没有相似的经验可以知道我一下,我之前都用STM32,第一次用国产的,被搞得有点懵了。。。
回答 +关注 15
3990人浏览 1人回答问题 分享 举报
1 个回答
  • 关于串口发送的问题解决了      
          下载视频         
    while (Uart_GetStatus(M0P_UART0, UartTxe)==FALSE); //等待上次传输完成
    Uart_SendDataIt(M0P_UART0, (uint8_t)USART0_TX_BUF[j]);


    将UartTxe用了UartTC,导致卡死在while循环,换成UartTxe就好了

您需要登录后才可以回复 登录 | 注册