📄 430.c
字号:
#include <msp430x14x.h>
//#include <stdio.h>
unsigned int Succeed_ifg=0;
unsigned int Time_is_up_reg=0;
unsigned int Start_Count_ifg=0;
unsigned long int Frequency_reg=0;
void Init_TACCR0(void)
{
TACCR0 = 5000; //8000000/8/5000=200Hz
TACTL = 0X02C4; //MCLK,1/8分频
TACCTL0 =0X0080;
TACTL |= MC0;//增计数模式
//TACTL |= MC1+MC0;//增/减计数模式
TACCTL0 |= CCIE;//允许TA0中断
}
void stop_TACCR0(void)
{
TACCTL0 &= ~CCIE;
}
void Init_TBCCR0(void)
{
TBCCR0 = 50000;
//TBCTL=TBSSEL_2+TBCLR+MC_2+ID_0;
TBCTL=TBSSEL_0+TBCLR+MC_2+ID_0;
TBCCTL0 =0X0080;
//TBCTL |= MC0;//增计数模式
//TBCCTL0 |= CCIE;//允许TB0中断
}
void stop_TBCCR0(void)
{
TBCTL &= ~MC0;
}
void Delay_ms(unsigned int nValue)//毫秒为单位,8MHz为主时钟 用32768要修改
{
unsigned int nCount;
unsigned int ii;
unsigned int jj;
nCount = 1331;//8000000*0.001/1332/6个Tj=1
for(ii = nValue;ii > 0;ii--)
{
for(jj = nCount;jj > 0;jj--);
}
return;
}
////////////////////////////////////////////////
void main(void)
{
WDTCTL = WDTPW +WDTHOLD; // Stop WDT
DCOCTL = 0X60; //默认值
BCSCTL1 = 0X07; //由打开XT2.选用低频模式,
do
{
IFG1 &= ~OFIFG; // 清除OSCFault标志
for (unsigned int ii = 0x20; ii > 0; ii--);
}
while ((IFG1 & OFIFG) == OFIFG); // OSCFault == 1
BCSCTL2 =0X88; //选用XT2晶振
P1DIR |= BIT2; // P1.2 output
P1SEL |= BIT2; // P1.2 TA1/2 otions
P4DIR = 0X7F; //P4.0接口作为捕获输入端口
P4SEL|=BIT7; //选择设备输入
//P4SEL |=BIT7;
/***************用作测试DCO的实际发生频率*************************************
P1DIR|=BIT4;
P1SEL|=BIT4;
经直接测量知道SMCLK的频率为0.76-0.78MHz,可通过此频率与程序所得相比较,验证是否正确
*****************************************************************************/
//TACTL |= MC1; // Start Timer_A in continuous mode
_EINT(); //开总中断
Init_TBCCR0(); //初始化外部计数
while(1)
{
Succeed_ifg = 0;
Time_is_up_reg = 0;
Init_TACCR0(); //准备定时
while(!Succeed_ifg); //等待测量结束
//printf("Fre = %ld\n",Frequency_reg);
//这里可以加输出显示程序
Succeed_ifg = 0;//断点执行到这里可以看到Frequency_reg的值
Delay_ms(500);
//while(Succeed_ifg);
}
}
//200Hz 用32768要修改
#pragma vector=TIMERA0_VECTOR
__interrupt void TimerA0(void)
{
if(!Time_is_up_reg)
{
//Start_Count_ifg = 1;//TB中断中判断这个标志开始计数
stop_TBCCR0();
TBR = 0;
TBCTL |= MC0;//增计数模式
Time_is_up_reg = 1;
}
else
{
//Start_Count_ifg = 0;//TB中断中判断这个标志停止计数
Time_is_up_reg++;
if(Time_is_up_reg >= 21) //0.1秒到了 20+1
{
Succeed_ifg = 1; //主程序中判断这个来开始计算
Frequency_reg = TBR;
Frequency_reg *= 10;
stop_TACCR0();
stop_TBCCR0();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -