实验5 系统时钟源
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
* 功 能:选择系统时钟源(主时钟源)
* 入口参数:source
*
XOSC_32MHz 32MHz晶体振荡器
*
RC_16MHz 16MHz RC振荡器
* 出口参数:无
* 返 回 值:无
************************************************************** ******/ void SystemClockSourceSelect(enum SYSCLK_SRC source) {
/************************************************************* ******** * 函数名称:main * 功 能:main函数入口 * 入口参数:无 * 出口参数:无 * 返 回 值:无
************************************************************** ******/ void main(void) {
/* 定义枚举类型 */ /************************************************************* *******/ enum SYSCLK_SRC{XOSC_32MHz,RC_16MHz}; // 定义系统时钟源(主时 钟源)枚举类型 /************************************************************* *******/ //定义led灯端口:p1.3, p1.4: #define LED3 P1_3 // P1_3定义为P1.3 #define LED4 P1_4 // P1_4定义为P1.4
图 1-23 高速时钟系统示意图
【实验步骤】 1.建立一个新项目 参照实验 1 操作步骤,在指定路径建立一个新的工作空间“Test05”,在该 空间下新建一个 IAR 项目“clockPrj.ewp” 并保存。 2.添加或新建程序文件 参照实验 1 的操作步骤, 往项目中添加或者新建程序文件 clock.c。 【实验相关代码】
CLKCONCMD.CLKSPD[b2..b0] = 000 时钟速度设置为32MHz
*/
else if(source == XOSC_32MHz)
{
CLKCONCMD &= 0x80;
}
/* 等待所选择的系统时钟源(主时钟源)稳定 */
clkconcmd = CLKCONCMD;
// 读取时钟控制寄存器
/************************************************************* ******** * 函数名称:delay * 功 能:软件延时
* 入口参数:无 * 出口参数:无 * 返 回 值:无
************************************************************** ******/ void delay(unsigned int time) { unsigned int i;
实验 5 系统时钟源(主时钟源)的选择
【实验目的】 通过本实验的学习,使实验者熟悉 CC2530 芯片系统时钟源(主时钟源)的 选择,掌握高速晶体振荡器或 RC 振荡器的配置和使用。 【实验内容】 编写 IAR 程序,实现分别选择 32MHz 晶体振荡器和 16MHz RC 振荡器作为 CC253x 系列片上系统的系统时钟源(主时钟源);并查看相同的 LED 闪烁代码在 这两种时钟源下的闪烁速度的区别。 【实验原理】 在 PM0 功耗模式下,可配置 32MHz 晶体振荡器或者 16MHz RC 振荡器作为系 统时钟,设置系统时钟需要操作两个缓存器 CLKCONCMD(时钟控制缓存器,如表 4-1 所示)和 SLEEPCMD(睡眠模式控制缓存器,如表 4-2 所示),高速时钟系统 如 图 1-23 所 示 , CLKCONCMD.OSC 用 于 选 择 系 统 时 钟 为 XTAL 或 RC , SLEEPCMD.MODE[1:0]设置为系统功耗模式为 0。
unsigned char clkconcmd,clkconsta;
/*
系统时钟源(主时钟源)选择16MHz RC振荡器,定时器tick设置为
16MHz,时钟速度设置为16MHz
CLKCONCMD.OSC32K[b7]不改变
32KHz时钟源选择保持先前设
置
CLKCONCMD.OSC[b6] = 1
系统时钟源(主时钟源)选择
/************************************************************* ******** * 函数名称:BlinkLeds * 功 能:闪烁LED * 入口参数:无 * 出口参数:无 * 返 回 值:无
************************************************************** ******/ void BlinkLeds(void) //闪烁LED {
unsigned char j; for(i = 0; i < time; i++) { for(j = 0; j < 240; j++)
{ asm("NOP"); // asm是内嵌汇编,nop是空操作,执行一个 指令周期
asm("NOP"); asm("NOP"); } } }
/************************************************************* ******** * 函数名称:init * 功 能:初始化系统IO,定时器T1控制状态寄存器 * 入口参数:无 * 出口参数:无 * 返 回 值:无
16MHz RC振荡器
CLKCONCMD.TICKSPD[b5..b3] = 001 定时器tick设置为16MHz
CLKCONCMD.CLKSPD[b2..b0] = 001 时钟速度设置为16MHz
*/
if(source == RC_16MHz)
{
CLKCONCMD &= 0x80;
CLKCONCMD |= 0x49; //01001001
LED3 = !LED3; LED4 = !LED4; delay(30000); // 延时 }
/************************************************************* ********
* 函数名称:SystemClockSourceSelect
}
/*
系统时钟源(主时钟源)选择32MHz晶体振荡器,定时器tick设置为
32MHz,时钟速度设置为32MHz
CLKCONCMD.OSC32K[b7]不改变
32KHz时钟源选择保持先前设
置
ห้องสมุดไป่ตู้
CLKCONCMD.OSC[b6] = 0
系统时钟源(主时钟源)选择
32MHz晶体振荡器
CLKCONCMD.TICKSPD[b5..b3] = 000 定时器tick设置为32MHz
init(); //调用初始化函数
int i; while(1) {
/* 选择16MHz RC振荡器作为系统时钟源(主时钟源) ,然后闪烁 LED */
SystemClockSourceSelect(RC_16MHz); for(i=0;i<8;i++)
BlinkLeds();
/* 选择32MHz晶体振荡器作为系统时钟源(主时钟源) ,然后闪烁
/************************************************************* *******/ #include "ioCC2530.h" // CC2530的头文件,包含对CC2530的寄存器、 中断向量等的定义 /************************************************************* *******/
LED */ SystemClockSourceSelect(XOSC_32MHz); for(i=0;i<8;i++) BlinkLeds();
}
} 3. 配置项目设置 参照实验 1 的操作步骤,配置项目设置。 4. 下载程序到 CC2530 参照实验 1 的操作步骤,下载程序到 CC2530 进行调试。 【思考题】 1. 为什么指示灯闪烁的频率不一样? 2. 可以设置比 32M 更高的频率吗?
************************************************************** ******/
void init(void) { P1SEL &= ~0x18;
P1DIR |= 0x018 ; LED3 = 0; LED4 =0; //灭 LED }
// 设置LED3、LED4为普通IO口 // 设置LED3、LED4为输出
CLKCONCMD
do
{
clkconsta = CLKCONSTA;
// 读取时钟状态寄存器
CLKCONSTA
}while(clkconsta != clkconcmd); // 直到CLKCONSTA寄存器的值与
CLKCONCMD寄存
// 器的值一致,说明所选
择的系统时钟源(主
// 时钟源)已经稳定 }