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.

[参考译文] MSP430FR5969:意外经历的时间测量

Guru**** 2538955 points
Other Parts Discussed in Thread: MSP430FR5969

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/917380/msp430fr5969-unexpected-elapsed-time-measurement

器件型号:MSP430FR5969

您好!

我目前正在使用2个 MSP430FR5969 MCU、其中一个是 Launchpad、另一个是带有 MSP430FR5969 MCU 的客户端定制板。 该 LaunchPad 用于仿真客户端自定义电路板的发送器、并通过有线连接直接输出到客户端的输入引脚。 两个板都设置为以16MHz 运行。 我一直在尝试在客户的电路板上检测下降沿和上升沿转换、持续时间大约为20us (320个周期)、但我始终看到大约284个周期。 我本来希望周期计数比预期的320个周期高、但它的读取周期计数比预期的低。 我还尝试使定时器引脚在两个边沿上同步触发、但其读数仍然大致与之前相同。 我没有接近预期的经历时间/周期计数有什么特殊原因吗?

在 launchpad 上、我可以自由运行以下代码

#include 
#include 

静态 uint8_t TST[16]={1、1、1、1、0、0、1、1、1、1、1、1、1、1、1};
静态 int tstIndex = 0;

int main (void)
{
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器

PM5CTL0 &=~LOCKLPM5;

FRCTL0 = FRCTLPW | NWAITS0;

CSCTL0_H = CSKEY >> 8;
CSCTL1 = DCOFSEL_4 | DCORSEL;
CSCTL2 = SELA_LFXTCLK | SELESS__DCOCLK | SELM_DCOCLK;
CSCTL3 = DIVA__1 | DIVS__1 | DIVM__1;
CSCTL6 &=~(MODCLKREQEN | SMCLKREQEN | MCLKREQEN);
CSCTL6 |= ACLKREQEN;

_BIC_SR_register (GIE);

P1DIR |= BIT5;
P1OUT |= BIT5;

TA0CCTL0 = CCIE;
TA0CCR0 = 160;
TA0CTL = TASSEL_SMCLK | MC_UP | TACLR;

_bis_SR_register (LPM0_bits | GIE);
返回0;
}

#if defined (__TI_Compiler_version__)|| defined (__IAR_systems_ICC__)
#pragma vector = TIMER0_A0_Vector
__interrupt Timer0_A0_ISR (void)
#Elif defined (__GNU__)#pragma vector = TIMER0_A0_Vector (interrupt
(INTERRUPT (TIMER0_A0_A0) ERA0–ERISR (void

)(void _ER0_A0)(void _ERA0)错误)(void _ER0_ERA0!
#endif
{
if (tstIndex > 15)
{
tstIndex = 0;
}
P1OUT =(BIT5和(TST[tstIndex]<< 5));
tstIndex++;
} 

在客户的定制板上、我运行以下代码段:

int main (void)
{
DICK_SET_BIT (WDTCTL、WDTPW | WDTHOLD);
CLR_BIT (PM5CTL0、LOCKLPM5);

FRAM_INIT();
ChangeClockSpeed_1MHz ();
setup_pins_default();
setup_data_struct();

State = State_ready;

while (永久)
{
开关(状态)
{
案例 State_Ready:
状态= handleStateReady (State_ready、&g_Rx_RAW_DATA);
ChangeClockSpeed_1MHz ();
中断;
默认值:
中断;
}
}
返回0;
}

静态易失性 uint16_t 定界持续时间;
void setup_Receive (uint8_t currentState) { _BIC_SR_register (GIE); ChangeClockSpeed_16MHz(); SET_BIT (PIN_LED1_DIR、PIN_LED1); SET_BIT (PIN_LED2_DIR、PIN_LED2); CLR_BIT (PIN_LED1_OUT、PIN_LED1); CLR_BIT (PIN_LED2_OUT、PIN_LED2); 定界持续时间= 0; STATE =当前状态; direct_set_bit (TA0CCTL0、0); SET_BIT (TA0CTL、TACLR); CLR_BIT (PIN_RX_SEL0、PIN_RX); CLR_BIT (PIN_RX_SEL1、PIN_RX); SET_BIT (PIN_RX_IES、PIN_RX); CLR_BIT (PIN_RX_IFG、PIN_RX); SET_BIT (PIN_RX_IE、PIN_RX); } uint8_t handleStateReady (uint8_t currentState、volatile rx_raW_DATA_context* g_rx_raW_data) { SETUP_Receive (currentState); _bis_SR_register (LPM0_bits | GIE); printf ("%u\n"、定界持续时间); if ((uint16_t)(定界持续时间- minimum_DELIM_length)<= DELIM_RANGE) { SET_BIT (PIN_LED1_OUT、PIN_LED1); State = State_arbitrate; } 其他 { SET_BIT (PIN_LED2_OUT、PIN_LED2); State = State_ready; } 返回状态; } #if defined (__TI_Compiler_version__)|| defined (__IAR_systems_ICC__) #pragma vector = TIMER0_A0_Vector __interrupt Timer0_A0_ISR (void) #Elif defined (__GNU__)#pragma vector = TIMER0_A0_Vector (interrupt (INTERRUPT (TIMER0_A0_A0) ERA0–ERISR (void )(void _ER0_A0)(void _ER0_A0)错误))(void _ERA0! #endif { CLR_BIT (TA0CTL、MC__STUREAL); 定界持续时间= TA0CCR0; direct_set_bit (TA0CCTL0、0); SET_BIT (TA0CTL、TACLR); _BIC_SR_REGISTER_ON_EXIT (LPM0_Bits | GIE); } #if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__) #pragma vector = port2_vector __interrupt void Port2_ISR (void) #elif defined (__GNC_systems_port2_) (void)(void)(void)(port2_ port2_)(void)(void translifor_iter_ port2_)(void)(void)(void translif_it #endif { CLR_BIT (PIN_RX_IE、PIN_RX); SET_BIT (PIN_RX_SEL0、PIN_RX); CLR_BIT (PIN_RX_SEL1、PIN_RX); DIAG_SET_BIT (TA0CCTL0、CM_1 | CCIS_1 | CCIE | SCS | CAP); direct_set_bit (TA0CTL、tassel_SMCLK | MC__Continuous| TACLR); }
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Ben、

    如果我理解正确、您将尝试从定制板生成某种 PWM 信号、该信号的周期应为20us (50kHz)、但看起来很快。  是这样吗?  

    我快速查看了您为定制板提供的代码、但我无法完全遵循。  我看不到您尝试在哪个引脚上输出。  

    我建议尝试运行示例代码以生成您的信号、以便您可以一边工作。  也许这个运行 DCO 的 PWM 信号示例: https://dev.ti.com/tirex/explore/node?node=AJaCTZBNOaYcl60z596fGA__IOGqZri__LATEST 

    谢谢、

    JD   

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

    JD、您好!

    很抱歉、如果代码令人困惑、因为出于保密原因、我不得不省略一些部分、以澄清:

    我尝试将一个"PWM"信号从 launchpad 输出到定制板、周期为20us。 LaunchPad 使用 P1.5输出、定制板使用 P2.3接收输出。 目前、我的两个板都以16MHz 的频率运行。  我之前已经尝试过在 launchpad 上使用 PWM 示例、但定制板仍然捕获大约285个周期、而不是预计的320个周期。 因此、由于某种原因、定制板指示其捕获速度太快、这是不可能的、因为在 launchpad 完成上升沿转换后应进行定制板捕获。

    我在定制板上检测下降沿和上升沿转换的步骤是将 P2.3的 GPIO 中断用于下降沿、并在端口 ISR 中设置针对上升沿的同步定时器捕捉。 当上升沿发生时、我会将 TA0CCR0寄存器保存到一个变量中、使下降沿和上升沿之间的"经历的时间"保持在一个变量中。

    我怀疑自定义电路板的下降沿中断速度太慢、但在两个边沿上使用同步定时器捕捉并没有显示出任何差异。 我还怀疑这可能是由于 printf 造成的、因此、如果在一个小范围内检测到正确的持续时间、我已经注释掉了 printf 并将其输出到 LED。 当范围介于270和290之间而不是310至330之间时、自定义板点亮了"正确" LED、因此也无法正常工作。

    谢谢、

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

    后缘的测量恰好在后缘的时间(通过捕捉)进行。 但前沿测量(TACLR)的发生要比端口2中断结束时的边沿本身晚得多。 我可以在端口2 ISR 中轻松地对25个时钟的指令进行计数。 再加上10个以上的 ISR 开销、 这将解释您的35个时钟差异。

    我建议您使用定时器捕捉测量两个边沿。 我建议您始终以连续模式运行 TA0、然后使用 CM_3并检查 CCI 以查看您刚刚捕获的边沿。 当您具有两个边沿后、只需减去两个时间戳。

    [编辑:未经请求:

    >     _bic_SR_register_on_exit(LPM0_bits | GIE);
    这将禁用主系统中的中断。 我怀疑这不是你想要的。]