您好!
我目前正在使用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); }