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.

[参考译文] MSP430FR2310:调试模式和正常工作模式下的定时器 B0延迟不相同。

Guru**** 2382480 points
Other Parts Discussed in Thread: MSP430FR2310
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/949112/msp430fr2310-timer-b0-delay-in-debug-mode-and-normal-working-mode-not-the-same

器件型号:MSP430FR2310

我们的产品使用 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;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    >_bis_SR_register (SCG0);//禁用 FLL

    在 CS 设置中、您关闭了 FLL、但忘记在最后重新打开它、这样您就可以得到 DCO 中发生的任何情况(永远)。

    在该 long __delay_cycles ()之前添加类似如下的内容:

    >_BIC_SR_register (SCG0);//启用 FLL

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢!