hc32l13启用内部高速时钟示例,开启串口,Sysctrl_ClkInit
时间: 2024-02-28 10:57:13 浏览: 121
好的,以下是 HC32L13 启用内部高速时钟并开启串口的示例代码:
```c
#include "hc32l13x.h"
void Sysctrl_ClkInit(void)
{
uint8_t u8Trimm;
stc_sysctrl_clk_cfg_t stcCfg;
// 使能内部高速时钟
Sysctrl_ClkSourceEnable(SysctrlClkHSX);
// 配置PLL
stcCfg.u32PllCfg = (SYSCTRL_PLLSRC_XTAL32 | SYSCTRL_PLL_MUL8);
stcCfg.enPllSrc = SysctrlPllSrcHSX;
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;
}
int main(void)
{
Sysctrl_ClkInit();
while (1)
{
// 程序运行到此处,可以在此处添加其他代码
}
return 0;
}
```
在上述代码中,我们首先使用 `Sysctrl_ClkSourceEnable` 函数使能了内部高速时钟,并使用 `Sysctrl_ClkCfg` 函数配置了PLL,使系统时钟频率为 64MHz。然后,我们使用 `Sysctrl_SetFlashWaitCycle` 函数配置了FLASH读等待周期为 1 个时钟周期。接着,我们使用 `Sysctrl_SetHclkDiv`、`Sysctrl_SetPclkDiv` 函数分别配置了 HSB、APB0、APB1 时钟分频,此处均为 1 分频。然后,我们使用 `Sysctrl_GetHsxClockTrimming` 函数获取了内部高速时钟的校准值,用于后续校准内部高速时钟。接着,我们使用 `Gpio_InitIOExt` 函数初始化了串口引脚,使用 `M0P_CLOCK` 和 `M0P_UART0` 宏定义访问了相关寄存器,对串口进行了初始化配置。
在初始化完成后,可以在主函数中添加其他代码。需要注意的是,由于我们没有将 stdout 的输出端口改为 UART0,因此无法使用 `printf` 函数在串口上输出信息。如果需要在串口上输出信息,需要使用 `printf` 函数并将 stdout 的输出端口改为 UART0,具体实现方法请参考上一个回答的示例代码。
阅读全文