<repo_name>StupidYR/MSP430<file_sep>/WDT_PWM.c
#include <msp430f5529.h>
void main(void)
{
	WDTCTL = WDTPW + WDTCNTCL + WDTSSEL1 + WDTIS_4;
        //WDTCTL：看门狗控制寄存器：16位
        //WDTPW：写入命令时，高八位固定为 0x5A（WDTPW）
        //WDTCNTCL：看门狗计时器清零
	//WDTSSEL1：选择ACLK（32.768 KHZ）作为参考时钟
        //WDTIS_4：间隔时间选择 （go to definition查看）
        //定时时间 = 参考时钟源周期 / 间隔时间 
        
	P1DIR |= BIT0;      // 设置P1.0端口为输出
	P1OUT ^= BIT0;      // 反转P1.0端口状态（与 1 异或）
        
	__bis_SR_register(LPM3_bits + GIE);	// 进入低功耗模式3，并启用中断
}

<file_sep>/TimerA_INT.c
#include <msp430f5529.h>

void clock_check();

void main(void)
{
    WDTCTL = WDTPW + WDTHOLD;    
    P1DIR |= BIT0;      
    P1OUT &= ~BIT0;      //P1.0端口输出模式
    
    TA0CCR0 = 62500;    //SMCLK -->DCOCLKDIV（1.048576MHZ） ; 
                       //定时周期500ms： 62500 = 500ms / (1 /（f_SMCLK / ID）) 
                       // TA0CCR0 最大值为 0xFF（65535）
    
    TA0CTL = TASSEL_2 + ID_3 + MC_1 + TACLR + TAIE;
                      //SMCLK作为时钟源；ID：8分频；增模式；清除TAR计数器；TAIFG中断使能
    
    clock_check();      //检查时钟源是否稳定
    
    _EINT();    //开启总中断
}

#pragma vector=TIMER0_A1_VECTOR        //TIMER0_A1含有CCR1、CCR2和 TAIFG 中断
                                       //TIMER0_A0仅含有CCR0
__interrupt void TIMER0_A1(void)       //定义一个名叫TIMER0_A1的中断函数
{
    TA0CTL &= ~TAIFG;   //清除中断标志位
    P1OUT ^= BIT0;      //LED闪烁
}
void clock_check()
{
    do
    {
      UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);
      SFRIFG1 &= ~OFIFG;        
    }while (SFRIFG1 & OFIFG);     
}<file_sep>/Watering_LED.c
#include<msp430f5529.h>

void watering_LED(void);

void main(void)
{
    WDTCTL = WDTPW + WDTHOLD;
    P1DIR |= BIT0;
    P8DIR |= BIT1 + BIT2;
    P1DIR |= BIT1 + BIT2+ BIT3 + BIT4 + BIT5;
    while(1)
    {
      P1OUT |= BIT0;
      __delay_cycles(3000);
      P1OUT &= ~BIT0;
      
      P8OUT |= BIT1;
      __delay_cycles(3000);
      P8OUT &= ~BIT1;
      
      P8OUT |= BIT2;
      __delay_cycles(3000);
      P8OUT &= ~BIT2;
      
      void watering_LED(void);
    }
}
void watering_LED(void)
{
    int i;
    for(i=BIT1;i<=BIT5;i++)
    {
      P1OUT |= i;
      __delay_cycles(3000);
      P1OUT &= ~i;
    }
}<file_sep>/LED_speed.c
#include<msp430f5529.h>
int flag=1;
void choose_delay();
void LED();
int main(void)
{
    WDTCTL = WDTPW + WDTHOLD;
    P1DIR |= BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5;
    P1OUT &= ~(BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5);
    P8DIR |= BIT1 + BIT2;
    P8OUT &= ~(BIT1 + BIT2);    //初始化LED的I/O口
    
    P1DIR &= ~BIT7;     //设置P1^7口为输入状态
    P1OUT |= BIT7;      //断后路
    P1REN |= BIT7;      //将P1^7口接上拉电阻
    P1IE |= BIT7;       //中断使能
    P1IFG &= ~BIT7;     //清除中断标志位
    P1IES |= BIT7;      //置1；设置下降沿触发
    __enable_interrupt();       //总中断使能
    
    while(1)
      LED();    //LED闪烁函数
}

#pragma vector = PORT1_VECTOR   //P1系列端口的总中断函数
__interrupt void port_1(void)   //定义一个名为port_1的中断函数
{
    while((P1IN & BIT7)==0);      //等待按键释放
    flag=~flag;
    P1IFG &= ~BIT7;       //清除中断标志位
}

