打印
[牛人杂谈]

时钟源切换

[复制链接]
1487|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
734774645|  楼主 | 2017-4-24 23:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
        M451 系列处理器支持不同的时钟源,如果内部高速 RC 振荡器 22.1184MHz、内部低速 RC 振荡器 10KHz、外部 4~24MHz 高速晶振,不同的晶振用于不同的用途。当系统运行时对时序要求不高,同时节约外部晶振的成本时,可采用内部高速 RC。当系统对时序要求非常高,可采用外部高速晶振,例如产生精准的核心频率 48MHz、72MHz 或精确的定时操作。当系统对功耗非常敏感的场合,可以内核时钟的时钟源设置为内部低速 RC 振荡器 10KHz。



沙发
734774645|  楼主 | 2017-4-24 23:08 | 只看该作者
1 void CLK_EnableXtalRC(uint32_t u32ClkMask)
位置:clk.c
功能:使能时钟源
参数:
u32ClkMask:选择时钟源来自内部高速 RC、外部高速晶振、内部低速 RC、。外部低速晶振。

2 uint32_t CLK_WaitClockReady(uint32_t u32ClkMask)
位置:clk.c
功能:检查当前时钟源状态
参数:
u32ClkMask:时钟源来自内部高速 RC、外部高速晶振、内部低速 RC、。外部低速晶振。

3 void CLK_SetHCLK(uint32_t u32ClkSrc, uint32_t u32ClkDiv)
位置:clk.c
功能:设置 HCLK 时钟源与分频值
参数:
u32ClkSrc:选择时钟源来自内部高速 RC、外部高速晶振、内部低速 RC、。外部低速晶振。
u32ClkDiv:HCLK 分频值。

使用特权

评论回复
板凳
734774645|  楼主 | 2017-4-24 23:09 | 只看该作者
#include "SmartM_M4.h"
/****************************************
*函数名称:Delay
*输 入:无
*输 出:无
*功 能:软件延时
******************************************/
VOID Delay(VOID)
{
UINT32 i=0x100000;
while(i--);
}
/****************************************
*函数名称:main
*输 入:无
*输 出:无
*功 能:函数主体
******************************************/
int32_t main(void)
{
UINT32 i=0;
PROTECT_REG
(
/* 使能外部晶振时钟(12MHz) */
CLK_EnableXtalRC(CLK_PWRCTL_HXTEN_Msk);
/* 等待外部晶振时钟(12MHz) */
CLK_WaitClockReady(CLK_STATUS_HXTSTB_Msk);
/* 选择 HCLK 时钟源为外部晶振,同时 HCLK 的分频值为 1 */
CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_HXT, CLK_CLKDIV0_HCLK(1));
)
/* 串口 0 波特率 115200bps */
UART0_Init(115200);
while(1)
{
PROTECT_REG
(
/* 使能外部晶振时钟(12MHz) */
CLK_EnableXtalRC(CLK_PWRCTL_HXTEN_Msk);
/* 等待外部晶振时钟(12MHz) */
CLK_WaitClockReady(CLK_STATUS_HXTSTB_Msk);
/* 选择 HCLK 时钟源为外部晶振,同时 HCLK 的分频值为 1 */
CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_HXT, CLK_CLKDIV0_HCLK(1));
)
printf("当前时钟源选择为外部晶振,请查看串口打印数据速度\r\n");
i=20;
while(i--)
{
printf("www.smartmcu.com\r\n");
Delay();
}
PROTECT_REG
(
/* 使能内部高速 RC(22.1184MHz) */
CLK_EnableXtalRC(CLK_PWRCTL_HIRCEN_Msk);
/* 等待内部高速 RC(22.1184MHz) */
CLK_WaitClockReady(CLK_STATUS_HIRCSTB_Msk);
/* 选择 HCLK 时钟源为内部高速 RC,同时 HCLK 的分频值为 1 */
CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_HIRC, CLK_CLKDIV0_HCLK(1));
)
printf("当前时钟源选择为内部高速 RC,请查看串口打印数据速度\r\n");
i=20;
while(i--)
{
printf("www.smartmcu.com\r\n");
Delay();
}
}
}


使用特权

评论回复
地板
734774645|  楼主 | 2017-4-24 23:10 | 只看该作者
[3]代码分析
a. 程序执行的时候,首先使能外部 12MHz 高速晶振为时钟源,调用 CLK_EnableXtalRC 函数进行设置。
b. 调用 CLK_WaitClockReady 函数检测当前输入时钟是否稳定。
c. 调用 CLK_SetHCLK 函数设置当前 HCLK 与时钟源同样的频率,即不进行分频。
d. 通过 for 循环和软件延时函数的组合,观察串口打印输出的间隔。
e. 过后,使能内部高速 RC 振荡器为时钟源,调用 CLK_EnableXtalRC 函数进行设置。
f. 调用 CLK_WaitClockReady 函数检测当前输入时钟是否稳定。
g. 调用 CLK_SetHCLK 函数设置当前 HCLK 与时钟源同样的频率,即不进行分频。
h. 通过 for 循环和软件延时函数的组合,观察串口打印输出的间隔。

使用特权

评论回复
5
zhuomuniao110| | 2017-4-25 13:22 | 只看该作者
时钟源就是晶振了,RC振荡器了,这些玩意儿。

使用特权

评论回复
6
wahahaheihei| | 2017-4-25 16:38 | 只看该作者
当系统对时序要求非常高,可采用外部高速晶振

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

197

主题

3445

帖子

14

粉丝