N76E003系统时钟
系统时钟源
N76E003共有3种系统时钟源,包括: 内部高速/低速振荡器、外部输入时钟。它们每一个都可以作为N76E003的
系统时钟源。开启不同的时钟源可能会影响到多功能引脚P3.0/XIN 。
内部振荡器
N76E003内部有两个RC振荡器,一个高速16MHz(HIRC)和一个低速10 kHz(LIRC)。它们都可被选择用作
系统时钟。通过设置HIRCEN (CKEN.5)位使能HIRC,设备上电时LIRC被使能。用户可设置OSC[1:0] (CKSWT
[2:1])为[0,0]选择HIRC作为系统时钟,设置OSC[1:0](CKSWT [1:0])为[1,0]选择LIRC作为系统时钟。注意:
N76E003上电后HIRC 和 LIRC都被使能,并且系统默认HIRC为系统时钟。当系统使用内部振荡器作为时钟源
时,XIN 自动作为普通I/O P3.0,用来扩展普通I/O数量。可以通过配置P3M1和P3M2寄存器来选择P3.0的输出模式。
23.2 系统时钟切换
N76E003可以通过软件设置CKSWT 和 CKEN寄存器切换时钟源。这给应用带来了很大方便。注意,这些特殊寄存器是写时效访问控制受TA保护寄存器。
在时钟源控制下,时钟源可以在外部时钟、内部时钟,甚至内部高速与低速之间自由的切换。
然而在切换时钟源时,必须确保待切换时钟源已稳定。因此,用户需要遵循以下设置步骤才能成功完成时钟源切换。
用户首先要通过配置CKEN寄存器打开目标时钟源,再通过查询CKSWT寄存器中对应的标志位,确定时钟源是否稳定,并且通过写OSC[1:0] (CKSWT[2:1])切换到目标时钟源。
这些步骤过后,将会成功的切换时钟源。如果用户关心功耗的话,可以将原先时钟源关闭了。如果不遵守以上步骤,硬件将会采取以下一些措施来应对这些违规的操作。
1.如果用户试图改变CKEN的值来关闭当前时钟源,设备将忽略这个操作。系统时钟维持现状,CKEN值不变。
2.如果用户试图改变OSC[1:0]的值来切换系统时钟,而待切换新时钟源未被打开,OSC[1:0]值将会被立即更新,但是系统时钟保持不变,CKSWTF (CLKEN.0)会被硬件置位。
3.如果用户切换系统时钟源,但是目标时钟源已经打开还没稳定,那么硬件会等待目标稳定后,再切换过去。在等待期间,设备继续以原来时钟源工作,并且CKSWTF会被置1。等到目标时钟源稳定后,标志位(见 CKSWT[7:3])被置位,时钟将会成功切换,CKSWTF会被硬件自动清0。



系统时钟除频
振荡频率(FOSC)通过配置除频寄存器CKDIV,整数倍(最大到1/510)除频后,再供给系统作为系统时钟(FSYS)。这一特征可以临时让MCU跑在很低的速度下来降低功耗。通过时钟除频,可以让MCU在正常工作模式下,很低的速度运行,确保其及时能够响应中断事件(比如空闲模式只能通过中断事件退出)。这有可能比空闲模式还要省电。这样,可以避免掉电模式情况下,需要等待振荡器重新起振的时间。CKDIV的值可以在任何时间被程序改变,除了不能在中断服务程序里改变。
系统时钟输出
N76E003提供一个CLO(P1.1)引脚可以输出系统时钟,该频率与FSYS 频率相同。通过设置CLOEN (CKCON.1)位打开这个功能。在掉电模式下CLO输出会停止,因为系统时钟已被关闭。注意当有干扰问题或是功耗问题时,用户最好关闭CLO输出。

用户首先要通过配置CKEN寄存器打开目标时钟源,

再通过查询CKSWT寄存器中对应的标志位,确定时钟源是否稳定,并且通过写OSC[1:0] (CKSWT[2:1])切换到目标时钟源。

