本章主要介绍系统控制器特性以及各功能函数的使用方法。
- 时钟管理
- 电源管理
- 电源电压监测
- 芯片复位
- 中断
3.1 时钟管理
系统控制器为JN516x微控制器提供时钟,主要分四个模块:系统时钟域、外设时钟域、CPU时钟域和32kHz时钟域。
系统时钟域
系统时钟是一个高速参考时钟,当芯片完全运行时,外围时钟和CPU时钟由它派生。此域的时钟来自以下之一:
- 外部32 mhz晶体振荡器
- 内部高速RC振荡器
该晶体振荡器由连接到设备引脚4和5的32MHz外部晶体驱动。该域将产生一个32兆赫兹系统时钟时,来自晶体振荡器。
未校准的RC振荡器名义上运行在27MHz,但可以校准到运行在大约32MHz。RC振荡器主要是为睡眠后的快速启动提供的,因为RC振荡器可以启动比晶体振荡器快得多。
当从RC振荡器获取系统时钟时,不应该使用无线电收发机和一些外围设备。系统时钟启动和源选择在第3.1.1节和第3.1.2节中描述。
外设时钟域
外设时钟来自于系统时钟,并作为包括调制解调器和基带处理器在内的片上外围设备的时钟参考。当系统时钟来自外部32MHz晶体振荡器,外设时钟工作在系统时钟频率的一半-外围时钟运行在16MHz。
CPU时钟域
CPU时钟是系统时钟的划分版本,用于作为微处理器和内存子系统的时钟参考。CPU时钟频率的选择请参见3.1.3。
32kHz时钟域
32kHz时钟域主要用于低功耗睡眠状态(但也用于JN516x设备上的随机数发生器-参见2.4节)。当处于睡眠模式时(见3.2.3节),CPU不运行,依赖于中断来唤醒它。中断可以由片上唤醒定时器(见第8章)或由外部源通过DIO引脚(见第5章)、片上比较器(见第4.3章)或片上脉冲计数器(见第11章)产生。唤醒计时器从32kHz域驱动。该域的32kHz时钟可以来自以下之一:
- 内部RC振荡器
- 外部晶体
- 外部时钟模块
晶体振荡器由连接到DIO9和DIO10的外部32kHz晶体驱动。如果使用,则外部时钟模块连接到DIO9上。
本域的源时钟选择请参见3.1.5节。
当芯片正常工作时,32kHz域仍然是活跃的,并且可以针对外围时钟进行校准,以提高计时精度-参见8.2节。
3.1.1 系统时钟启动和时钟源选择
正如3.1节介绍中所述,JN516x设备上的系统时钟有两种可能的来源:
- 内部高速RC振荡器
- 外部晶体振荡器
其中晶体振荡器提供了一个比RC振荡器更精确的时钟。复位后,JN516x设备从内部高速RC振荡器取其系统时钟。默认情况下,一旦晶体振荡器稳定(这可能需要高达1ms),就会自动切换到外部的32MHz晶体振荡器。应用程序代码在重置后立即执行。
一旦设备和系统时钟完全启动并运行,就可以使用函数**vAHI_SelectClockSource()更改系统时钟源。当前源时钟的标识可以通过调用函数bAHI_GetClkSource()**来获得。
注意:
如果外部晶体振荡器被用作系统时钟的源,一旦自动切换到晶体振荡器发生(bAHI_GetClkSource() == FALSE),函数**vAHI_OptimiseWaitStates()**应该被调用。该功能优化JN516x内部闪存和EEPROM的等待状态,根据系统时钟频率,以减少访问时间。
RC振荡器可以通过调用函数**bAHI_TrimHighSpeedRCOsc()**来校准以提高其频率精度。
当使用RC振荡器时,注意以下限制是很重要的:
- 未校准,RC振荡器将产生系统时钟频率的27 mhz±18%(如果校准或32 mhz±5%)
- 完整的系统不能运行在使用RC振荡器,可以执行代码,但它是不可能成功传输或接收无线电信号。此外,外围时钟可能不够精确,无法支持某些外围功能,如UART通信。
因此,在使用RC振荡器时,不应该尝试使用无线电收发机,而且JN516x外设应该特别小心使用。
3.1.2 休眠后系统时钟启动
默认情况下,在睡眠之后,JN516x设备从内部高速RC振荡器取其系统时钟,但执行一个自动切换到外部的32MHz晶体振荡器一旦晶体振荡器稳定(可以花费最多1ms)。因此,应用程序代码在睡眠之后立即执行。
可以继续使用内部高速RC振荡器(没有自动开关)。在这种情况下,在进入睡眠之前,有必要调用函数vAHI_EnableFastStartUp(),并选择了手动切换选项——这取消了对晶体振荡器的自动切换。
3.1.3 CPU时钟频率选择
JN516x设备提供一系列CPU时钟频率。默认情况下,源时钟频率减半以产生CPU时钟。因此:
- 使用外部晶体振荡器,32 mhz频率源会产生16兆赫的CPU时钟频率
- 使用未校准的内部高速RC振荡器,27 mhz源频率会产生CPU时钟频率为13.5 mhz(±18%)。
注意:高速RC振荡器的频率可以通过调用**bAHI_TrimHighSpeedRCOsc()**调整到校准的32MHz。
但是,可以使用函数bAHI_SetClockRate()来配置其他CPU时钟频率。为了分割源时钟以产生CPU时钟,必须指定一个分割因子。可能的除法因子有1、2、4、8、16和32:
- 32 MHz时钟源,然后可能的CPU时钟频率是1、2、4、8、16和32 MHz
- 27 MHz时钟源,然后可能的CPU时钟频率是0.84,1.17,3.38,6.75,13.5和27 MHz。
3.1.4 高温下系统时钟运行
当外部晶体振荡器在高温下工作时,通常超过85°C,这取决于振荡器的特性,它将运行得很快。在这种情况下,可能需要调用函数vAHI_ClockXtalPull()来降低(拉)频率,并将频率公差保持在IEEE 802.15.4标准规定的40ppm范围内。这种频率拉动是通过增加振荡器调谐电路中晶体负载电容来实现的。所需的额外电容必须在函数调用中指定,而且JN5169和其他JN516x设备之间的可用值不同。有关频率牵引的详细描述,请看vAHI_ClockXtalPull()描述。
3.1.5 32kHz时钟选择
正如3.1节介绍中所述,在JN516x设备上可以选择32kHz时钟的源。这个源时钟的选择在下面详细说明。
**注意:**默认的时钟源是内部的32kHz RC振荡器。只有在需要外部32kHz时钟源时,才需要调用下面描述的函数。一旦外部源被选择,就不可能切换回内部RC振荡器。
32kHz时钟可以选择来自外部晶体或时钟模块。可以使用函数**bAHI_Set32KhzClockMode()来选择这些外部时钟源之一。如果需要,这个函数应该在应用程序的开始处调用。
如果使用bAHI_Set32KhzClockMode()选择外部晶体振荡器,这个函数必须在定时器0和应用程序使用的任何唤醒定时器之前被调用,因为当切换时钟源到外部晶体时,这些计时器被函数使用。该功能启动外部晶体,可长达1秒稳定,并等待晶体准备好后再返回。
或者,如果需要外部晶体振荡器,函数可以调用vAHI_Init32KhzXtal()来启动crystal并立即切换到它。该功能直接返回,但时钟将需要1秒来稳定。在等待晶体稳定时,应用程序可以执行其他处理,或将JN516x设备置于睡眠模式——在睡眠的情况下,应用程序通常应该设置一个唤醒计时器,以在1秒后唤醒设备。
如果选择外部时钟模块(RC电路),可以通过使用函数vAHI_Trim32KhzRC()**设置电路的电流消耗来选择产生的时钟频率的准确性。
与外部时钟源的连接方式如下:
- DIO9外部时钟模块必须提供。您必须首先使用vAHI_DioSetPullup()函数禁用DIO9上拉功能;
- 外部晶体振荡器必须附在DIO9 DIO10。DIO9和DIO10的上拉会自动关闭。
**注意:**不需要显式地将DIO9或DIO10配置为输入,因为这是由bAHI_Set32KhzClockMode()和vAHI_Init32KhzXtal()自动完成的。
3.2 电源管理
本章节介绍如何通过集成外设API控制JN516x微控制器的电源。包括对片上外设的电源调节器的控制和低功耗睡眠模式的管理。
3.2.1电源域
JN516x微控制器具有多个电源域,如下所示:
- 数字逻辑域:该域提供CPU和数码外设以及无线收发机(包括加密协处理器和基带控制器)。从这个域到无线收发器的时钟可以由应用程序启用/禁用(见3.2.2节)。在睡眠期间,域总是没有电源。
- 模拟域:该域提供了ADC。当调用vAHI_ApConfigure()函数来配置模拟外设时,域被打开-参见第4章。在睡眠期间,域总是没有电源。
- RAM域:这个领域供应芯片上的RAM。在休眠期间,域可能被通电或未通电。
- 广播域:该域提供无线电收发器。在睡眠期间,域总是没有电源。
- VDD供应领域:这个领域供应后计时器,DIO,比较器和32 khz振荡器。域是由外部电源(电池)驱动的,并且总是通电。然而,唤醒计时器和32kHz振荡器可能在睡眠期间通电或无电。
CPU(数字逻辑域)和片上RAM的单独稳压器提供了实现不同低功耗睡眠模式的灵活性,允许内存供电(并维护其内容)或在CPU断电时不供电-有关睡眠模式的进一步信息,请参阅3.2.3节。
3.2.2 无线收发时钟
可以使用**vAHI_ProtocolPower()**函数启用/禁用无线收发器的时钟。然而,在重置或休眠之外禁用此时钟循环一定要小心。以下几点应该注意:
- Disabling this clock leaves the clock powered but disabled (gated)
- 禁用时钟丢失导致内部IEEE 802.15.4 MAC提供服务设置。因此,关闭时钟前必须保存当前MAC设置。在重新启用时钟时,MAC设置必须从保存的设置恢复
保存MAC设置,使用函数vAppApiSaveMacSettings()。恢复保存的MAC设置,使用函数vAppApiRestoreMacSettings()——时钟会自动重新启用,因为这个函数会调用vAHI_ProtocolPower()。 - 不调用vAHI_ProtocolPower()禁用内部时钟而802.15.4 MAC层提供服务是活跃的,否则单片机可能冻结。
- 时钟是禁用的,不要让任何调用堆栈,这可能导致堆栈试图访问相关的硬件,因此引发一个异常。
3.2.3 低功耗模式
JN516x微控制器能够进入许多低功耗模式,以便在设备不需要完全激活时节约电力。一般有两种低功耗模式,睡眠模式(包括深度睡眠)和瞌睡模式,如下所述。
睡眠和深度睡眠模式
在休眠模式下,大多数内部芯片功能都被关闭以节省电力,包括CPU和大多数片上外设。然而,DIO引脚的状态被保留,包括输出值和上拉启用,这保留了任何与外部世界的接口。片上RAM, 32kHz振荡器,比较器和脉冲计数器在睡眠期间可以任选地保持活跃。睡眠模式是使用函数vAHI_Sleep()启动的,当四种睡眠模式可以选择,这取决于RAM和32kHz振荡器是否要关机。32kHz振荡器和RAM在睡眠期间的意义概述如下:
- 32 khz振荡器:32 khz振荡器(内部RC、外部时钟或外部晶体),从理论上讲,是离开或停止运行期间的睡眠。然而,这个振荡器是由唤醒计时器使用的,如果唤醒计时器将被用于唤醒设备,则必须保持运行状态。此外,如果这个振荡器使用了外部源,不建议在进入睡眠模式时停止振荡器。
- 片上内存:RAM芯片上可以保持在睡眠中或删除。当微控制器完全激活时,应用程序、堆栈上下文数据和应用程序数据都保存在片上RAM中,但是如果关闭RAM的电源就会丢失。
另一种低功耗的选择是深度睡眠模式,在这种模式下,CPU、RAM、系统和32kHz时钟域都将断电。此外,任何外部闪存也会在深度睡眠模式下断电。这个选项显然比睡眠模式更省电。
注意:在正常睡眠模式下,外部NVM不会关闭电源。如果需要,可以使用vAHI_FlashPowerDown()函数关闭外部闪存设备,如果使用的是兼容的闪存设备,则必须在vAHI_Sleep()之前调用该函数。
微控制器可以从睡眠模式被以下之一唤醒:
- 外部中断
- 唤醒定时器中断(需要32 khz振荡器运行)
- 脉冲计数器中断
- 比较器中断
设备只能在复位线拉低或外部事件触发DIO引脚上的更改时从深度睡眠模式中唤醒。
当设备重新启动时,它将在冷启动或暖启动入口点开始处理,这取决于设备唤醒时的睡眠模式。
Doze模式
Doze模式是一种低功耗模式,在这种模式下,CPU、RAM、无线电收发器和数字外设保持供电,但CPU时钟停止(所有其他时钟正常继续)。这种模式比睡眠模式省电少,但可以更快地恢复到完全工作模式。瞌睡模式对于低功耗的很短时间非常有用——例如,在等待计时器事件或传输完成时。
通过调用函数vAHI_CpuDoze(), CPU可以进入瞌睡模式。它随后会被任何中断带出瞌睡模式。
3.2.4 电源状态
JN516x单片机的电源状态可以通过u16AHI_PowerStatus()函数来获取。
3.3 电源电压监测(SVM)
“brownout”是指某设备或系统的电源电压下降至低于预先定义的水平,可能妨碍或有害于该设备/系统的运作。
JN516x微控制器配有电源电压监视器(SVM)来检测停电情况。支持向量机可以通过集成外设API的功能进行配置和监控。
3.3.1 配置SVM
在JN516x设备的默认情况下,支持向量机特性会自动启用,并将限电电压设置为2.0V。检测到停电时,芯片将自动复位。
支持向量机设置可以通过调用函数从默认值更改vAHI_BrownOutConfigure(),它允许以下配置:
- SVM启用/禁用:SVM特性可以启用/禁用,如果配置函数被调用时,支持向量机是必需的,特征函数必须显式地启用。
- 电压级别可以设置为以下值之一:1.95 v, 2.0 v(默认),2.1 v, 2.2 v, 2.3 v, 2.4 v, 2.7 v和3.0 v
注意:在设备复位或休眠后,默认的SVM设置被重新安装。
3.3.2 监测电压
在启用SVM的情况下,可以通过三种方式之一监控JN516x设备的停电状态:自动复位、中断或轮询。下面描述了这些选项。
停电时自动复位
默认情况下,在电力不足时自动复位是启用的,但也可以通过函数vAHI_BrownOutConfigure()来启用/禁用。在芯片复位之后,应用程序可以通过调用函数bAHI_BrownOutEventResetStatus()来检查是否停电是复位的原因。
停电中断
当设备进入停电状态和/或退出停电状态时,可能会产生中断。这两个中断可以通过函数vAHI_BrownOutConfigure()单独启用/禁用。停电中断是系统控制器中断,由vAHI_SysCtrlRegisterCallback()函数注册的回调函数处理。
轮询停电
如果禁用了限电中断和自动复位(但SVM仍然启用),设备的限电状态可以通过u32AHI_BrownOutPoll()函数手动轮询获得。
3.4 重置
可以使用vAHI_SwReset()函数从应用程序中重置JN516x微控制器。该功能为芯片启动完整的复位序列,相当于将外部复位线拉低。注意在芯片复位期间,片上RAM的内容可能会丢失。
一个或多个外部设备也可以连接到复位线。因此,任何连接到这条线的外部设备都可能受到影响。