和下土 发表于 2022-6-28 15:37

华大 HC32L30E8PA 低功耗串口设置

初玩华大芯片开发
我是把低功耗串口当普通串口使用.
记录下串口设置以备以后忽然忘记
华大芯片库开发还是和STM32有些不同,串口设置也有些不同
官方给的例程相对简单.
我习惯STM32和STM8设置,校验位为:无校验位

华大芯片 库,模式3只能设置奇偶校验,串口助手设置无校验,数据出差,让我折腾了两天.
我们开发大多数都是习惯性的无校验位.
华大芯片设置成模式1 ,把设置校验位代码//注释掉就可以了.

#define lPUART1_REC_LEN                        200        //定义USART1最大接收字节数
u8lPUART1_RX_BUF; //接收缓冲,最大USART_REC_LEN个字节.末字节为换行符
u16 lPUART1_RX_STA=0;                         //接收状态标记       
u16 u16Scnt;//波特率设置

//串口管脚初始化
void Lpuart_PortInit(void)
{
                stc_gpio_config_t stcGpioCfg;       
          DDL_ZERO_STRUCT(stcGpioCfg);
                stcGpioCfg.enDir =GpioDirOut;//端口初始化
    Gpio_Init(GpioPortA,GpioPin0,&stcGpioCfg);//TX
                Gpio_SetAfMode(GpioPortA,GpioPin0,GpioAf2);
    stcGpioCfg.enDir =GpioDirIn;
                //stcGpioCfg.enPuPd = GpioPu;
    Gpio_Init(GpioPortA,GpioPin1,&stcGpioCfg);//RX
    Gpio_SetAfMode(GpioPortA,GpioPin1,GpioAf2);
}


void Lpuart_Init(void)
{

   // stc_lpuart_sclk_sel_t stcSclk;
    stc_lpuart_config_tstcConfig;//
    stc_lpuart_irq_cb_t stcLPUartIrqCb;//
    stc_lpuart_multimode_t stcMulti;//
    stc_lpuart_baud_t stcBaud;//
               
    DDL_ZERO_STRUCT(stcConfig);//
    DDL_ZERO_STRUCT(stcLPUartIrqCb);//
    DDL_ZERO_STRUCT(stcMulti);//
    DDL_ZERO_STRUCT(stcBaud);//
    //DDL_ZERO_STRUCT(stcSclk);
                       
    Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE);//外设模式时钟使能
    Sysctrl_SetPeripheralGate(SysctrlPeripheralLpUart1,TRUE);
   
                Lpuart_PortInit();//管脚初始化
       
    stcLPUartIrqCb.pfnRxIrqCb   = RxIntCallback;//中断服务函数入口地址
    stcLPUartIrqCb.pfnTxIrqCb   = NULL;
    stcLPUartIrqCb.pfnRxFEIrqCb = NULL;
    stcLPUartIrqCb.pfnPEIrqCb   = NULL;
    stcLPUartIrqCb.pfnCtsIrqCb= NULL;
    stcConfig.pstcIrqCb = &stcLPUartIrqCb;
    stcConfig.bTouchNvic = TRUE;
        if(TRUE == stcConfig.bTouchNvic)
        {
                EnableNvic(LPUART1_IRQn,IrqLevel3,TRUE);
        }
    stcConfig.enStopBit = LPUart1bit;//停止位
   
    /
    stcConfig.enRunMode = LPUartMode1;//模式1
    stcMulti.enMulti_mode = LPUartNormal;//正常模式
                LPUart_SetMultiMode(LPUART1,&stcMulti);//多机模式设置
//
    //LPUart_SetMMDOrCk(LPUART1,LPUartEven);//偶校验
       
    LPUart_Init(LPUART1, &stcConfig);//串口初始化
   
    LPUart_SetClkDiv(LPUART1,LPUart8Or16Div);//采样分频
   
    stcBaud.u32Sclk = Sysctrl_GetPClkFreq();
    stcBaud.enRunMode = LPUartMode3;
    stcBaud.u32Baud = 9600;
    u16Scnt = LPUart_CalScnt(LPUART1,&stcBaud);//波特率计算
    LPUart_SetBaud(LPUART1,u16Scnt);//波特率值设置
   
                LPUart_ClrStatus(LPUART1,LPUartRC);//清 接收中断请求
    LPUart_EnableIrq(LPUART1,LPUartRxIrq);//使能接收中断
    LPUart_EnableFunc(LPUART1,LPUartRx);//使能数据收发
}

//接收中断
void RxIntCallback(void)
{
                lPUART1_RX_BUF=LPUart_ReceiveData(LPUART1);//读数据
                lPUART1_RX_STA++;       
}



和下土 发表于 2022-6-28 15:38

测试代码
u8 xxx=0;
void USERT_SEND(void)
{
        if(lPUART1_RX_STA>5)//接收到数据
        {
                for(xxx=0;xxx<lPUART1_RX_STA;xxx++)
                {
                LPUart_SendData(LPUART1,lPUART1_RX_BUF);
                }
                lPUART1_RX_STA=0;
        }
}

和下土 发表于 2022-6-28 15:39

在主函数内循环,

hearstnorman323 发表于 2023-2-4 10:11

使用串口可以唤醒低功耗?            
页: [1]
查看完整版本: 华大 HC32L30E8PA 低功耗串口设置