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

原创粉丝点击