打印
[技术问答]

HC32L110C6UA使用内部38.4k时钟频率问题

[复制链接]
120|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
JacksonChen|  楼主 | 2024-11-4 09:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
华大例程中,低功耗串口使用的是默认的外部高速4M时钟频率,此时设置的串口初始化后,能够打印输出语句,但将系统时钟改到内部时钟38.4k或者32.768k时,不能进行输出打印功能 ,代码我贴在下面的评论区中,麻烦大家解答一下是什么问题,谢谢大家。

使用特权

评论回复
沙发
JacksonChen|  楼主 | 2024-11-4 09:57 | 只看该作者

en_result_t My_LPUart_Init(void)
{
    uint16_t timer = 0;
        uint32_t sclk  = 0;
       
    stc_lpuart_config_t                  stcConfig;                //串口整体配置结构体
    stc_lpuart_irq_cb_t                 stcLPUartIrqCb;        //串口中断回调函数结构体
    stc_lpuart_multimode_t                 stcMulti;                //串口多主机模式函数结构体
    stc_lpuart_sclk_sel_t                  stcLpuart_clk;        //串口时钟配置结构体
        stc_lpuart_mode_t                         stcRunMode;                //低功耗模式配置结构体
        stc_lpuart_baud_config_t        stcBaud;                //波特率配置结构体
    stc_bt_config_t                         stcBtConfig;        //基本定时器配置结构体
       
        lpuart_rx_head = lpuart_rx_tail = 0;
       
        memset(u8RxData , 0 , sizeof(u8RxData));
   
        //清空数据函数
        DDL_ZERO_STRUCT(stcConfig);
    DDL_ZERO_STRUCT(stcLPUartIrqCb);
    DDL_ZERO_STRUCT(stcMulti);
    DDL_ZERO_STRUCT(stcBaud);
    DDL_ZERO_STRUCT(stcBtConfig);
       
    //外设时钟使能
    Clk_SetPeripheralGate(ClkPeripheralLpUart,TRUE);//使能LPUART时钟
    Clk_SetPeripheralGate(ClkPeripheralBt,TRUE);
       
    //通道端口配置
    Gpio_InitIOExt(3,3,GpioDirOut,TRUE,FALSE,FALSE,FALSE);        //配置33引脚为输入模式RX
        Gpio_InitIOExt(3,4,GpioDirOut,TRUE,FALSE,FALSE,FALSE);        //配置34引脚为输出模式TX
   
        //拉低BRTS电平
        Gpio_InitIOExt(2,5,GpioDirOut,TRUE,FALSE,FALSE,FALSE);
        Gpio_SetIO(2,5,0);
       
    Gpio_SetFunc_UART2RX_P33();
    Gpio_SetFunc_UART2TX_P34();

        //低功耗时钟配置
        stcLpuart_clk.enSclk_sel = LPUart_Rcl;        //LPUart_Pclk;//时钟源选择
        stcLpuart_clk.enSclk_Prs = LPUartDiv1;        //分频选择
        stcConfig.pstcLpuart_clk = &stcLpuart_clk;
       
        stcRunMode.enLpMode = LPUartNoLPMode;//非低功耗或低功耗模式选择
        stcRunMode.enMode   = LPUartMode1;//工作模式选择
    stcConfig.pstcRunMode = &stcRunMode;
       
    stcLPUartIrqCb.pfnRxIrqCb = RxIntCallback;
    stcLPUartIrqCb.pfnTxIrqCb = NULL;
    stcLPUartIrqCb.pfnRxErrIrqCb = ErrIntCallback;
        stcConfig.pstcIrqCb = &stcLPUartIrqCb;
    stcConfig.bTouchNvic = TRUE;
       
    stcMulti.enMulti_mode = LPUartNormal;//mode2/3才有多主机模式
    stcConfig.pstcMultiMode = &stcMulti;
       
    LPUart_EnableIrq(LPUartRxIrq);
        LPUart_Init(&stcConfig);
       
    if(LPUart_Pclk == stcLpuart_clk.enSclk_sel)
                        sclk = Clk_GetPClkFreq();//外部高速4M时钟
    else if(LPUart_Rcl == stcLpuart_clk.enSclk_sel)
        sclk = 38400;//此处建议使用内部38.4K时钟,如果用户使用32.768K时钟的,此处更新成32768
    else
        sclk = Clk_GetHClkFreq();//sclk = 32768;
//        Clk_SetRCLFreq(ClkFreq32768);
//        Clk_SwitchTo(ClkRCL);
//        sclk = Clk_GetHClkFreq();//外部低速32.768K时钟

    stcBaud.bDbaud = 0u;//双倍波特率功能
    stcBaud.u32Baud = 2400u;//更新波特率位置
    stcBaud.u8LpMode = LPUartNoLPMode;//非低功耗模式
    stcBaud.u8Mode = LPUartMode1;//计算波特率需要模式参数 ----------- 模式选择这里就是配置数据位、停止位和校验位 8个数据位、1个停止位和无奇偶校验位
    timer = LPUart_SetBaudRate(sclk , stcLpuart_clk.enSclk_Prs , &stcBaud);
    stcBtConfig.enMD = BtMode2;
    stcBtConfig.enCT = BtTimer;
        stcBtConfig.enTog = BtTogEnable;
    Bt_Init(TIM2, &stcBtConfig);//调用basetimer2设置函数产生波特率
    Bt_ARRSet(TIM2,timer);
    Bt_Cnt16Set(TIM2,timer);
    Bt_Run(TIM2);
       
       
        LPUart_EnableFunc(LPUartRx);
        printf("timer:%d\r\n" , timer);
        printf("sclk=%d\r\n" , sclk);
        return Ok;
}

使用特权

评论回复
评论
JacksonChen 2024-11-4 09:59 回复TA
这个是初始化配置的函数,主函数只调用了该函数,然后就是wile(1)循环了 
板凳
yang377156216| | 2024-11-4 10:24 | 只看该作者
lpuart_lpmode 这个例程就是使用内部 RCL 38.4k 时钟作为串口时钟源的,可以参照。

使用特权

评论回复
地板
JacksonChen|  楼主 | 2024-11-4 10:33 | 只看该作者
yang377156216 发表于 2024-11-4 10:24
lpuart_lpmode 这个例程就是使用内部 RCL 38.4k 时钟作为串口时钟源的,可以参照。 ...

好的,谢谢你

使用特权

评论回复
5
xch| | 2024-11-4 13:27 | 只看该作者
低功耗串口的波特率变得不认识了吧?

使用特权

评论回复
6
JacksonChen|  楼主 | 2024-11-4 15:37 | 只看该作者
xch 发表于 2024-11-4 13:27
低功耗串口的波特率变得不认识了吧?

你的意思是在低功耗模式下不需要配置串口波特率吗?

使用特权

评论回复
7
JacksonChen|  楼主 | 2024-11-4 16:00 | 只看该作者
有人试过使用lpuart_lpmode例程的时候,他能使用printf输出打印吗?我尝试使用prntf输出打印函数会出现卡死的情况,请问是什么原因导致的呢?

使用特权

评论回复
8
caigang13| | 2024-11-5 07:59 | 只看该作者
是不是低功耗串口只支持外部时钟源使用

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

10

帖子

0

粉丝