|
本帖最后由 qinkaiabc 于 2014-3-8 02:46 编辑
/*************************************************
** 版权: 杭州利尔达科技有限公司
** 文件名: LSD-TEST430F5438-PMM1.c
** 版本: IAR 4.11B
** 工作环境:
** 作者:
** 生成日期:
** 功能: 利用PMM改变内核电压VCORE,在系统默认情况下,内核电压VCORE是1.4V,但在
// 很多情况下需要增加内核电压,因此需要调节内核电压。本程序通过调节内核电压,
// 从1.4V增加到1.8V. SVSML监控电压从1.34v增加到1.54v.SMCLK =8M,MCLK = 16M,ACLK = 32768
//
// MSP430x5438
// -----------------
// /|\| |
// | | |
// --|RST |
// | |
// | P1.0|-->LED
** 相关文件:
** 修改日志
**相关说明: 注意;1.时钟要能正常的工作,不会出现时钟失效,或者RERO 替代XT1 作为DCO 参考源
2.由于时钟频率大于12M因此需要调节VCORE来配合高速频率的要求。
*************************************************************/
#include "msp430x54x.h"
void Init_System(void);
void Init_PMM(void);
void Init_Clk(void);
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // 关看门狗
Init_System(); // 系统初始化
while(1)
{
P1OUT ^= BIT0; // LED 闪烁
for( unsigned int i = 0;i < 65000;i++); // 延迟
}
}
/*************************************************
函数(模块)名称:void Init_System(void)
功能: 该程序系统初始化
本函数(模块)调用的函数(模块)清单:
调用本函数(模块)的函数(模块)清单:
输入参数: void
输出参数: void
函数返回值说明 :void
使用的资源
其它说明:
*************************************************/
void Init_System(void)
{
P1DIR |= BIT0; //打开LED
P1OUT |= BIT0;
P11SEL|= BIT1 + BIT0 + BIT2; //SMCLK MCLK ACLK 设置为输出
P11DIR|= BIT1 + BIT0 + BIT2;
Init_PMM(); //PMM配置函数
Init_Clk(); //时钟配置函数
}
/*************************************************
函数(模块)名称:void Init_PMM(void)
功能: F5XX 电源管理初始化
本函数(模块)调用的函数(模块)清单:
调用本函数(模块)的函数(模块)清单:
输入参数: void
输出参数: void
函数返回值说明 :void
使用的资源
其它说明: 注意: SVSMLRRLX ,PMMCOREVX
*************************************************/
void Init_PMM(void)
{
PMMCTL0_H = 0xA5; //开PMM电源管理
SVSMLCTL |= SVSMLRRL_1 + SVMLE; //配置SVML电压
PMMCTL0 = PMMPW + PMMCOREV_2; //配置内核电压VCORE
while((PMMIFG & SVSMLDLYIFG ) == 0); //等待设置完成
PMMIFG &= ~(SVMLVLRIFG + SVMLIFG + SVSMLDLYIFG);//清零是为了等待置位,
if((PMMIFG & SVMLIFG) == 1)
//判断内核电压是否上升到SVML,当VCORE持续小于SVML的设定值,
//且SVMLIFG被清零,则SVMLIFG立即由硬件置位
while((PMMIFG & SVMLVLRIFG) == 0);
//如果没有达到SVML,则等待,VCORE值升高到SVML值以上时,
//标志位SVMLVLRIFG就置位
SVSMLCTL &= ~SVMLE; //关掉SVML模块
PMMCTL0_H = 0X00; //锁存配置
}
/*************************************************
函数(模块)名称:void Init_Clk(void)
功能: F5XX 单片机时钟初始化-16MHZ
本函数(模块)调用的函数(模块)清单:
调用本函数(模块)的函数(模块)清单:
输入参数: void
输出参数: void
函数返回值说明 :void
使用的资源
其它说明: 注意 : DCORSELX , P7SEL ,XT1DRIVER
*************************************************/
void Init_Clk(void)
{
P7SEL |= 0x03; // XT1起振
UCSCTL1 = DCORSEL_6; // 选择DCO的范围
UCSCTL2 |= 240; //设置DCO频率为16M
UCSCTL4 = SELM_3 + SELA_0 + SELS_4; // 设置 MCLK = DCOC,MCLK =DCO,ACLK=XT1
while (SFRIFG1 & OFIFG) //清除 OFIFG,and XT1OFFG ,DCOFFG
{
UCSCTL7 &= ~( XT1LFOFFG + DCOFFG);
SFRIFG1 &= ~OFIFG;
}
}
P7与XT1的起振有什么关系吗?? P7SEL |= 0x03; 若没有这句指令,LED不闪烁??为什么呢?可以解释一下么谢谢!!!
|
|