#include "N76E003.h"
#include "SFR_Macro.h"
#include "Function_define.h"
#include "Common.h"
#include "Delay.h" //========================================================================
// The test process:
// 1. Power on is run as default HIRC, show LED Fsys tickle faster
// 2. toggle P3.0 to GND.
// 2. call modify Fsys code to LIRC.
// 3. LED tickle speed slowly than before.
//========================================================================
void main(void)
{ /* Note
MCU power on system clock is HIRC (16 MHz)
Please keep P3.0 HIGH before you want to modify Fsys to LIRC
*/ Set_All_GPIO_Quasi_Mode; // In Common.h define
set_CLOEN; // Also can check P1.1 CLO pin for clock to find the Fsys change.
set_P30;
while (P30) // when P3.0 keep high, clock out HIRC
{
clr_GPIO1; // Check LED output tickle time
Timer0_Delay1ms();
set_GPIO1;
Timer0_Delay1ms();
} ////------------------------------------------------------------------------------------------------------
///*********************************** Change system closk source ***************************************/
////------------------------------------------------------------------------------------------------------ ////***** HIRC enable part *****
// set_HIRCEN; //step1: enable HIRC clock source run
// while((CKSWT&SET_BIT5)==0); //step2: check ready
// clr_OSC1; //step3: switching system clock source if needed
// clr_OSC0;
// while((CKEN&SET_BIT0)==1); //step4: check system clock switching OK or NG
//
////***** LIRC enable part*****
////** Since LIRC is always enable, switch to LIRC directly
set_OSC1; //step3: switching system clock source if needed
clr_OSC0;
while((CKEN&SET_BIT0)==); //step4: check system clock switching OK or NG
clr_HIRCEN; ////-------------------------------------------------------------------------------------------------------- /*
Now Fsys = LIRC , LED tickle slowly.
*/
while()
{
clr_GPIO1; // Check LED output tickle time
clr_P00;
set_GPIO1;
set_P00;
}
/* =================== */
}
#define set_CLOEN CKCON |= SET_BIT1
set_CLOEN;

#define set_P30 P30 = 1
#define clr_P30 P30 = 0
////***** HIRC enable part *****
// set_HIRCEN; //step1: enable HIRC clock source run
// while((CKSWT&SET_BIT5)==0); //step2: check ready
// clr_OSC1; //step3: switching system clock source if needed
// clr_OSC0;
// while((CKEN&SET_BIT0)==1); //step4: check system clock switching OK or NG
//
////***** LIRC enable part*****
////** Since LIRC is always enable, switch to LIRC directly
set_OSC1; //step3: switching system clock source if needed
clr_OSC0;
while((CKEN&SET_BIT0)==); //step4: check system clock switching OK or NG
clr_HIRCEN;
set_HIRCEN;
用户首先要通过配置CKEN寄存器打开目标时钟源
#define set_HIRCEN BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;CKEN|=SET_BIT5;EA=BIT_TMP;


while((CKEN&SET_BIT0)==1); //step4: check system clock switching OK or NG
确定时钟源是否稳定
并且通过写OSC[1:0] (CKSWT[2:1])切换到目标时钟源
set_OSC1; //step3: switching system clock source if needed
clr_OSC0;
#define set_HIRCST BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;CKSWT|=SET_BIT5;EA=BIT_TMP;
#define set_LIRCST BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;CKSWT|=SET_BIT4;EA=BIT_TMP;
#define set_ECLKST BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;CKSWT|=SET_BIT3;EA=BIT_TMP;
#define set_OSC1 BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;CKSWT|=SET_BIT2;EA=BIT_TMP;
#define set_OSC0 BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;CKSWT|=SET_BIT1;EA=BIT_TMP; #define clr_HIRCST BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;CKSWT&=~SET_BIT5;EA=BIT_TMP;
#define clr_LIRCST BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;CKSWT&=~SET_BIT4;EA=BIT_TMP;
#define clr_ECLKST BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;CKSWT&=~SET_BIT3;EA=BIT_TMP;
#define clr_OSC1 BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;CKSWT&=~SET_BIT2;EA=BIT_TMP;
#define clr_OSC0 BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;CKSWT&=~SET_BIT1;EA=BIT_TMP;

