3.nrf52832裸机教程--系统时钟
来源:互联网 发布:资源最优化论文 编辑:程序博客网 时间:2024/05/17 22:00
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.768KHZNRF_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裸机教程--系统时钟
- 1.nRF52832裸机教程--开发环境搭建
- ARM裸机之系统时钟
- NRF52832时钟控制系统
- tiny6410裸机程序之二、系统时钟
- Exynos4412裸机开发系列教程--时钟管理
- OK6410裸机程序(二)——系统时钟
- ARM裸机编程系列----系统时钟与定时器
- 三、s3c2440 裸机 系统时钟和定时器的设置
- 1.6.ARM裸机第六部分-S5PV210的时钟系统
- S5PV210 系列(裸机八)之 时钟系统
- s3c2440 ARM9 裸机驱动第二篇—2440系统时钟
- 28335硬件教程-时钟系统
- s3c6410 裸机----时钟
- S3C2440 裸机时钟RTC
- TX2440裸机时钟-PWM
- 【裸机开发笔记】6410的系统时钟设置(上)---6410时钟控制逻辑框架分析
- 【裸机开发笔记】6410的系统时钟设置(上)---6410时钟控制逻辑框架分
- 微信扫一扫接口开发案例实现(第十课)
- Codeforces Gym
- Qt Linux 连MySQL出现libqsqlmysql.so路径问题
- 千锋web前端工程师头脑风暴:程序员逻辑思维养成记
- 从0开始,把自己项目提交到github
- 3.nrf52832裸机教程--系统时钟
- java常见异常
- python获取完整网页内容(即包括js动态加载的):selenium+phantomjs
- 我应该提交 vendor 目录中的依赖包吗
- 微信小店开发之跳转微信商品页接口(第十一课)
- javascript设计模式-单体singleton模式(2)
- python运算符和优先级
- [16-1-01]大型网站架构演化
- ntpdate hwclock