[牛人杂谈] CLK_SetCoreClock函数的妙用

[复制链接]
1351|3
 楼主| yiyigirl2014 发表于 2025-1-8 13:48 | 显示全部楼层 |阅读模式
tc, se, core, ck, ETC
我们先看这个M058S的库函数
  1. /**
  2.   * [url=home.php?mod=space&uid=247401]@brief[/url]      Set HCLK frequency
  3.   * @param[in]  u32Hclk is HCLK frequency
  4.   * [url=home.php?mod=space&uid=266161]@return[/url]     HCLK frequency
  5.   * [url=home.php?mod=space&uid=1543424]@Details[/url]    This function set HCLK frequency. The frequency unit is Hz. The range of u32Hclk is 25 MHz ~ 50 MHz.
  6.   *             The register write-protection function should be disabled before using this function.
  7.   */
  8. uint32_t CLK_SetCoreClock(uint32_t u32Hclk)
  9. {
  10.     uint32_t u32HIRCSTB;

  11.     /* Read HIRC clock source stable flag */
  12.     u32HIRCSTB = CLK->CLKSTATUS & CLK_CLKSTATUS_OSC22M_STB_Msk;

  13.     /* The range of u32Hclk is 25 MHz ~ 50 MHz */
  14.     if(u32Hclk > FREQ_50MHZ)
  15.         u32Hclk = FREQ_50MHZ;
  16.     else if(u32Hclk < FREQ_25MHZ)
  17.         u32Hclk = FREQ_25MHZ;

  18.     /* Switch HCLK clock source to HIRC clock for safe */
  19.     CLK->PWRCON |= CLK_PWRCON_OSC22M_EN_Msk;
  20.     CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk);
  21.     CLK->CLKSEL0 |= CLK_CLKSEL0_HCLK_S_HIRC;
  22.     CLK->CLKDIV &= (~CLK_CLKDIV_HCLK_N_Msk);

  23.     /* Configure PLL setting if HXT clock is stable */
  24.     if(CLK->CLKSTATUS & CLK_CLKSTATUS_XTL12M_STB_Msk)
  25.         u32Hclk = CLK_EnablePLL(CLK_PLLCON_PLL_SRC_HXT, u32Hclk);

  26.     /* Configure PLL setting if HXT clock is not stable */
  27.     else
  28.     {
  29.         u32Hclk = CLK_EnablePLL(CLK_PLLCON_PLL_SRC_HIRC, u32Hclk);

  30.         /* Read HIRC clock source stable flag */
  31.         u32HIRCSTB = CLK->CLKSTATUS & CLK_CLKSTATUS_OSC22M_STB_Msk;
  32.     }

  33.     /* Select HCLK clock source to PLL */
  34.     CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_PLL, CLK_CLKDIV_HCLK(1));

  35.     /* Disable HIRC if HIRC is disabled before setting core clock */
  36.     if(u32HIRCSTB == 0)
  37.         CLK->PWRCON &= ~CLK_PWRCON_OSC22M_EN_Msk;

  38.     return u32Hclk;
  39. }
函数内先判断参数在什么区间内,并将传递进来的HCLK时钟参数控制在合适的范围
介于25M到50MHz之间。
先设置时钟源为内部RC时钟源,并设置为HCLK时钟。
接下来判断 是否启用了外部时钟,如果启用了,作为PLL的时钟源,并使能PLL
如果没启用外部的时钟源,就将内部RC作为PLL时钟源,使能PLL
最后将PLL作为HCLK时钟源
所以该函数的最终目的都是将PLL作为HCLK时钟源。
 楼主| yiyigirl2014 发表于 2025-1-8 13:55 | 显示全部楼层