while((CKEN&SET_BIT0)==1); //step4: check system clock switching OK or NG
判断是否稳定
N76E003系统时钟的更多相关文章
- 单片机成长之路(51基础篇) - 023 N76e003 系统时钟切换到外部时钟
N76e003切换到外部时钟的资料很少(因为N76e003的片子是不支持无源晶振的,有源晶振的成本又很高,所以网上很少有对N76e003的介绍).有图有真相: 代码如下: main.c #includ ...
- windows 系统时钟
偶然发现了一个函数用以查询操作系统的时钟间隔: BOOL WINAPI GetSystemTimeAdjustment( _Out_ PDWORD lpTimeAdjustment, _Out_ PD ...
- STM32学习笔记(六) SysTick系统时钟滴答实验(stm32中断入门)
系统时钟滴答实验很不难,我就在面简单说下,但其中涉及到了STM32最复杂也是以后用途最广的外设-NVIC,如果说RCC是实时性所必须考虑的部分,那么NVIC就是stm32功能性实现的基础,NVIC的难 ...
- STM32学习笔记:系统时钟和SysTick定时器
原文:http://blog.sina.com.cn/s/blog_49cb42490100s60d.html 1. STM32的时钟系统 在STM32中,一共有5个时钟源,分别是HSI.HS ...
- STM32F4_RCC系统时钟配置及描述
Ⅰ.概述 对于系统时钟应该都知道它的作用,就是驱动整个芯片工作的心脏,如果没有了它,就等于人没有了心跳. 对于使用开发板学习的朋友来说,RCC系统时钟这一块知识估计没怎么去配置过,原因在于开发板提供的 ...
- Linux 系统时钟(date) 硬件时钟(hwclock)
/********************************************************************* * Linux 系统时钟(date) 硬件时钟(hwclo ...
- DELPHI下读取与设置系统时钟
在DELPHI下读取与设置系统时钟 很多朋友都想在自己的程序中显示系统时间 这在DELPHI中十分容易 利用DateToStr(Date)及TimeToStr(Time)函数即可实现. 二者的函数原型 ...
- 安装WP8 SDK出现“根据当前系统时钟或签名文件中的时间戳验证时要求的证书不在有效期内”的解决办法
今天重装系统了,在安装WP8 SDK时,安装了一小部分就提示“根据当前系统时钟或签名文件中的时间戳验证时要求的证书不在有效期内”的错误. 根据错误提示,貌似跟时间有关,百度了下.果真.把系统时间往前调 ...
- MSP430主系统时钟以及430的低功耗设置
如何将系统时钟设置到外部高频晶体振荡器,430的MCLK默认的是DCO的,如何安全的从DCO切换到外部晶体振荡器,这是一个很重要的步骤,因为经过此步骤,可以极大地提高430的处理能力,DCO在内部,可 ...
随机推荐
- 利用MATLAB进行曲线拟合
软件环境:MATLAB2013a 一.多项式拟合 多项式拟合是利用多项式最佳地拟合观测数据,使得在观测数据点处的误差平方和最小. 在MATLAB中,利用函数ployfit和ployval进行多项式拟合 ...
- ASP.NET MVC使用Oauth2.0实现身份验证
随着软件的不断发展,出现了更多的身份验证使用场景,除了典型的服务器与客户端之间的身份验证外还有,如服务与服务之间的(如微服务架构).服务器与多种客户端的(如PC.移动.Web等),甚至还有需要以服务的 ...
- 使用ConcurrentLinkedQueue惨痛的教训【转】
转自:http://blog.csdn.net/jackpk/article/details/49634577 服务端原本有个定时任务对一个集合ArrayList 中的消息做处理. 因为考虑到处理消息 ...
- Python——with语句、context manager类型和contextlib库
目录 一.with语句 二.上下文管理器 三.contextlib模块 基本概念 上下文管理协议(Context Management Protocol) 包含方法 __enter__() 和 __e ...
- HttpClient后台post 请求webapi
1.请求方法 /// <summary> /// httpClient 请求接口 /// </summary> /// <param name="url&quo ...
- 机器学习——利用PCA来简化数据
降维技术的好处: 1.使得数据集更易使用 2.降低很多算法的计算开销 3.取出噪声 4.使得结果易懂 在已标注和未标注的数据上都有降维技术,降维的方法: 1.主成分分析(Principal Compo ...
- 树莓派挂载ntfs优盘
步骤一:解压安装NTFS-3G,使用如下命令. sudo apt-get install ntfs-3g 步骤二:配置挂载NTFS格式的移动硬盘 1. 首先得到NTFS分区的信息 sudo f ...
- Nginx初入
商城项目做了一个多月了,想到必须用到负载均衡,首先分享第一个demo,五月份上线后,会继续分享一系列相关知识. 在nginx根目录下,用了一个园友的批处理文件nginx.bat,用于启动和关闭ngin ...
- uva 548 Tree(通过后序,先序重建树+dfs)
难点就是重建树,指针參数的传递今天又看了看.应该是曾经没全然弄懂.昨天真没效率,还是不太专心啊.以后一定得慢慢看.不能急躁,保持寻常心,. 分析: 通过兴许序列和中序序列重建树,用到了结构体指针.以及 ...
- ★Wireshark基本介绍和学习TCP三次握手
之前写过一篇博客:用 Fiddler 来调试HTTP,HTTPS. 这篇文章介绍另一个好用的抓包工具wireshark, 用来获取网络数据封包,包括http,TCP,UDP,等网络协议包. 记得大学的 ...