课题上的需要,自己之前没有接触过单片机,弄了一个星期,根据别人的改了一下,但是输出至DA的I/O口一直是低电平,也不知道出了什么问题。
#include"msp430f5529.h"
#include "msp430.h"
#define uchar unsigned char
#define uint unsigned int
uchar flag,a;
uint n;
uint t1;
unsigned long int t;
//=========定时器的初始化===========//
void Init(void)
{
n=0;
TBCTL=TBSSEL_2+MC_1; //SMCLK up_mode
TBCCTL0=CCIE;
TBCCR0=40000; //10ms
}
//===============OVER=============//
//==========时钟设置=================//
void ClkInit()
{
P2DIR |= BIT0;
P2OUT |= BIT0;
P3SEL = 0x00;
P3DIR = 0xFF;
P6SEL = 0x00;
P6DIR = 0xFF;
P5SEL |= BIT2|BIT3; //将IO配置为XT2功能
UCSCTL6 &= ~XT2OFF; //使能XT2
UCSCTL4 = UCSCTL4&(~(SELA_7))|SELA_1; //先将ACLK配置为VLOCLK
UCSCTL3 |= SELREF_2; //将REFCLK配置为REFCLK
while (SFRIFG1 & OFIFG)
{
UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG); // 清除三类时钟标志位 // 这里需要清除三种标志位,因为任何一种标志位都会将OFIFG置位
SFRIFG1 &= ~OFIFG; // 清除时钟错误标志位
}
UCSCTL4 = UCSCTL4&(~(SELS_7|SELM_7))|SELS_5|SELM_5; //将SMCLK和MCLK时钟源配置为XT2
}
//=================OVER=====================//
//===============捕获模式设置===================//
void Init_cap(void)
{
P1SEL |=BIT2; //选择P1.2作为捕获的输入端子
TA0CCTL1|=CM0+SCS+CCIS_0+CAP+CCIE; //上升沿触发,同步模式,使能中断
TA0CTL |=TASSEL1+ID_0; //选择4M-SMCLK时钟
}
//=================OVER=====================//
//================main=====================//
int main( void )
{
WDTCTL = WDTPW + WDTHOLD; //Stop watch dog timer to prevent time out reset
ClkInit(); //初始化时钟MCLK 4MHZ,SMCLK 4MHZ
P5DIR |= 0X60;
P5SEL |= 0X60;
Init_cap();
Init();
_EINT();
while(1);
}
//===========main OVER====================//
#pragma vector=TIMER0_A1_VECTOR
__interrupt void Timer_A(void)
{
switch(TA0IV) //TA中断向量查询
{
case 2: //是捕获中断 2为CCR1捕获中断向量值
n++;
break;
case 14: //是溢出中断
a++; //溢出次数自加1
break;
default:
break;
}
}
#pragma vector=TIMER0_B0_VECTOR
__interrupt void Timer_B(void)
{
TA0CCTL1 &= ~(CCIE); //关闭捕获中断
TBCCTL0 &= ~(CCIE); //关闭定时中断
t=a*65535+n;
t1=t*256/1500;
P2OUT |= BIT0;
P6OUT = t1;
P3OUT = t1;
}