This is my code :
/****************************调试问题*************************************
1,当用DCO设置的频率太高的话,会使程序跑飞
2, TimerB 有定时器中断和溢出中断,注意理解
3,TimerB在转载时有问题,主要采用实时赋值的方法时,可正常运行
************************************************************************/
/******************************更新**************************************
3.21-1 1.将TBCCRx的赋值改为实时赋值
2.更改了算法,将浮点转换为定点运算,使运算更为快速
3.21-2 1.解决了占空比只能在50%~100%之间变化的问题
************************************************************************/
#include <msp430g2553.h>
#define Cp 360
/*----------系统频率--载波频率 调制波频率--最大脉宽--最小脉宽--*/
unsigned int sysHz=10, triHz=9, sinHz=50, HzMax=540, HzMin=15, HzM=555,N2,k=0;
/*--调制系数--MHz------KHz--------Hz-----------------微秒---*/
/*----------载波比----PI/N--PI/4--PI*3/4-Tc/4-Tc*m/4-sine[j]/q14--*/
unsigned int N_ts=180,PI_N,PI_25,PI_75,Tc_2,Tc_2m,Sine_Q14;
float m=0.9;
//unsigned int s[1204];
int sine[361]={0,286,572,857,1143,1428, //SIN值表,Q14格式有符号数
1713,1997,2280,2563,2845,
3126,3406,3686,3964,4240,
4516, 4790,5063,5334,5604,
5872,6138,6402,6664, 6924,
7182,7438,7692,7943,8192,
8438,8682,8923,9162,9397,
9630,9860,10087,10311,10531,
10749,10963,11174,11381,11585,
11786,11982,12176,12365,12551,
12733,12911,13085,13255,13421,
13583,13741,13894,14044,14189,
14330,14466,14598,14726,14849,
14968,15082,15191,15296,15396,
15491,15582,15668,15749,15826,
15897,15964,16026,16083,16135,
16182,16225,16262,16294,16322,
16344,16362,16374, 16382,16384, //;90
16382,16374,16362,16344,16322,
16294,16262,16225,16182,16135,
16083,16026,15964,15897,15826,
15749,15668,15582,15491,15396,
15296,15191,15082,14968,14849,
14726,14598,14466,14330,14189,
14044,13894,13741,13583,13421,
13255,13085,12911,12733,12551,
12365,12176,11982,11786,11585,
11381,11174,10963,10749,10531,
10311,10087,9860,9630,9397,
9162,8923,8682,8438,8192,
7943,7692,7438,7182,6924,
6664,6402,6138,5872,5604,
5334,5063,4790,4516,4240,
3964,3686,3406,3126,2845,
2563,2280,1997,1713,1428,
1143,857,572,286, 0, //;180
286,572,857,1143,1428,
1713,1997,2280,2563,2845,
3126,3406,3686,3964,4240,
4516, 4790,5063,5334,5604,
5872,6138,6402,6664, 6924,
7182,7438,7692,7943,8192,
8438,8682,8923,9162,9397,
9630,9860,10087,10311,10531,
10749,10963,11174,11381,11585,
11786,11982,12176,12365,12551,
12733,12911,13085,13255,13421,
13583,13741,13894,14044,14189,
14330,14466,14598,14726,14849,
14968,15082,15191,15296,15396,
15491,15582,15668,15749,15826,
15897,15964,16026,16083,16135,
16182,16225,16262,16294,16322,
16344,16362,16374, 16382,16384, //;90
16382,16374,16362,16344,16322,
16294,16262,16225,16182,16135,
16083,16026,15964,15897,15826,
15749,15668,15582,15491,15396,
15296,15191,15082,14968,14849,
14726,14598,14466,14330,14189,
14044,13894,13741,13583,13421,
13255,13085,12911,12733,12551,
12365,12176,11982,11786,11585,
11381,11174,10963,10749,10531,
10311,10087,9860,9630,9397,
9162,8923,8682,8438,8192,
7943,7692,7438,7182,6924,
6664,6402,6138,5872,5604,
5334,5063,4790,4516,4240,
3964,3686,3406,3126,2845,
2563,2280,1997,1713,1428,
1143,857,572,286, 0};
void DCO_SMCLK();
void CalInit();
void TimerAInit();
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
DCO_SMCLK();
CalInit(); //计算值初始化
TimerAInit(); //TimerB初始化
_EINT(); // Enable interrupts
for (;;)
{
_BIS_SR(CPUOFF); // CPU off
_NOP(); // Required only for C-spy
}
}
//---------------------------设置SMCLK的频率--------------------
void DCO_SMCLK(void) //设置MCLK SMCLK的频率为10MHZ 从DCO中获得
{
if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)
{
while(1);
}
DCOCTL = 0x60 + 0x00 ;//10MHz
BCSCTL1 = DIVA_0 + 0x0e ;
BCSCTL2 = SELM_0 + DIVM_0 + SELS + DIVS_0 ;
}
//----------------------------计算值初始化-----------------------------
void CalInit()
{
PI_N=1; //PI_N为PI与载波比的比值180/180
PI_25=120; //PI*2/3
Tc_2=275; //TC/(2*2)=110us/4,其计数周期为27.5us/0.1us=275
Tc_2m=247; //Tc*m/4=Tc_4*m=247//????????????????
N2=N_ts*2; //???????????????????
}
//-----------------------------TimerB初始化------------------------------
void TimerAInit(void)
{
TACTL |= TASSEL_2 + ID_0 + TACLR + TAIE;//+TBCLGRP_1; // smCLK, Clear TAR,分为三组挂载
TACCR0=555; //定时器计数周期,载波周期与两倍的系统周期的比
// TACCTL0 = OUTMOD_2;//+CLLD_1 ; // 在CCRx到0加载新比较器数据,PWM翻转/复位
TACCTL1 = OUTMOD_2;//+CLLD_1 ; // 在CCRx到0加载新比较器数据,PWM翻转/复位
// TACCTL2 = OUTMOD_2;//+CLLD_1 ; // 在CCRx到0加载新比较器数据,PWM翻转/复位
P2DIR|= BIT1+BIT2;
P1SEL |= BIT1+BIT2; // P2.2~P2.3 TB1~2 otion
// P3DIR |= BIT4+BIT5+BIT6+BIT7; // P3.4~P3.7 output
// P3SEL |= BIT4+BIT5+BIT6+BIT7; // P3.4~P3.7 TB3~6 otion
TACTL |= MC_3; // Start Timer_B in up/down mode
}
// -------------TimerA interrupt service routine-----------
#pragma vector=TIMER0_A1_VECTOR
__interrupt void TimerA_ISR(void)
{
TACTL&=~TAIFG;
unsigned int j;
int T_1,T_3,T_5;
unsigned long Tc2mSQ;
//-------------------------T_1--------------------------
j=k*PI_N;
if((j<360)&&(j>=180))
{
Tc2mSQ=((long)Tc_2m*sine[j]);
Tc2mSQ=Tc2mSQ>>14;
T_1=Tc_2-Tc2mSQ;
}
else
{
if(j>=Cp)
j=j-Cp;
Tc2mSQ=((long)Tc_2m*sine[j]);
Tc2mSQ=Tc2mSQ>>14;
T_1=Tc_2+Tc2mSQ;
}
//-------------------------T_2--------------------------
j=j+120;
if((j<360)&&(j>=180))
{
Tc2mSQ=((long)Tc_2m*sine[j]);
Tc2mSQ=Tc2mSQ>>14;
T_3=Tc_2-Tc2mSQ;
}
else
{
if(j>=Cp)
j=j-Cp;
Tc2mSQ=((long)Tc_2m*sine[j]);
Tc2mSQ=Tc2mSQ>>14;
T_3=Tc_2+Tc2mSQ;
}
//-------------------------T_3--------------------------
j=j+120;
if((j<360)&&(j>=180))
{
Tc2mSQ=((long)Tc_2m*sine[j]);
Tc2mSQ=Tc2mSQ>>14;
T_5=Tc_2-Tc2mSQ;
}
else
{
if(j>=Cp)
j=j-Cp;
Tc2mSQ=((long)Tc_2m*sine[j]);
Tc2mSQ=Tc2mSQ>>14;
T_5=Tc_2+Tc2mSQ;
}
if(T_1<HzMin)
T_1=0;
if(T_1>HzMax)
T_1=HzM;
if(T_3<HzMin)
T_3=0;
if(T_3>HzMax)
T_3=HzM;
if(T_5<HzMin)
T_5=0;
if(T_5>HzMax)
T_5=HzM;
TACCR1=T_1; //s[i];
//TBCCR3=T_3; //s[i+n];
// TBCCR5=T_5; //s[i+N2];
k++;
if(k>N2)
k=0;
}
This is the error:
Description Resource Path Location Type
<a href="file:/E:/ti/ccsv5/tools/compiler/dmed/HTML/10099.html">#10099-D</a> program will not fit into lnk_msp430g2553.cmd /SPWM2 line 56 C/C++ Problem
When I double clicked the error ,I went to the lnk_msp430g2553.cmd:
SECTIONS
{
.bss : {} > RAM /* GLOBAL & STATIC VARS */
.sysmem : {} > RAM /* DYNAMIC MEMORY ALLOCATION AREA */
.stack : {} > RAM (HIGH) /* SOFTWARE SYSTEM STAC
What should I do ? Can you give me some advice? TXS a lot.