hc32l13启用内部高速时钟示例,开启串口打印,Sysctrl_ClkInit
时间: 2024-02-28 12:57:08 浏览: 156
STM32 通过外部时钟输入模式测量频率,串口打印
4星 · 用户满意度95%
好的,以下是 HC32L13 启用内部高速时钟并开启串口打印的示例代码:
```c
#include "hc32l13x.h"
#include "stdio.h"
void Sysctrl_ClkInit(void)
{
uint8_t u8Trimm;
stc_sysctrl_clk_cfg_t stcCfg;
// 使能内部高速时钟
Sysctrl_ClkSourceEnable(SysctrlClkXTAL32 | SysctrlClkHSX);
// 配置PLL
stcCfg.u32PllCfg = (SYSCTRL_PLLSRC_XTAL32 | SYSCTRL_PLL_MUL8);
stcCfg.enPllSrc = SysctrlPllSrcXTAL32;
stcCfg.enPllMul = SysctrlPllMul8;
Sysctrl_ClkCfg(&stcCfg);
// 配置FLASH读等待周期
Sysctrl_SetFlashWaitCycle(SysctrlFlashWaitCycle1);
// 配置HSB、APB0、APB1时钟
Sysctrl_SetHclkDiv(SysctrlHclkDiv1);
Sysctrl_SetPclkDiv(SysctrlPclk0Div1);
Sysctrl_SetPclkDiv(SysctrlPclk1Div1);
// 获取内部高速时钟的校准值
u8Trimm = Sysctrl_GetHsxClockTrimming();
// 配置串口引脚
Gpio_InitIOExt(GPIO_PORT_7, GPIO_PIN_0, GpioDirOut, TRUE, FALSE, FALSE, FALSE);
Gpio_InitIOExt(GPIO_PORT_7, GPIO_PIN_1, GpioDirIn, TRUE, FALSE, FALSE, FALSE);
// 配置串口
M0P_CLOCK->PERI_CLKEN0_f.UART0 = 1u;
M0P_CLOCK->PERI_CLKEN0_f.FCG_UART0 = 1u;
M0P_UART0->SCON_f.SM = 0u;
M0P_UART0->SCON_f.REN = 1u;
M0P_UART0->SCON_f.RI = 0u;
M0P_UART0->SCON_f.TI = 0u;
M0P_UART0->SCON_f.TB8 = 0u;
M0P_UART0->SCON_f.RB8 = 0u;
M0P_UART0->SCON_f.PM = 0u;
M0P_UART0->SCON_f.SYN = 0u;
M0P_UART0->SCON_f.FE = 0u;
M0P_UART0->SCON_f.OE = 0u;
M0P_UART0->SCON_f.PC = 0u;
M0P_UART0->SCON_f.SM2 = 0u;
M0P_UART0->SCON_f.SMA = 0u;
M0P_UART0->SBUF_f.DATA = 0u;
M0P_UART0->SADDR_f.ADDR = 0u;
M0P_UART0->SADEN_f.ADDEN = 0u;
M0P_UART0->SADEN_f.VALUE = 0u;
M0P_UART0->BAUD_f.BAUD = 416u;
M0P_UART0->BAUD_f.SM = 0u;
M0P_UART0->BAUD_f.BAUDEN = 1u;
M0P_UART0->BCON_f.BRGEN = 0u;
M0P_UART0->BCON_f.BRGVAL = 0u;
M0P_UART0->BCON_f.BRGSEL = 0u;
// 配置printf函数的输出端口为UART0
setbuf(stdout, NULL);
freopen("uart0://", "w", stdout);
}
int main(void)
{
Sysctrl_ClkInit();
printf("Hello, world!\n");
while (1)
{
// 程序运行到此处,会一直在串口上输出Hello, world!
// 可以在此处添加其他代码
}
return 0;
}
```
在上述代码中,我们首先使用 `Sysctrl_ClkSourceEnable` 函数使能了内部高速时钟和外部32kHz时钟,并使用 `Sysctrl_ClkCfg` 函数配置了PLL,使系统时钟频率为 64MHz。然后,我们使用 `Sysctrl_SetFlashWaitCycle` 函数配置了FLASH读等待周期为 1 个时钟周期。接着,我们使用 `Sysctrl_SetHclkDiv`、`Sysctrl_SetPclkDiv` 函数分别配置了 HSB、APB0、APB1 时钟分频,此处均为 1 分频。然后,我们使用 `Sysctrl_GetHsxClockTrimming` 函数获取了内部高速时钟的校准值,用于后续校准内部高速时钟。接着,我们使用 `Gpio_InitIOExt` 函数初始化了串口引脚,使用 `M0P_CLOCK` 和 `M0P_UART0` 宏定义访问了相关寄存器,对串口进行了初始化配置。最后,我们使用 `setbuf` 函数和 `freopen` 函数将 stdout 的输出端口改为 UART0,从而可以使用 `printf` 函数在串口上输出信息。
需要注意的是,在使用 printf 函数输出信息时,需要使用 `setbuf` 函数和 `freopen` 函数将 stdout 的输出端口改为 UART0,否则输出的信息将无法在串口上显示。
阅读全文