void choose_delay()
{
   if(flag==0)
    __delay_cycles(100000);
  else
    __delay_cycles(200000);
}
void LED()
{
  P1OUT |= BIT0;
  P1OUT &= ~BIT5;
  choose_delay();
  
  P8OUT |= BIT1;
  P1OUT &= ~BIT0;
  choose_delay();
  
  P8OUT |= BIT2;
  P8OUT &= ~BIT1; 
  choose_delay();
  
  P1OUT |= BIT1;
  P8OUT &= ~BIT2;
  choose_delay();
  
  P1OUT |= BIT2;
  P1OUT &= ~BIT1;
  choose_delay();
  
  P1OUT |= BIT3;
  P1OUT &= ~BIT2;
  choose_delay();
  
  P1OUT |= BIT4;
  P1OUT &= ~BIT3; 
  choose_delay();
  
  P1OUT |= BIT5;
  P1OUT &= ~BIT4;
  choose_delay();
}
<file_sep>/FLL_DCO.c
/************** DCO：内部数字控制振荡源***************

  f_DCOCLK = D * (N + 1) * f_REFCLK / n

  f_DCOCLKDIV = (N + 1) * f_REFCLK / n

  t_delay = n x 32 x 32 x f_MCLK / f_REFCLK

注：D：FLLD 默认为FLLD_1，此时为二分频，D = 2
    N：FLLN 默认为FLLN = 31

    FLL的时钟是由REFCLK提供的
    f_REFCLK：REFCLK的参考时钟源的频率 默认为 XT1
    n：FLLREFDIV 默认为FLLREFDIV_0,此时为一分频，n = 1

*************************END**************************/

#include <msp430f5529.h>

void clock_check();
void IO_Init();

void main(void)
{
      WDTCTL = WDTPW + WDTHOLD;
// 配置DCO 为 2.45MHz
      UCSCTL3 = SELREF_2;           //选择REFO来作为FLL的参考时钟源（REFCLK）
      clock_check();                //检测时钟源是否稳定
      __bis_SR_register(SCG0);      // 关闭FLL控制；   如果不关闭的话，FLL寄存器不会改变
      UCSCTL0 = 0;                  // 配置 DCOx = 0 , MODx = 0 ；
      UCSCTL1 = DCORSEL_3;          // 配置DCO的频率范围 1.51————6.07 
      UCSCTL2 = FLLD_0 + 74;        // 配置FLL_D：一分频    配置FLL_N：74
      __bic_SR_register(SCG0);      // 开启FLL控制
      __delay_cycles(76563);        //
      clock_check();
      
      while(1)
      {
        //do do do something
      }
}   
void clock_check()
{
    while (SFRIFG1 & OFIFG);        // 监测振荡器故障标志
    {
        UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG); // 清除 XT2,XT1,DCO 的 fault flags
        SFRIFG1 &= ~OFIFG;         // 清除故障标志
    }
}

void IO_Init()
{
      P1DIR |= BIT0;                // ACLK 
      P1SEL |= BIT0;
      P2DIR |= BIT2;                // SMCLK 
      P2SEL |= BIT2;
      P7DIR |= BIT7;               // MCLK 
      P7SEL |= BIT7;
}
<file_sep>/Clock.c
/*****************Clock********************
            上电时的默认状态

MCLK：主系统时钟；DCOCLKDIV

SMCLK：子系统时钟；DCOCLKDIV

ACLK：辅助系统时钟；XT1（若XT1无效，则为REFO；其他情况切换为DCO）

系统稳定后，DCOCLK默认为 2.097152MHZ，
FLL默认2分频，则MCLK和SMCLK的频率都为1.048576MHZ。

此外FLL默认参照源为XT1

如果连接XT1和XT2的引脚不进行PxSEL的设置，那么这两个时钟源都是无效的；

REFOCLK、VLOCLK、DCOCLK默认状态下是可用的；


*******************END**********************/
#include <msp430f5529.h>

void clock_check();

