历史上的今天
今天是:2025年03月01日(星期六)
2020年03月01日 | MSP430时钟定性分析
2020-03-01 来源:eefocus
1.时钟参数
1.1 宏定义时钟注释
//宏定义外接时钟,设置时钟很重要
#define EXTAL_IN_XT1_HZ ( 32768)
#define EXTAL_IN_XT2_HZ (4000000)
//宏定义内部REFO,VLO时钟频率
#define VLOCLK_FREQUENCY ( 10000)
#define REFOCLK_FREQUENCY ( 32768)
1.2 时钟来源
switch(clk)
{
case CLOCK_XT1 :g_sClock.CLK.nHZ = EXTAL_IN_XT1_HZ;break;
case CLOCK_VLO :g_sClock.CLK.nHZ = VLOCLK_FREQUENCY;break;
case CLOCK_REFO :g_sClock.CLK.nHZ = REFOCLK_FREQUENCY;break;
case CLOCK_DCO :g_sClock.CLK.nHZ = g_sClock.DCO_FLL_Frequency;break;
case CLOCK_DCO_DIV:g_sClock.CLK.nHZ = g_sClock.DCO_FLL_Frequency;break;
case CLOCK_XT2 :g_sClock.CLK.nHZ = EXTAL_IN_XT2_HZ;break;
default :return;
}
1.3 时钟参数介绍
typedef enum
{
CLOCK_XT1, //XT1
CLOCK_VLO, //内部10K
CLOCK_REFO, //内部32768
CLOCK_DCO, //内部DCO,如果使用内部DCO作为时钟的话,需要先调用DCO_PLLConfig设置DCO频率
CLOCK_DCO_DIV, //DCO分频(分频为1且不允许修改,与DCO同频)
CLOCK_XT2, //XT2
}CLOCK_Source; //时钟源
1.4 时钟分表
时钟源 时钟频率(HZ) 时钟源 时钟频率(Hz)
CLOCK_XT1 32768(32.768k) CLOCK_DCO 自主设置倍频
CLOCK_VLO 10000(10k) CLOCK_DCO_DIV 同CLOCK_DCO
CLOCK_REFO 32768(32.768k) CLOCK_XT2 4000000(4M)
2.频率配置过程
2.1 XT1时钟配置初始化
/*******************************************************************************
* 函数名称:XT1_Config(STATUS status)
* 功能说明:设置是否使能XT1
* 参数说明:STATUS status:是否使能XT1
* 函数返回:无
* 使用示例:XT1_Config(ENABLE); //使能XT1
********************************************************************************/
static inline void XT1_Config(STATUS status)
{
if(status != DISABLE)
{
if(UCS->XT1_OFF == BIT_SET)
{
GPIO_MultiBits_Init(P5,(GPIO_Pin_4|GPIO_Pin_5),GPI|SEL); //选用 XT1 第二功能
UCS->XT1_OFF = RESET ; // 开启 XT1
do
{
UCS->XT1_LFOFFG = RESET; // 清除XT1,CLOCK_DCO 失效标志
SFRIFG1 &= ~OFIFG; //
}while (UCS->XT1_LFOFFG == BIT_SET); //
}
}
else
{
UCS->XT1_OFF = BIT_SET ; // 关闭 XT1
}
}
2.2 XT2时钟配置初始化
/*******************************************************************************
* 函数名称:XT2_Config(STATUS status)
* 功能说明:设置是否使能XT2
* 参数说明:STATUS status:是否使能XT2
* 函数返回:无
* 使用示例:XT2_Config(TRUE); //使能XT2
********************************************************************************/
static inline void XT2_Config(STATUS status)
{
if(status != DISABLE)
{
if(UCS->XT2_OFF == BIT_SET)
{
GPIO_MultiBits_Init(P5,(GPIO_Pin_2|GPIO_Pin_3),GPI|SEL); //选用 CLOCK_XT2 第二功能
UCS->XT2_OFF = RESET; //开启 CLOCK_XT2
do
{
UCS->XT2_OFFG = RESET;
SFRIFG1 &= ~OFIFG;
}while (UCS->XT2_OFFG == BIT_SET);
}
}
else
{
UCS->XT2_OFF = BIT_SET ; // 关闭XT2
}
}
2.3 内部时钟
CLOCK_VLO,CLOCK_REFO为内部时钟源,不需要配置和初始化。
2.4 DCO及DCO_DIV配置过程
由于DCO是可以自主倍频的,倍频函数为CLOCK_DCO_PLLConfig(FLLREF_Source, FLLREF_DIVx, uint32_t DCO_FLL_Fre),由于DCO_DIV分频为1且不允许修改,即DCO_DIV与DCO同频,下面好好分析一下倍频过程
2.4.1 时钟分频系数,共计6种选择
typedef enum
{
FLLREF_DIV_1 , //不分频
FLLREF_DIV_2 , //二分频
FLLREF_DIV_4 , //四分频
FLLREF_DIV_8 , //八分频
FLLREF_DIV_12 , //十二分频
FLLREF_DIV_16 , //十六分频
}FLLREF_DIVx; //FLL参考时钟分频
2.4.2 参考分频时钟,总计3个
typedef enum
{
FLLREF_XT1 =0u, //32.768k
FLLREF_REFO =2u, //10k
FLLREF_XT2 =5u //4M
}FLLREF_Source; //FLL参考时钟源
2.4.3 倍频函数
/*******************************************************************************
* 函数名称:CLOCK_DCO_PLLConfig(FLLREF_Source refsource, FLLREF_DIVx refdiv, uint32_t DCO_FLL_Fre)
* 功能说明:设置DCO频率,单位(HZ)
* 参数说明:FLLREF_Source refsource :参考时钟源
FLLREF_DIVx refdiv :参考时钟源分频系数
uint32_t DCO_FLL_Fre :DCO设置频率
* 函数返回:无
********************************************************************************/
void CLOCK_DCO_PLLConfig (FLLREF_Source refsource, FLLREF_DIVx refdiv, uint32_t DCO_FLL_Fre)
{
static const uint16_t ref_div_value[6]={1,2,4,8,12,16};
/*根据频率提高内核电压*/
//SetVcoreUp ( (DCO_FLL_Fre < 12MHz) ? 0 : ((DCO_FLL_Fre < 16MHz) ? 1 : ((DCO_FLL_Fre < 20MHz) ? 2 :3))); //设置内核电压
if(DCO_FLL_Fre < 12MHz)
SetVcoreUp (0x00); //设置内核电压
else if(DCO_FLL_Fre < 16MHz)
SetVcoreUp (0x01);
else if(DCO_FLL_Fre < 20MHz)
SetVcoreUp (0x02);
else
SetVcoreUp (0x03);
__bis_SR_register(SCG0); // 禁止倍频环FLL,
UCS->CTL0 = 0x0000; // 清零 DCOx, MODx
if (DCO_FLL_Fre < 0.63MHz) // fsystem < 0.63MHz
UCS->DCORSEL = 0;
else if (DCO_FLL_Fre < 1.25MHz) // 0.63MHz < fsystem < 1.25MHz
UCS->DCORSEL = 1;
else if (DCO_FLL_Fre < 2.5MHz) // 1.25MHz < fsystem < 2.5MHz
UCS->DCORSEL = 2;
else if (DCO_FLL_Fre < 5MHz) // 2.5MHz < fsystem < 5MHz
UCS->DCORSEL = 3;
else if (DCO_FLL_Fre < 10MHz) // 5MHz < fsystem < 10MHz
UCS->DCORSEL = 4;
else if (DCO_FLL_Fre < 20MHz) // 10MHz < fsystem < 20MHz
UCS->DCORSEL = 5;
else if (DCO_FLL_Fre < 40MHz) // 20MHz < fsystem < 40MHz
UCS->DCORSEL = 6;
else
UCS->DCORSEL = 7;
UCS->FLLREFDIV = refdiv;
UCS->SELREF = refsource;
float Fref_value;
if(refsource == FLLREF_XT2)
{
XT2_Config(TRUE);
Fref_value = (float)((uint32_t)EXTAL_IN_XT2_HZ/ref_div_value[refdiv]);
}
else if(refsource == FLLREF_XT1)
{
XT1_Config(TRUE);
Fref_value = (float)(EXTAL_IN_XT1_HZ/ref_div_value[refdiv]);
}
else if(refsource == FLLREF_REFO)
{
Fref_value = (float)(REFOCLK_FREQUENCY/ref_div_value[refdiv]);
}
uint16_t FLLN_VALUE = (uint16_t)((DCO_FLL_Fre/Fref_value+0.5f)-1u);
ASSERT(FLLN_VALUE < 1024,"CLOCK_DCO_PLLConfig","FLLN_VALUE不允许超过1023,请将DCO频率设低或者更换为更高频率的参考时钟源!"); //不允许超过1023,请将DCO频率设低或者更换为更高频率的参考时钟源
g_sClock.DCO_FLL_Frequency = DCO_FLL_Fre;
UCS->FLLN = FLLN_VALUE; //
UCS->FLLD = 0; //设置DCO分频
__bic_SR_register(SCG0); // 使能FLL
do
{
UCS->DCO_FFG = RESET; // 清除,CLOCK_DCO 失效标志
SFRIFG1 &= ~OFIFG; // 清除时钟失效标志
}while (UCS->DCO_FFG == BIT_SET); // 检查DCO失效标志
//将使用DCO作为时钟源的时钟频率值修改
if(UCS->SELM == CLOCK_DCO || UCS->SELM == CLOCK_DCO_DIV)
{
CLOCK_DIVx div = (CLOCK_DIVx)UCS->DIVM;
CLOCK_MCLK_Config ((CLOCK_Source)UCS->SELM, div);
}
if(UCS->SELS == CLOCK_DCO || UCS->SELS == CLOCK_DCO_DIV)
{
CLOCK_DIVx div = (CLOCK_DIVx)UCS->DIVS;
CLOCK_SMCLK_Config((CLOCK_Source)UCS->SELS, div);
史海拾趣
|
各位,我最近在调一块CPU是ARM926EJ-S的板子,用ADS 1.2写了一个bootloader,生成镜像格式是ELF格式,在用仿真器调试的时候发现,我在程序中定义的全局变量在内存中分配了空间,但是变量的值却是空的(此变量我在程序中是赋了初值的) ...… 查看全部问答> |
|
这是最新版的MSP430x2xxFamily User Guide.希望对大家有用 [ 本帖最后由 brbl01 于 2011-4-17 01:44 编辑 ]… 查看全部问答> |
|
我是刚接触嵌入式的,因为毕业设计的需要,设计一个网关。我想知道,我想选一块ARM芯片,不是核心板也不是开发板,他要能支持LINUX或者ANDRIOD操作系统,我只知道需要有MMU,但是ARM9以上系列的都满足,那对存储 ...… 查看全部问答> |
|
哪位开关电源的大神可以帮我解达一下关于UC3843电源芯片应用的问题吗,具体图如图所示, 哪位专家能帮我解释以下几点问题吗? 1. 图中Q303,Q305,Q305有什么作用吗?其中最下面的光耦是单片机出来的PWM控制信号。 2. D301是干什么用的?在UC384 ...… 查看全部问答> |
|
第32课:QT应用程序开发 (一)Linux系统下安装QT Creator集成开发环境1、打开Software Center2、搜索QT Creator(二)应用开发1、安装完成后,打开QT Creator2、新建项目工程3、编译,在PC上运行(三)将该例程放到开发板中运行1、设置环境变量在/ ...… 查看全部问答> |




