我们的产品使用 MSP430FR2310的计时器功能、P1.6引脚使用 IO 功能输出高电平和低电平、以生成 PWM 信号。 在测试期间、我们发现使用 CCS 仿真调试时、信号为10kHz、10%。 但是、在退出调试模式后、在正常工作模式下、它将成为7.53KHZ 10%的信号。 调试模式下的时钟频率是否比正常工作模式下的时钟频率快? 程序代码如下所示。
int main (空)
{
WDTCTL = WDTPW | WDTHOLD;//停止 WDT
P1OUT &=~BIT6;
//配置 GPIO
P1DIR |= BIT6;//| BIT2;// P1.6输出
_bis_SR_register (SCG0);//禁用 FLL
_DELAY_CYCLES (80);
CSCTL3 |= SELREF_REFOCLK;//将 REFO 设置为 FLL 基准源
_DELAY_CYCLES (80);
CSCTL1 = DCOFTRIMEN_1 | DCOFTRIM0 | DCOFTRIM1 | DCORSEL_3;// DCOFTRIM = 3、DCO 范围= 8MHz
CSCTL2 = FLLD_0 + 243;// DCODIV = 8MHz
__DELAY_CYCLES (800000);//100ms 开机延迟;
对于(ADC_Cnt = 0;ADC_Cnt < 16;ADC_Cnt++){
adc_buf[adc_cnt]= 60;
}
ADC_Cnt = 0;
ADC_Result_sum = 400;
//配置 ADC A1引脚
P1SEL0 |= BIT4;
P1SEL1 |= BIT4;
//禁用 GPIO 上电默认高阻抗模式以激活
//先前配置的端口设置
PM5CTL0 &=~LOCKLPM5;
//配置 ADC10
ADCCTL0 |= ADCSHT_0 | ADCON;// ADCON、S&H=16 ADC CLKS
ADCCTL1 |= ADCSHP | ADCDIV_4;// ADCCLK = MODOSC;采样计时器
ADCCTL2 |= ADCRES;// 10位转换结果
ADCIE |= ADCIE0;//启用 ADC 转换完成中断
ADCMCTL0 |= ADCINCH_4 | ADCSREF_1;// A1 ADC 输入选择;Vref=1.5V
//配置引用
PMMCTL0_H = PMMPW_H;//解锁 PMM 寄存器
PMMCTL2 |= INTREFEN;//启用内部基准
_DELAY_CYCLES (400);//基准趋稳延迟
TB0CCTL0 |= CCIE;//启用 TBCCR0中断
TB0CCR0 = 500;
TB0CTL |= TBSSEL_SMCLK | MC__Continous;// SMCLK,连续模式
PWMflag = 0;
_bis_SR_register (GIE);//输入 LPM3、带中断 LPM0_Bits |
__no_operation();//进行调试
while (1){
if (Readflag = 1){
adc_buf[adc_cnt]= adc_result;
ADC_Cnt++;
ADC_Cnt = ADC_Cnt & 0x0F;
ADC_RESULT_SUM = 0;
ADC_RESULT_SUM = ADC_RESULT_SUM + ADC_BUF[0];
ADC_RESULT_SUM = ADC_RESULT_SUM + ADC_BUF[1];
ADC_RESULT_SUM = ADC_RESULT_SUM + ADC_BUF[2];
ADC_RESULT_SUM = ADC_RESULT_SUM + ADC_BUF[3];
ADC_RESULT_SUM = ADC_RESULT_SUM + ADC_BUF[4];
ADC_Result_sum = ADC_Result_sum + ADC_buf[5];
ADC_Result_sum = ADC_Result_sum + ADC_buf[6];
ADC_RESULT_SUM = ADC_RESULT_SUM + ADC_BUF[7];
ADC_RESULT_SUM = ADC_RESULT_SUM + ADC_BUF[8];
ADC_RESULT_SUM = ADC_RESULT_SUM + ADC_BUF[9];
ADC_RESULT_SUM = ADC_RESULT_SUM + ADC_BUF[10];
ADC_RESULT_SUM = ADC_RESULT_SUM + ADC_BUF[11];
ADC_RESULT_SUM = ADC_RESULT_SUM + ADC_BUF[12];
ADC_RESULT_SUM = ADC_RESULT_SUM + ADC_BUF[13];
ADC_RESULT_SUM = ADC_RESULT_SUM + ADC_BUF[14];
ADC_RESULT_SUM = ADC_RESULT_SUM + ADC_BUF[15];
if (adc_result_sum > threshold_H){
TB0CCTL0 &=~CCIE;// TBCCR0中断被禁用
P1OUT &=~BIT6;
}否则,如果(ADC_Result_sum < threshold_L){
TB0CCTL0 &=~CCIE;// TBCCR0中断被禁用
P1OUT &=~BIT6;
}
Readflag = 0;
}
}
}
// Timer B0中断服务例程
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector = TIMER0_B0_vector
_interrupt void Timer_B (void)
#Elif defined (_GNU_)
void __attribute__((中断(TIMER0_B0_vector)) Timer_B (void)
其他
错误编译器不受支持!
#endif
{
if (PWMflag = 0){
P1OUT &=~BIT6;
TB0CCR0 += LOW_TICKs;//将偏移添加到 TBCCR0
PWMflag = 1;
}否则{
P1OUT |= BIT6;
ADCCTL0 |= ADCENC | ADCSC;//采样和转换启动
TB0CCR0 += HIGH_TICKs;//将偏移添加到 TBCCR0
PWMflag = 0;
}
}