[方案相关] 华大 HC32L30E8PA 低功耗串口设置

[复制链接]
1138|3
 楼主| 和下土 发表于 2022-6-28 15:37 | 显示全部楼层 |阅读模式
HC, PA
初玩华大芯片开发
我是把低功耗串口当普通串口使用.
记录下串口设置以备以后忽然忘记
华大芯片库开发还是和STM32有些不同,串口设置也有些不同
官方给的例程相对简单.
我习惯STM32和STM8设置,校验位为:无校验位

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

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

  5. //串口管脚初始化
  6. void Lpuart_PortInit(void)
  7. {
  8.                 stc_gpio_config_t stcGpioCfg;       
  9.           DDL_ZERO_STRUCT(stcGpioCfg);
  10.                 stcGpioCfg.enDir =  GpioDirOut;//端口初始化
  11.     Gpio_Init(GpioPortA,GpioPin0,&stcGpioCfg);//TX
  12.                 Gpio_SetAfMode(GpioPortA,GpioPin0,GpioAf2);
  13.     stcGpioCfg.enDir =  GpioDirIn;
  14.                 //stcGpioCfg.enPuPd = GpioPu;
  15.     Gpio_Init(GpioPortA,GpioPin1,&stcGpioCfg);//RX
  16.     Gpio_SetAfMode(GpioPortA,GpioPin1,GpioAf2);
  17. }


  18. void Lpuart_Init(void)
  19. {

  20.    // stc_lpuart_sclk_sel_t stcSclk;
  21.     stc_lpuart_config_t  stcConfig;//
  22.     stc_lpuart_irq_cb_t stcLPUartIrqCb;//
  23.     stc_lpuart_multimode_t stcMulti;//
  24.     stc_lpuart_baud_t stcBaud;//
  25.                
  26.     DDL_ZERO_STRUCT(stcConfig);//
  27.     DDL_ZERO_STRUCT(stcLPUartIrqCb);//
  28.     DDL_ZERO_STRUCT(stcMulti);//
  29.     DDL_ZERO_STRUCT(stcBaud);//
  30.     //DDL_ZERO_STRUCT(stcSclk);
  31.                          
  32.     Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE);//外设模式时钟使能
  33.     Sysctrl_SetPeripheralGate(SysctrlPeripheralLpUart1,TRUE);
  34.    
  35.                 Lpuart_PortInit();//管脚初始化
  36.        
  37.     stcLPUartIrqCb.pfnRxIrqCb   = RxIntCallback;//中断服务函数入口地址
  38.     stcLPUartIrqCb.pfnTxIrqCb   = NULL;
  39.     stcLPUartIrqCb.pfnRxFEIrqCb = NULL;
  40.     stcLPUartIrqCb.pfnPEIrqCb   = NULL;
  41.     stcLPUartIrqCb.pfnCtsIrqCb  = NULL;
  42.     stcConfig.pstcIrqCb = &stcLPUartIrqCb;
  43.     stcConfig.bTouchNvic = TRUE;
  44.           if(TRUE == stcConfig.bTouchNvic)
  45.         {
  46.                 EnableNvic(LPUART1_IRQn,IrqLevel3,TRUE);
  47.         }
  48.     stcConfig.enStopBit = LPUart1bit;//停止位
  49.    
  50.     /
  51.     stcConfig.enRunMode = LPUartMode1;//模式1
  52.     stcMulti.enMulti_mode = LPUartNormal;//正常模式
  53.                 LPUart_SetMultiMode(LPUART1,&stcMulti);//多机模式设置
  54.   //
  55.     //LPUart_SetMMDOrCk(LPUART1,LPUartEven);//偶校验
  56.        
  57.     LPUart_Init(LPUART1, &stcConfig);//串口初始化
  58.    
  59.     LPUart_SetClkDiv(LPUART1,LPUart8Or16Div);//采样分频
  60.    
  61.     stcBaud.u32Sclk = Sysctrl_GetPClkFreq();
  62.     stcBaud.enRunMode = LPUartMode3;
  63.     stcBaud.u32Baud = 9600;
  64.     u16Scnt = LPUart_CalScnt(LPUART1,&stcBaud);//波特率计算
  65.     LPUart_SetBaud(LPUART1,u16Scnt);//波特率值设置
  66.    
  67.                 LPUart_ClrStatus(LPUART1,LPUartRC);//清 接收中断请求
  68.     LPUart_EnableIrq(LPUART1,LPUartRxIrq);//使能接收中断
  69.     LPUart_EnableFunc(LPUART1,LPUartRx);//使能数据收发
  70. }

  71. //接收中断
  72. void RxIntCallback(void)
  73. {
  74.                 lPUART1_RX_BUF[lPUART1_RX_STA]=LPUart_ReceiveData(LPUART1);//读数据
  75.                 lPUART1_RX_STA++;       
  76. }



 楼主| 和下土 发表于 2022-6-28 15:38 | 显示全部楼层
测试代码
  1. u8 xxx=0;
  2. void USERT_SEND(void)
  3. {
  4.         if(lPUART1_RX_STA>5)//接收到数据
  5.         {
  6.                 for(xxx=0;xxx<lPUART1_RX_STA;xxx++)
  7.                 {
  8.                 LPUart_SendData(LPUART1,lPUART1_RX_BUF[xxx]);
  9.                 }
  10.                 lPUART1_RX_STA=0;
  11.         }
  12. }
 楼主| 和下土 发表于 2022-6-28 15:39 | 显示全部楼层
在主函数内循环,
hearstnorman323 发表于 2023-2-4 10:11 | 显示全部楼层
使用串口可以唤醒低功耗?              
您需要登录后才可以回帖 登录 | 注册

本版积分规则

114

主题

1405

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部