void main(void)
{
    WDTCTL = WDTPW + WDTHOLD;    

    P1DIR |= BIT0;               // 启用第二功能 ACLK 
    P1SEL |= BIT0;
    P2DIR |= BIT2;               // 启用第二功能 SMCLK 
    P2SEL |= BIT2;
    P7DIR |= BIT7;               // 启用第二功能 MCLK 
    P7SEL |= BIT7;

    P5SEL |= BIT2+BIT3;          // 启用第二功能 XT2 IN/OUT
    UCSCTL6 &= ~(XT1OFF + XT2OFF);  // 使能XT1 & XT2 
    UCSCTL6 |= XCAP_3;           // 配置负载电容
        
    clock_check();

    UCSCTL6 &= ~XT2DRIVE0;       // 降低XT2 振荡器的工作频率，减少电流消耗
    UCSCTL4 |= SELA_0 + SELS_5;  // 选择 SMCLK, ACLK的时钟源 
    
    while(1)
    {
        //do do do something
    }
 }
void clock_check()
{
    while (SFRIFG1 & OFIFG)     // 监测振荡器故障标志
    {
    	UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);     // 清除 XT2,低频XT1,DCO 的故障标志 （fault flags）
    	
        SFRIFG1 &= ~OFIFG;       // 清除故障标志 
    }
}

<file_sep>/Interrupt.c
#include<msp430f5529.h>

void main(void)
{
    WDTCTL = WDTPW + WDTHOLD;
    P8DIR |= BIT1;
    P8OUT &= ~BIT1;
    
    P1REN |= BIT2;      //配置上拉电阻
    P1OUT |= BIT2;      //初始化端口电平
    P1IES &= ~BIT2;     //配置下降沿触发
    P1IFG &= ~BIT2;     //清除中断标志位
    P1IE |= BIT2;       //使能端口中断
    
    _ENIT();    //为__enable_interrupt()的宏定义；总中断使能
}

#pragma vector=PORT1_VECTOR     //使能P1端口的中断
__interrupt void Port_1(void)   //将中断函数命名为Port_1
{
    P8OUT |= BIT1;
    P1IFG &= ~BIT2;
}
<file_sep>/Button.c
#include<msp430f5529.h>

int key_flag=0;

void key_check(void);      //按键消抖——debounce

void main(void)
{
    WDTCTL = WDTPW + WDTHOLD;
    P1DIR |= BIT0;
    P1OUT &= ~BIT0;
    
    P1DIR &= ~BIT7;
    P1REN |= BIT7;       //配置P1^7口，接上拉电阻
    
    while(1)
    {
      key_check();
      
      if(key_flag == 1)
        P1OUT |= BIT0;
      else
        P1OUT |= BIT0;    
    }
}

void key_check(void)
{
    if(P1IN & BIT7 == 0)
    {
        __delay_cycles(1000);
        if(P1IN & BIT7 == 0)
        {
           key_flag = ~key_flag; 
        }
    }
}<file_sep>/Timer_PWM.c
/*********************Timer_A0****************************

P1.2引脚：输出Timer_A0_CCR1方波
P1.3引脚：输出Timer_A0_CCR2方波

TA0CTL：Timer_A0的控制寄存器

TA0CCTLn：Timer_A0的捕获 /比较控制 n寄存器（默认为比较模式）

TA0CCRn：Timer_A0的捕获 /比较 n寄存器        

************************END****************************/

#include <msp430f5529.h>

void clock_check();

void main(void)
{
      WDTCTL = WDTPW + WDTHOLD;
      P1DIR |= BIT2+BIT3;               
      P1SEL |= BIT2+BIT3;               // P1.2和P1.3引脚功能选为定时器输出
      
      clock_check();
      
      TA0CCR0 = 512-1;                  // 控制PWM周期
      //PWM周期 = (TA0CCR0 + 1) / f_TASSEL
      //此时    = 512 / 32.768K = 15.625us
      
      TA0CCTL1 = OUTMOD_7;              // CCR1比较输出模式7：复位/置位
      TA0CCR1 = 384;                    // CCR1：控制PWM占空比
      // 此模式下占空比 = TA0CCR1 / TA0CCR0  
      //此时            = 75%
      
      TA0CCTL2 = OUTMOD_7;              // CCR2 比较输出模式7：复位/置位
      TA0CCR2 = 128;                    // CCR2：控制PWM占空比
      //占空比为 25%
      
      TA0CTL = TASSEL_1 + MC_1 + TACLR;	
      //TASSEL：选择ACLK时钟源；MC：选择增计数模式；TACLR：清除TAR计数器
      
      __bis_SR_register(LPM3_bits);    	// 进入LPM3功耗模式
}
void clock_check()
{    
      do 
        {
          UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);
          SFRIFG1 &= ~OFIFG; 
        }
      while (SFRIFG1 & OFIFG);           
}
