MSP430F149;二、基本时钟

官方代码


#include <msp430.h>

int main(void)
{
  WDTCTL = WDTPW +WDTHOLD;                  // Stop Watchdog Timer
  DCOCTL = DCO0 + DCO1 + DCO2;              // Max DCO
  BCSCTL1 = RSEL0 + RSEL1 + RSEL2;          // XT2on, max RSEL
  BCSCTL2 |= SELS;                          // SMCLK = XT2
  P5DIR |= 0x70;                            // P5.6,5,4 outputs
  P5SEL |= 0x70;                            // P5.6,5,5 options

  while(1)
  {
  }
}

自己写


#include "MSP430x14x.h"


int main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  

   
  /*DCO frequency select. */
  DCOCTL |=(BIT5+BIT6+BIT7);//=7;
  BCSCTL1 |= (RSEL0+RSEL1+RSEL2);//DCO MAX;
  
  /*ACLK*/
  //BCSCTL1 &= ~XTS;            //因为默认是0,所以可以不用设置;
  //BCSCTL1 &= ~(DIVA0+DIVA1);
  /*SMCLK*/
  BCSCTL1 &= ~XT2OFF;           //因为默认是1<关闭>,所以置1;
  BCSCTL2 &= ~SELS;             //1:外部时钟;0:DCO
  BCSCTL2 |= DIVS_1;            //2分频
  /*MCLK*/
  BCSCTL2 |= SELM_0;            //选择主系统的时钟源
  BCSCTL2 |= DIVM_0;            //1分频
  
  /*Oscillator fault interrupt enable*/
     __enable_interrupt();                     //开启中断;
//  IE1 |= OFIE;                  //中断使能;这个不能置一,不知道为啥,置一就有问题,官方提供的例子也没有使OFIE置一,感觉好奇怪
  do
  {

  IFG1 &= ~OFIFG;               //中断标志位清零
  
  /*DELAY*/
  __no_operation();
  
  }
  while(IFG1&OFIFG);            //没有振荡器置位则跳出循环
  
  P5DIR |= 0x70;                            // P5.6,5,4 outputs
  P5SEL |= 0x70;                            // P5.6,5,5 options  
  
  for(;;);
  
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MSP430F149是一款基于16位RISC架构的低功耗微控制器,它集成了实时时钟模块。下面是一个基于MSP430F149的实时时钟设计参考: 1. 定义时钟模块的引脚:VCC、GND、XTAL1和XTAL2。 2. 连接晶体振荡器:将晶体振荡器的XTAL1和XTAL2引脚分别连接到MSP430F149的P5.4和P5.5引脚。 3. 初始化时钟模块:使用MSP430F149的内部时钟源初始化时钟模块,并设置时钟模块的时钟频率。 4. 设置实时时钟:使用时钟模块提供的函数设置实时时钟时间和日期。 5. 运行时钟:启动时钟模块,让实时时钟开始计时。 6. 读取实时时钟:使用时钟模块提供的函数读取实时时钟时间和日期。 下面是一个示例代码,其中使用了MSP430F149的实时时钟模块: ```c #include <msp430.h> void rtc_init(void) { // 初始化时钟模块 RTCCTL01 |= RTCHOLD; // 停止实时时钟 RTCCTL01 &= ~(RTCHOLD | RTCMODE); // 使用外部晶体振荡器 RTCCTL01 |= RTCTEV_0 | RTCBCD; // 设置时钟频率和格式 RTCYEAR = 2021; // 初始化时间和日期 RTCMON = 1; RTCDAY = 1; RTCHOUR = 0; RTCMIN = 0; RTCSEC = 0; RTCCTL01 &= ~RTCHOLD; // 启动实时时钟 } int main(void) { WDTCTL = WDTPW | WDTHOLD; // 关闭看门狗 rtc_init(); // 初始化实时时钟 while (1) { // 读取实时时钟 int year = RTCYEAR; int mon = RTCMON; int day = RTCDAY; int hour = RTCHOUR; int min = RTCMIN; int sec = RTCSEC; // 输出时间和日期 printf("%04d-%02d-%02d %02d:%02d:%02d\n", year, mon, day, hour, min, sec); __delay_cycles(1000000); // 延时1秒 } return 0; } ``` 在这个示例中,我们使用MSP430F149的实时时钟模块来读取当前时间和日期,并输出到串口。你可以根据自己的需求,修改示例代码来实现你的实时时钟设计。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值