HC32L110C6UA使用内部38.4k时钟频率问题
华大例程中,低功耗串口使用的是默认的外部高速4M时钟频率,此时设置的串口初始化后,能够打印输出语句,但将系统时钟改到内部时钟38.4k或者32.768k时,不能进行输出打印功能 ,代码我贴在下面的评论区中,麻烦大家解答一下是什么问题,谢谢大家。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;
} lpuart_lpmode 这个例程就是使用内部 RCL 38.4k 时钟作为串口时钟源的,可以参照。 yang377156216 发表于 2024-11-4 10:24
lpuart_lpmode 这个例程就是使用内部 RCL 38.4k 时钟作为串口时钟源的,可以参照。 ...
好的,谢谢你 低功耗串口的波特率变得不认识了吧?
xch 发表于 2024-11-4 13:27
低功耗串口的波特率变得不认识了吧?
你的意思是在低功耗模式下不需要配置串口波特率吗? 本帖最后由 JacksonChen 于 2024-11-6 09:25 编辑
有人试过使用lpuart_lpmode例程的时候,他能使用printf输出打印吗?我尝试使用printf输出打印函数会出现卡死的情况,请问是什么原因导致的呢? 是不是低功耗串口只支持外部时钟源使用 要看时钟指示图 芯片手册时序图
页:
[1]