3.nrf52832裸机教程--系统时钟
Posted wang328452854
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3.nrf52832裸机教程--系统时钟相关的知识,希望对你有一定的参考价值。
I.说明
作者:WXP(翱翔云端的鸟)
联系方式:328452854@qq.com || 13100610853(联系请注明CSDN)
申明:个人原创,转载请先经过本人同意!
要说的话:个人水平有限,写之前也看过许多大神的博客,不足之处,还请指正!有疑问欢迎大家联系我交流探讨!
II.环境
软件环境:KEIL-MDK v-5.23.0.0
硬件:nrf52832开发板
III.nRF52832时钟树
nrf52832的系统时钟可以从内部或者外部为系统提供时钟源。频率振荡器根据模块的个别要求分配,时钟分配是自动并且按照模块独立分配的,以限制未使用模块的电流消耗。
时钟树中的时钟如下:
● 64MHZ片上振荡器
● 64MHZ晶体振荡器,使用外部32MHZ晶体
● 32.768KHZ±250ppmRC振荡器
● 32.768KHZ晶体振荡器,使用外部32.768KHZ晶体
● 64MHZ振荡器生成的32.768KHZ振荡器
● 64MHZ片上振荡器
1. 高速时钟控制器:HFCLK clock controller
高速时钟控制器为系统提供如下时钟:
HCLK64M:64MHZ CPU时钟
PCLK1M:1MHZ外设时钟
PCLK16M:16MHZ外设时钟
PCLK32M:32MHZ外设时钟
高速时钟控制器的时钟源为:
HFINT:64MHZ内部振荡器
HFXO:64MHZ晶体振荡器
当系统请求从HFCLK控制器一个或多个时钟时,HFCLK将自动提供它们。如果系统不再要求从HFCLK提供时钟,则进入省电模式
这些时钟仅仅在系统工作的时候有效,当系统进入工作模式时,HFINT(64M内部振荡器)时钟源会自动开始提供所需的时钟
HFINT是在HFXO没有启动时作为时钟源响应HFCLK的请求。HFXO的启动可以由HFCLKSTART任务触发并由HFCLKSTOP任务关闭。当HFXO开始稳定运行时将产生一个HFCLKSTART事件
HFXO必须运行使用RADIO NFC或者与32.768KHZ RC振荡器相关的校准机制进行校准。
2. 低速时钟控制器:LFCLK clock controller
低速时钟源:
32.768KHZ RC振荡器---LFRC
32.768KHZ晶体振荡器---LFXO
32.768KHZ从HFCLK合成---LFSYNT
LFCLK时钟是在LFCLKSRC第一次被选择并且由LFCKKSTART任务触发启动的。如果LFXO被选择当做LFCLK的时钟源,LFCLK将先从32.768KHZ的RC振荡器获取时钟源,当LFXO开始启动之后自动切换到LFXO时钟源。当LFXO开始运行时将产生LFCLKSTARTED事件。
LFCLK时钟由LFCLKSTOP任务停止
在LFCLK运行时不允许写寄存器LFCLKSRC
IV.nRF52832时钟相关寄存器
1. TASKS_HFCLKSTART
0x40000000
启动HFCLK晶体振荡器
2. TASKS_HFCLKSTOP
0x40000004
停止HFCLK晶体振荡器
3. TASKS_LFCLKSTART
0x40000008
启动LFCLK时钟
4. TASKS_LFCLKSTOP
0x4000000C
停止LFCLK时钟
5. TASKS_CAL
0x40000010
开始校准LFRC振荡器
6. TASKS_CTSTART
0x40000014
启动校准定时器
7. TASKS_CTSTOP
0x40000018
停止校准定时器
8. EVENTS_HFCLKSTARTED
0x40000100
HFCLK振荡器启动
9. EVENTS_LFCLKSTARTED
0x40000104
LFCLK启动
10. EVENTS_DONE
0x0000010C
校准LFCLK RC振荡器完成事件
11. EVENTS_CTTO
0x00000110
校准时间超时
12. INTENSET
0x00000304
Bit0:RWHFCLKSTARTED
写1使能HFCLKSTARTED事件中断
读取时读到0表示中断禁止,1中断使能
Bit1: RW LFCLKSTARTED
写1使能LFCLKSTARTED事件中断
读取时读到0表示中断禁止,1中断使能
Bit3: RW DONE
写1使能DONE事件中断
读取时读到0表示中断禁止,1中断使能
Bit4:: RW CTTO
写1使能CTTO事件中断
读取时读到0表示中断禁止,1中断使能
13. INTENCLR
14. 0x00000308
禁止中断寄存器与INTENSET对应
15. HFCLKRUN
0x40000408
HFCLKSTART任务已经产生的状态通知
Bit0: R STATUS
0—HFCLKSTART任务没有产生
1—HFCLKSTART任务已经产生
16. HFCLKSTART
0x4000040C
HFCLK状态
Bit0:: R SRC HFCLK时钟源
0—64MHZ内部振荡器(HFINT)
1—64MHZ晶体振荡器(HFXO)
Bit16: R STATE HFCLK状态
0— HFCLK没有运行
1— HFCLK已经运行
17. LFCLKRUN
0x40000414
LFCLKSTART任务已经产生的状态通知
Bit0: R STATUS
0—LFCLKSTART任务没有产生
1—LFCLKSTART任务已经产生
18. LFCLKSTAT
0x40000418
LFCLK状态
Bit[1:0]: R SRC LFCLK时钟源
0—32.768KHZ RC振荡器
1—32.768KHZ晶体振荡器
2—32.768KHZ从HFCLK合成
Bit16: R STATE LFCLK状态
2— LFCLK没有运行
3— LFCLK已经运行
19. LFCLKSRCCOPY
0x4000041C
LFCLKSRC的复制,当LFCLKSTART任务已经产生时设置
Bit[1:0]: R SRC LFCLK时钟源
0—32.768KHZ RC振荡器
1—32.768KHZ晶体振荡器
2—32.768KHZ从HFCLK合成
20. LFCLKSRC
0x40000518
LFCLK时钟源
Bit[1:0]: RW SRC LFCLK时钟源
0—32.768KHZ RC振荡器
1—32.768KHZ晶体振荡器
2—32.768KHZ从HFCLK合成
Bit16: RW BYPASS 使能或禁止外部LFCLK晶体振荡器旁路
0— 禁止
1— 使能
Bit17: RW EXTERNAL 使能或禁止外部LFCLK晶体振荡器
2— 禁止
3— 使能
IV.nRF52832时钟配置方法
nrf5_SDK_14.2.0协议栈里面的时钟驱动定义比较复杂,使用了一个时钟控制块的结构体来初始化和管理系统时钟。
我们这里的裸机代码里可以简单的直接操作寄存器就行,可以使用时钟源来配置系统时钟
可以在上次的裸机代码中添加2个函数即可
void Bsp_LFCLK_Init()
NRF_CLOCK->LFCLKSRC = (CLOCK_LFCLKSRC_SRC_Xtal << CLOCK_LFCLKSRC_SRC_Pos);//使用外部32.768KHZ
//NRF_CLOCK->LFCLKSRC = (CLOCK_LFCLKSRC_SRC_RC << CLOCK_LFCLKSRC_SRC_Pos);//使用内如RC32.768KHZ
//NRF_CLOCK->LFCLKSRC = (CLOCK_LFCLKSRC_SRC_Synth << CLOCK_LFCLKSRC_SRC_Pos);//使用HFCLK生成的32.768KHZ
NRF_CLOCK->EVENTS_LFCLKSTARTED = 0;
NRF_CLOCK->TASKS_LFCLKSTART = 1;
while (NRF_CLOCK->EVENTS_LFCLKSTARTED == 0)
// Do nothing.
LFCLK低速时钟可以有3个来源:
外部32.768KHZ晶振
内部RC
HFCLK合成
void Bsp_HFCLK_Init_Extern()
NRF_CLOCK->EVENTS_HFCLKSTARTED = 0;
NRF_CLOCK->TASKS_HFCLKSTART = 1;
while (NRF_CLOCK->EVENTS_HFCLKSTARTED == 0)
// Do nothing.
由于HFCLK默认是由内部产生的64MHZ振荡器自动生成,所以这里只需要在意如果HFCLK使用外部晶振时候的配置,即开启一个TASKS_HFCLKSTART
参考我的工程
下载地址:
百度云盘: 链接:https://pan.baidu.com/s/1jH6wVGi密码:nldx
以上是关于3.nrf52832裸机教程--系统时钟的主要内容,如果未能解决你的问题,请参考以下文章