所以对HCLK时钟源要求不高可以直接使用 这一个函数就搞定

  1. #include <stdio.h>
  2. #include "M058S.h"

  3. #define PLLCON_SETTING  CLK_PLLCON_50MHz_HXT
  4. #define PLL_CLOCK       50000000

  5. void SYS_Init(void)
  6. {

  7.     /*---------------------------------------------------------------------------------------------------------*/
  8.     /* Init System Clock                                                                                       */
  9.     /*---------------------------------------------------------------------------------------------------------*/
  10.         CLK_SetCoreClock(FREQ_50MHZ);
  11.         CLK_EnableModuleClock(UART0_MODULE);
  12.         CLK_SetModuleClock(UART0_MODULE,CLK_CLKSEL1_UART_S_PLL,CLK_CLKDIV_UART(1));

  13.     /*---------------------------------------------------------------------------------------------------------*/
  14.     /* Init I/O Multi-function                                                                                 */
  15.     /*---------------------------------------------------------------------------------------------------------*/

  16.     /* Set P3 multi-function pins for UART0 RXD , TXD and CKO */
  17.     SYS->P3_MFP &= ~(SYS_MFP_P30_Msk | SYS_MFP_P31_Msk);
  18.     SYS->P3_MFP |= (SYS_MFP_P30_RXD | SYS_MFP_P31_TXD);

  19. }

  20. void UART0_Init()
  21. {
  22.     /*---------------------------------------------------------------------------------------------------------*/
  23.     /* Init UART                                                                                               */
  24.     /*---------------------------------------------------------------------------------------------------------*/
  25.     /* Reset UART0 */
  26.     SYS->IPRSTC2 |=  SYS_IPRSTC2_UART0_RST_Msk;
  27.     SYS->IPRSTC2 &= ~SYS_IPRSTC2_UART0_RST_Msk;

  28.     /* Configure UART0 and set UART0 Baudrate */
  29.     UART0->BAUD = UART_BAUD_MODE2 | UART_BAUD_MODE2_DIVIDER(__HXT, 115200);
  30.     UART0->LCR = UART_WORD_LEN_8 | UART_PARITY_NONE | UART_STOP_BIT_1;
  31. }

  32. /*---------------------------------------------------------------------------------------------------------*/
  33. /*  Main Function                                                                                          */
  34. /*---------------------------------------------------------------------------------------------------------*/
  35. int32_t main(void)
  36. {
  37.    
  38.     /* Unlock protected registers */
  39.     SYS_UnlockReg();

  40.     /* Init System, peripheral clock and multi-function I/O */
  41.     SYS_Init();

  42.     /* Lock protected registers */
  43.     SYS_LockReg();

  44.     /* Init UART0 for printf */
  45.     UART0_Init();

  46.     printf("\n\nCPU [url=home.php?mod=space&uid=72445]@[/url] %dHz\n", SystemCoreClock);

  47.     /*
  48.         This sample code will blinking LED on NuTiny EVB board of M058SSAN.
  49.         The I/O for LED is P2.3 or P3.6
  50.     */

  51.     printf("+---------------------------------------+\n");
  52.     printf("|    NuTiny EVB LED Sample Code         |\n");
  53.     printf("+---------------------------------------+\n");
  54.    
  55.     /* Init P3.6 to be output mode */

  56.                 GPIO_SetMode(P3,BIT6,GPIO_PMD_OUTPUT);
  57.    
  58.     while(1)
  59.     {      
  60.         /* Toggle P3.6 */
  61.         P36 ^= 1;
  62.         /* Delay 200ms */
  63.         CLK_SysTickDelay(200000);
  64.     }   
  65. }


 楼主| yiyigirl2014 发表于 2025-1-8 13:59 | 显示全部楼层
大家觉得我这个帖子艺术含量有多高?
我看很多人没用过这个函数,我也没用过,仔细研究发现,真是个一劳永逸的函数。
花开了相爱吧 发表于 2025-9-15 16:21 | 显示全部楼层
CLK_SetCoreClock 函数是新唐 M 系列 MCU 的核心时钟配置工具,能灵活设定内核运行频率。比如可按需将 M483 内核从默认低频切换到最高 192MHz 以提性能,或降频至低频来减功耗。调用时只需传入目标频率,函数会自动配置时钟源、分频系数,无需手动操作复杂寄存器,大幅简化时钟配置流程。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

230

主题

3676

帖子

10

粉丝
快速回复 在线客服 返回列表 返回顶部