Sysctrl_GetPClkFreq()
时间: 2024-03-21 20:44:16 浏览: 13
Sysctrl_GetPClkFreq()是一个函数,用于获取MCU的PCLK时钟频率。PCLK是MCU内部总线的时钟频率,通常用于控制外设时钟频率和计算定时器的计数值等。
在调用Sysctrl_GetPClkFreq()函数时,需要指定一个参数,该参数表示要获取的PCLK时钟源,可以选择HSI、HSE或PLL作为时钟源。函数会根据时钟源的配置和分频系数计算出PCLK时钟频率,并返回该值。
下面是Sysctrl_GetPClkFreq()函数的函数原型:
```
uint32_t Sysctrl_GetPClkFreq(uint32_t CLKSource);
```
其中,CLKSource参数可以选择以下值:
- SYSCLK_SRC_HSI:选择HSI作为时钟源
- SYSCLK_SRC_HSE:选择HSE作为时钟源
- SYSCLK_SRC_PLL:选择PLL作为时钟源
使用示例:
```
// 获取PCLK时钟频率
uint32_t pclk_freq = Sysctrl_GetPClkFreq(SYSCLK_SRC_HSI);
```
在使用该函数时,需要先配置好相应的时钟源和分频系数。如果时钟源和分频系数配置不正确,可能会导致计算出来的PCLK时钟频率与实际不符。
相关问题
hc32l13x 的Sysctrl_GetPClkFreq()
HC32L13X系列MCU的Sysctrl_GetPClkFreq()函数与其他系列的函数类似,也用于获取PCLK时钟频率。函数原型如下:
```
uint32_t Sysctrl_GetPClkFreq(void);
```
该函数无需传入参数,返回值为当前MCU的PCLK时钟频率。
在使用该函数前,需要先进行时钟配置。HC32L13X系列MCU的时钟系统包含多个时钟源和分频器,需要根据具体的需求进行相应的配置。以下是一个简单的HC32L13X系列MCU时钟配置的示例:
```
// 选择PLL作为系统时钟源
M0P_SYSCTRL->SYSCTRL0 = (M0P_SYSCTRL->SYSCTRL0 & ~SYSCTRL_SYSCTRL0_CKSW) | SYSCTRL_SYSCTRL0_CKSW_PLL;
// 配置PLL分频系数和倍频系数
M0P_SYSCTRL->PLLCTRL = (M0P_SYSCTRL->PLLCTRL & ~SYSCTRL_PLLCTRL_PLLMF) | (10 << SYSCTRL_PLLCTRL_PLLMF_POS);
M0P_SYSCTRL->PLLCTRL |= SYSCTRL_PLLCTRL_PLLEN;
// 配置PCLK分频系数
M0P_SYSCTRL->AHBCLKDIV = 1;
M0P_SYSCTRL->APBCLKDIV = 1;
```
在进行完时钟配置后,就可以调用Sysctrl_GetPClkFreq()函数获取当前的PCLK时钟频率了,例如:
```
// 获取PCLK时钟频率
uint32_t pclk_freq = Sysctrl_GetPClkFreq();
```
需要注意的是,HC32L13X系列MCU的时钟系统比较复杂,具体的时钟配置需要根据实际需求进行相应的调整和优化。
以下代码功能#include "ddl.h" #include "uart.h" #include "gpio.h" #include "flash.h" #include "sysctrl.h" #define T1_PORT (3) #define T1_PIN (3) volatile static uint8_t u8RxData; volatile static uint8_t u8TxCnt = 0; volatile static uint8_t u8RxCnt = 0; void App_UartCfg(void); void App_PortInit(void); void App_ClkCfg(void); int32 t main (void) { App_ClkCfg () ; App_PortInit () ; App_UartCfg(); while (1) { if(u8RxCnt>=1) { u8RxCnt = 0; Uart_SendDataIt(MOP_UART1, ~u8RxData); } } } void App_ClkCfg(void) { stc_sysctrl_clk_cfg_t sysctrl_clk_cfg; Sysctrl_SetPeripheralGate(SysctrlPeripheralFlash, TRUE); Flash_WaitCycle(FlashWaitCycle0); sysctrl_SetRCHTrim(SysctrlRchFreq8MHz); sysctrl_clk_cfg.enClkSrc = SysctrlClkRCH; sysctrl_clk_cfg.enHClkDiv = SysctrlHclkDiv1; sysctrl_clk_cfg.enPClkDiv = SysctrlPclkDiv1; Sysctrl_ClkInit(&sysctrl_clk_cfg); } void Uart1_IRQHandler(void) { if(Uart_GetStatue(M0P_UART1, UartRC)) { Uart_ClrStatus(M0P_UART1, UartRC); u8RxData = Uart_ReceiveData(M0P_UART1); u8RxCnt++; } if(Uart_GetStatus(M0P_UART1, UartTC)) { Uart_ClrStatus(M0P_UART1, UartTC); u8TxCnt++; } } void App_PortInit(void) { stc_gpio_cfg_t stcGpioCfg; DDL_ZERO_STRUCT(stcGpioCfg); Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE); stcGpioCfg.enDir = GpioDirOut; Gpio_Init(GpioPortA, GpioPin2, &stcGpioCfg); Gpio_SetAFMode(GpioPortA, GpioPin2, GpioAf1); stcGpioCfg.enDir = GpioDirIn; Gpio_Init(GpioPortA, GpioPin3, &stcGpioCfg); Gpio_SetAFMode(GpioPortA, GpioPin3, GpioAf1); } void App_UartCfg(void) { stc_uart_cfg_t stcCfg; DDL_ZERO_STRUCT(stcCfg); Sysctrl_SetPeripheralGate(SysctrlPeripheralUart1, TRUE); stcCfg.enRunMode = UartMskMode3; stcCfg.enStopBit = UartMsk1bit; stcCfg.enMmdorCk = UartMskEven; stcCfg.stcBaud.u32Baud = 9600; stcCfg.stcBaud.enClkDiv = UartMsk8Or16Div; stcCfg.stcBaud.u32Pclk = Sysctrl_GetPClkFreq(); Uart_Init(M0P_UART1, &stcCfg); Uart_ClrStatus(M0P_UART1, UartRC); Uart_ClrStatus(M0P_UART1, UartTC); Uart_EnableIrq(M0P_UART1, UartRxIrq); Uart_EnableIrq(M0P_UART1, UartTxIrq); EnableNvic(UART1_IRQn, IrqLevel3, TRUE); }
这段代码的功能是初始化系统时钟、串口、GPIO和Flash,然后配置UART1为中断模式,当接收到数据后将数据取反发送回去。具体实现如下:
1. App_ClkCfg()函数用于初始化系统时钟,使能Flash时钟并设置Flash等待周期,然后配置RCH时钟频率为8MHz,最后初始化系统时钟。
2. App_PortInit()函数用于初始化GPIO端口,将PA2配置为输出模式,PA3配置为输入模式,并设置PA2和PA3的复用功能为UART功能。
3. App_UartCfg()函数用于初始化UART1,将运行模式设置为模式3(即同时启用RX和TX),设置停止位为1位、奇偶校验位为偶校验、波特率为9600,时钟分频器为8或16分频,时钟源为PCLK。然后清除UART1的接收和发送中断标志位,使能UART1的接收和发送中断,并开启UART1的中断。
4. Uart1_IRQHandler()函数为UART1的中断服务函数,当接收到数据时,将数据取反后发送回去,同时增加接收计数器u8RxCnt;当一帧数据发送完成时,增加发送计数器u8TxCnt。
5. 在main函数中,无限循环等待接收到UART1的数据并进行处理。