问答

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

21ic问答首页 - HC32L17系列串口通信问题

嵌入式 HC L17 串口通信 ST stc

HC32L17系列串口通信问题

案例代码都是用9600作为波特率与串口通信,结果没问题,但是调到115200后,出现了乱码,发现是实际波特率的问题,于是用示例的App_RCH4MHzToPll48MHz代码,调到48MHZ,实际串口没问题,但是在与4G模块通信时,还是会出现数据缺失的问题

发送AT+CPIN?后,应该回复+CPIN:READY,但实际转发到串口查看,缺少数据D,实际代码也没往下跑,因为接收数据缺失
在检测4G模块正常的情况下,是哪里出现了问题?代码如下:
                                                                     /*author ljx*/
#include "hc32l17x.h"
#include "uart.h"
#include "gpio.h"

int RxCount=0;//接收缓冲区坐标
char RxBuffer[1000];//接收缓冲区

//串口引脚配置
void usart1_Init(void)
{
    stc_gpio_cfg_t stcGpioCfg;
    stc_uart_cfg_t  stcCfg;
    stc_uart_baud_t stcBaud;
       
    DDL_ZERO_STRUCT(stcGpioCfg);
                DDL_ZERO_STRUCT(stcCfg);
    DDL_ZERO_STRUCT(stcBaud);

    Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE); //使能GPIO模块时钟   
       
                ///<TX
    stcGpioCfg.enDir = GpioDirOut;
    Gpio_Init(GpioPortA, GpioPin2, &stcGpioCfg);
    Gpio_SetAfMode(GpioPortA, GpioPin2, GpioAf1);          //配置PA02 端口为URART1_TX
       
                ///<RX
    stcGpioCfg.enDir = GpioDirIn;
    Gpio_Init(GpioPortA, GpioPin15, &stcGpioCfg);
    Gpio_SetAfMode(GpioPortA, GpioPin15, GpioAf2);          //配置PA15 端口为URART1_RX
       
                //串口配置
               


    ///< 开启外设时钟
    Sysctrl_SetPeripheralGate(SysctrlPeripheralUart1,TRUE);///<使能uart1模块时钟

    ///<UART Init
    stcCfg.enRunMode        = UartMskMode1;          ///<模式1
    stcCfg.enStopBit        = UartMsk1bit;           ///<1bit停止位
                stcCfg.enMmdorCk                                 = UartMskDataOrAddr;      //无校验
    stcCfg.stcBaud.u32Baud  = 115200;                  ///<波特率115200
    stcCfg.stcBaud.enClkDiv = UartMsk8Or16Div;       ///<通道采样分频配置
    stcCfg.stcBaud.u32Pclk  = Sysctrl_GetPClkFreq(); ///<获得外设时钟(PCLK)频率值
    Uart_Init(M0P_UART1, &stcCfg);                   ///<串口初始化
               
                Uart_ClrStatus(M0P_UART1,UartRC);                ///<清接收请求
                Uart_ClrStatus(M0P_UART1,UartTC);                                                    //清发送请求
               
}



//4G模块引脚配置
void usart0_Init(void)
{
    stc_gpio_cfg_t stcGpioCfg;
    stc_uart_cfg_t  stcCfg;
    stc_uart_baud_t stcBaud;

               
    DDL_ZERO_STRUCT(stcGpioCfg);
                DDL_ZERO_STRUCT(stcCfg);
    DDL_ZERO_STRUCT(stcBaud);

    Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE); //使能GPIO模块时钟

    ///<TX
    stcGpioCfg.enDir = GpioDirOut;
    Gpio_Init(GpioPortB, GpioPin6, &stcGpioCfg);               
    Gpio_SetAfMode(GpioPortB, GpioPin6, GpioAf2);          //配置PB06 端口为URART0_TX

    ///<RX
    stcGpioCfg.enDir = GpioDirIn;
    Gpio_Init(GpioPortB, GpioPin7, &stcGpioCfg);
    Gpio_SetAfMode(GpioPortB, GpioPin7, GpioAf2);          //配置PB07 端口为URART0_RX       
       
                //串口配置
               


               
    ///< 开启外设时钟
    Sysctrl_SetPeripheralGate(SysctrlPeripheralUart0,TRUE);///<使能uart0模块时钟

    ///<UART Init
    stcCfg.enRunMode        = UartMskMode1;          ///<模式1
    stcCfg.enStopBit        = UartMsk1bit;           ///<1bit停止位
                stcCfg.enMmdorCk                                 = UartMskDataOrAddr;      //无校验
    stcCfg.stcBaud.u32Baud  = 115200;                  ///<波特率115200
    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);             ///<使能串口接收中断

                EnableNvic(UART0_2_IRQn, IrqLevel3, TRUE);       ///<系统中断使能
               
}


/**
  * 函    数:串口发送一个字节
  * 参    数:Byte 要发送的一个字节
  * 返 回 值:无
  */
void USART1_SendByte(uint8_t Byte)
{
    Uart_SendDataPoll(M0P_UART1,Byte); //启动UART1发送第一个字节
}


/**
  * 函    数:串口发送一个字节
  * 参    数:Byte 要发送的一个字节
  * 返 回 值:无
  */
void USART0_SendByte(uint8_t Byte)
{
    Uart_SendDataPoll(M0P_UART0,Byte); //启动UART0发送第一个字节
}


/**
  * 函    数:使用printf需要重定向的底层函数
  * 参    数:保持原始格式即可,无需变动
  * 返 回 值:保持原始格式即可,无需变动
  */
int fputc(int ch, FILE *p)
{
        USART0_SendByte(ch);                        //将printf的底层重定向到自己的发送字节函数
        return ch;
}


//UART0中断函数
void Uart0_IRQHandler(void)
{
    if(Uart_GetStatus(M0P_UART0, UartRC))         //UART0数据接收
    {   
                                Uart_ClrStatus(M0P_UART0, UartRC);        //清中断状态位       
        RxBuffer[RxCount] = Uart_ReceiveData(M0P_UART0);   //接收数据字节  
                                                       
                                USART1_SendByte(RxBuffer[RxCount]);
                                RxCount++;
                                if(RxCount>=1000)
        RxCount=0; //字符数组满了,从头再来                                                               
    }
}



回答 +关注 0
552人浏览 0人回答问题 分享 举报
0 个回答

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