#include <msp430x14x.h>
void Init_CLK(void);
void Init_TimerA(void);
//定义正弦表,并用32个抽样值初始化正弦表,不要用"0"抽样
int nSinTable[] = {
255,254,246,234,
219,199,177,153,
128,103,79,57,
37,22,10,2,
1,2,10,22,
37,57,79,103,
128,153,177,199,
219,234,246,255
};
int nCount;
void Init_CLK(void)
{
unsigned int i;
//将寄存器的内容清零
//XT2震荡器开启
//LFTX1工作在低频模式
//ACLK的分频因子为1
BCSCTL1 = 0X00;
do
{
// 清除OSCFault标志
IFG1 &= ~OFIFG;
for (i = 0x20; i > 0; i--);
}
while ((IFG1 & OFIFG) == OFIFG);
BCSCTL2 = 0X00;
//MCLK的时钟源为TX2CLK:2.048MHz,分频因子为0
BCSCTL2 += SELM1 + DIVM_0;
//SMCLK的时钟源为TX2CLK:2.048MHz,分频因子为1
BCSCTL2 += SELS + DIVS_0;
return;
}
void Init_TimerA(void)
{
nCount = 0;
// P1.2为输出
P1DIR |= BIT2;
// 选择P1.2为TA1管脚
P1SEL |= BIT2;
// 选择SMCLK,清除TAR
TACTL = TASSEL1 + TACLR;
// CCR0 中断允许
CCTL0 = CCIE;
// PWM周期为256
CCR0 = 256 - 1;
// CCR1输出模式为“复位/置位”模式
CCTL1 = OUTMOD_7;
CCR1 = nSinTable[nCount];
// 增记数模式
TACTL |= MC1;
return;
}
interrupt [TIMERA0_VECTOR] void Timer_A0_ISR(void)
{
nCount += 1;
if(nCount >= 32)
{
nCount = 0;
}
//将新的抽样值装入CCR1
CCR1 = nSinTable[nCount];
}
int main(void)
{
// 关闭看门狗
WDTCTL = WDTPW + WDTHOLD;
// 关闭中断
_DINT();
// 初始化
Init_CLK();
Init_TimerA();
// 打开中断
_EINT();
for(;;)
{
//CUP进入低功耗模式
_BIS_SR(LPM0_bits);
_NOP();
}
}