外设TIMER
时钟介绍
HFCLK:
① 又称之为高速时钟, 是 nRF5X SOC 的主时钟, 一般是 16MHZ。
② HFCLK 时钟有 2 个来源: 一个是内部 RC 振荡器(RC Oscillator),另一个是外部石英振荡器(Crystal Oscillator)。
③ 16MHZ 时钟信号通过高速时钟控制单元处理输出 3 个时钟信号:
1) 1MHZ 频率的外设时钟 PCLK1M,给 SOC 的外设使用。
2) 16MHZ 频率的外设时钟 PCLK16M,给 SOC 的外设使用。
3) 16MHZ 的 HCLK 的时钟, 供给 CPU 使用
LFCLK:
① 又称之为低速时钟, 是用来作 RTC 计时和唤醒的时钟信号, 频率为32.768K.LFCLK 。
②有 3 个时钟源:
1)一个是内部 RC 振荡器,
2)另外一个是外部石英振荡器,
3)还有一个是通过 16MHZ 的主时钟频率分频得到 32.768K 的信号。
③LFCLK 通过低速时钟控制单元输出 32K 的时钟信号给外设使用。
NRF51822定时器
三个定时器,分别是:TIMER0,TIMER1,TIMER2.
不同位宽决定了计数器的最大溢出时间。
instance | bit-width | capture/compare registers |
---|---|---|
TIMER0 | 8/16/24/32 | 4 |
TIMER1 | 8/16 | 4 |
TIMER2 | 8/16 | 4 |
定时器结构
TIMER 有以下几部分组成:
1) 计数时钟源。 有 1M、 16M 2 种时钟源。
2) 时钟源分频器。 用来设置分频, 范围是 2 的 0-9 次方。
3) 定时/计数模式选择。 用来配置 TIMER 工作在定时器模式还是计数器模式。
4) 定时/计数器位数。 8 位、 16 位、 24 位、 32 位可选择。
5) CC[n]寄存器。 CC 是捕捉、 比较的缩写。 CC 寄存器有 4 个。 当执行 CAPUTURE TASK(捕捉任
务)的时候, 当前内部计数器的值将会立刻被拷贝到 CC 寄存器。
6) 各任务、 事件等。
分频器
计算:
配置:
注:HFCLK无论哪种时钟源,均为16MHz,PRESCALER为一个4位分频器,分频值为0——15。当PRESCALER大于9后,分频始终为2的9次方,即最小频率f=16mhz / 2^9。
工作模式(MODE)
TIMER 有两种工作模式: 定时模式和计数模式。
当处于定时模式, 我们称之为定时器
当处于计数模式, 我们称之为计数器。
通过寄存器MODE进行设置,MODE = 0—>定时器;MODE= 1 —>计数器。
3 个任务:
1) START:启动定时/计数器
2) STOP:停止定时/计数器
3) SHUTDOWN:让定时/计数器掉电, 后续无法通过 START 来启动该定时/计数器, 除非重新复位。
定时/计数器位数设定
比较/捕获
定时器模式下设置比较(COMPARE)/捕获(CAPTURE)寄存器CC[n]的值,可以设置定时时间(Timer value),当定时时间的值和CC[n]寄存器的值相等时,将触发一个比较(COMPARE[n] event)事件。
计数器模式下通过设置一个CAPTURE TASK,当计数器的值和比较/捕获寄存器设定的值(Timer value)相等的时候,将产生一个捕获事件(Capture[n] event)。捕获的值将会存储到寄存器CC[n]中读取。
程序的配置
1) 设定工作模式
2) 设定预分频(计数器不适用)
3) 设定 CC[n]寄存器的值
4) 使能中断(中断模式)
5) 启动 START 任务
6) COMPARE EVENT 到来, 清除内部计数器的值, 清除中断(中断模式)
1s的定时器中断配置:
NRF_TIMER0->MODE = TIMER_MODE_MODE_Timer; //计数器模式
NRF_TIMER0->PRESCALER = 9; //9分频 31250HZ的FTIMER
NRF_TIMER0->BITMODE = TIMER_BITMODE_BITMODE_16Bit; //16位
NRF_TIMER0->CC[0]=31250; //CC=31250,1S后产生COMPARE EVENT
NRF_TIMER0->INTENSET = TIMER_INTENSET_COMPARE0_Msk ; //使能COMPARE 中断
NVIC_SetPriority(TIMER0_IRQn,3); //设定TIMER0中断优先级为3
NVIC_EnableIRQ(TIMER0_IRQn); //使能TIMER0中断
NRF_TIMER0->TASKS_START =1; //启动TIMER0