This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

MSP430F5529LP开发板,我想实现100k左右的方波测频,然后输出和频率相关的直流电压

Other Parts Discussed in Thread: MSP430F5529

课题上的需要,自己之前没有接触过单片机,弄了一个星期,根据别人的改了一下,但是输出至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;
}

  • Lisen Guan 说:

    课题上的需要,自己之前没有接触过单片机,弄了一个星期,根据别人的改了一下,但是输出至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;  //t1是计算出来的值

    //能解释一下你的逻辑和算法吗?


    }