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.

MSP432P401R: TIMER UNDER LPM3

Part Number: MSP432P401R

Dear team,

MSP432P401R TIMER_A has a problem when counting less than or equal to 10Hz in LMP3 mode. It will not count when it starts. It will only start counting unless the input frequency is changed. But it will not be in LPM0 mode or ACTIVE.

The following is the 10HZ test situation tar: TA count value ,count: total value ,fre: frequency

The following is the test result at 11Hz

I will send the code if it is needed.

Please help.

  • I know of no mechanism that would disable TACLK in LPM3 (or at low frequency).

    Can you post/attach some code? Sometimes all it takes is a typo.

  • #include "driverlib.h"
     
    #include "NUtility.h"
    #include "LCDBu9799.h"
    #include "Structs.h"
           
     
    #define DCO_FRE  8000000
    
    
    
    void TA0RCount(u16 tar);
    
    
    
     
    __IO  uint8_t m_UartA0IsRecNew;
     
    __IO  uint8_t m_UartA0IsInt=TRUE;;
     
    __IO  uint32_t m_irdaRecCount;
     
    FlowPulse m_flowPulse;
    
    //==============================================================================
    void InitGPIO()
    {        
     
    }
    
    
     
    void InitCS()
    {  
      uint32_t  aclk, mclk, smclk, hsmclk, bclk;
     
        CS_setExternalClockSourceFrequency(32768,DCO_FRE);   
     
        MAP_GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_PJ, GPIO_PIN0 | GPIO_PIN1, GPIO_PRIMARY_MODULE_FUNCTION);
     
        CS_startLFXT(false);
        
        
        MAP_CS_setReferenceOscillatorFrequency(CS_REFO_32KHZ);
     
        MAP_FPU_enableModule();   
     
        MAP_CS_setDCOFrequency(DCO_FRE);      
          
      
        MAP_CS_initClockSignal(CS_MCLK,   CS_DCOCLK_SELECT,  CS_CLOCK_DIVIDER_1);//8MHz    
        MAP_CS_initClockSignal(CS_HSMCLK, CS_DCOCLK_SELECT,  CS_CLOCK_DIVIDER_1);//8MHz
        MAP_CS_initClockSignal(CS_SMCLK,  CS_DCOCLK_SELECT,  CS_CLOCK_DIVIDER_2);//4MHz
        MAP_CS_initClockSignal(CS_ACLK,   CS_LFXTCLK_SELECT, CS_CLOCK_DIVIDER_1);//32768Hz
        MAP_CS_initClockSignal(CS_BCLK,   CS_LFXTCLK_SELECT, CS_CLOCK_DIVIDER_1);//32768Hz
    
        aclk   = CS_getACLK();
        mclk   = CS_getMCLK();
        smclk  = CS_getSMCLK();
        hsmclk = CS_getHSMCLK();
        bclk   = CS_getBCLK();  
        
     
        MAP_SysCtl_enableSRAMBankRetention(SYSCTL_SRAM_BANK1);
        MAP_SysCtl_enableSRAMBankRetention(SYSCTL_SRAM_BANK2);
        MAP_SysCtl_enableSRAMBankRetention(SYSCTL_SRAM_BANK3);
        MAP_SysCtl_enableSRAMBankRetention(SYSCTL_SRAM_BANK4);
        MAP_SysCtl_enableSRAMBankRetention(SYSCTL_SRAM_BANK5);
        MAP_SysCtl_enableSRAMBankRetention(SYSCTL_SRAM_BANK6);
        MAP_SysCtl_enableSRAMBankRetention(SYSCTL_SRAM_BANK7);
        
       
        MAP_Interrupt_disableSleepOnIsrExit();  
        
     
        MAP_SysTick_enableModule();  
     
        MAP_SysTick_setPeriod(DCO_FRE/10);   
     
        MAP_SysTick_enableInterrupt();  
     
        MAP_Interrupt_enableMaster();           
    }
    
    
     
    void InitWDT()
    {
     
        MAP_WDT_A_initIntervalTimer(WDT_A_CLOCKSOURCE_ACLK,WDT_A_CLOCKITERATIONS_32K);
     
        MAP_Interrupt_enableInterrupt(INT_WDT_A);
        MAP_WDT_A_startTimer();
    }
    
     
    void InitWDTInSoftReset()
    {
      uint32_t ii;
      uint32_t WDT_A_TIMEOUT =RESET_SRC_1;
      
     
        MAP_SysCtl_setWDTTimeoutResetType(SYSCTL_SOFT_RESET);
        MAP_WDT_A_initWatchdogTimer(WDT_A_CLOCKSOURCE_ACLK,WDT_A_CLOCKITERATIONS_512K);    
        MAP_WDT_A_startTimer();
        
      
    }
    
    //==============================================================================
    
     
    void UARTA0_Init()
    {
     
      eUSCI_UART_Config uartConfig =
      {
        EUSCI_A_UART_CLOCKSOURCE_SMCLK,                 // SMCLK Clock Source  
        4,                                             // BRDIV      时钟预分频值
        5,                                             // UCxBRF     第1级调制分频     
        0x55,                                          // UCxBRS     第2级调制分频
        EUSCI_A_UART_NO_PARITY,                        // No Parity     无校验
        EUSCI_A_UART_LSB_FIRST,                        // LSB First     数据低位优先
        EUSCI_A_UART_ONE_STOP_BIT,                     // One stop bit  1位停止位
        EUSCI_A_UART_MODE,                             // UART mode    UART模式
        EUSCI_A_UART_OVERSAMPLING_BAUDRATE_GENERATION  // 过采样发生器
      };
      
     
      MAP_GPIO_disableInterrupt(GPIO_PORT_P1, GPIO_PIN2);
      
      MAP_GPIO_clearInterruptFlag(GPIO_PORT_P1, GPIO_PIN2);
      
      
     
      MAP_GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P1,GPIO_PIN2 | GPIO_PIN3, GPIO_PRIMARY_MODULE_FUNCTION);//GPIO_PIN1 为UART外部时钟
     
      MAP_UART_initModule(EUSCI_A0_BASE, &uartConfig);
     
      MAP_UART_enableModule(EUSCI_A0_BASE);
     
      MAP_UART_enableInterrupt(EUSCI_A0_BASE, EUSCI_A_UART_RECEIVE_INTERRUPT);
      MAP_Interrupt_enableInterrupt(INT_EUSCIA0);
    }
    
     
    void UARTA0_InitForInt()
    { 
     
      P1SEL0 &=~(BIT2+BIT3);
      P1SEL1 &=~(BIT2+BIT3);
      MAP_Interrupt_disableInterrupt(INT_EUSCIA0);
      MAP_UART_disableInterrupt(EUSCI_A0_BASE, EUSCI_A_UART_RECEIVE_INTERRUPT);
      MAP_UART_disableModule(EUSCI_A0_BASE);
       
     
      P1DIR  &=~(BIT2+BIT3);  
     
      MAP_GPIO_clearInterruptFlag(GPIO_PORT_P1, GPIO_PIN2);
     
      MAP_GPIO_enableInterrupt(GPIO_PORT_P1, GPIO_PIN2);
     
      MAP_Interrupt_enableInterrupt(INT_PORT1);
    }
    
    
     
    void UARTA0_Send(uint8_t* data,uint32_t len)
    {
      uint32_t idx;
      
      for(idx=0;idx<len;idx++)
      {
        MAP_UART_transmitData(EUSCI_A0_BASE, data[idx]);
      }  
    }
    
     
    void UARTA0_Handle()
    {
      u32 pre=ng_GetTick();
      
      if(!m_UartA0IsInt)return;
      while(1)
      {
     
        if(ng_GetTick()-pre>30)break;
        if(m_UartA0IsRecNew)
        {
          m_UartA0IsRecNew=FALSE;
          pre=ng_GetTick();
        }   
     
      }
      UARTA0_InitForInt();
     
      m_UartA0IsInt=TRUE;
    }
    
     
    void UARTA2_Init()
    {
     
      eUSCI_UART_Config uartConfig =
      {
        EUSCI_A_UART_CLOCKSOURCE_SMCLK,                 // SMCLK Clock Source  
        4,                                             // BRDIV      时钟预分频值
        5,                                             // UCxBRF    第1级调制分频     
        0x55,                                          // UCxBRS     第2级调制分频
        EUSCI_A_UART_NO_PARITY,                        // No Parity     无校验
        EUSCI_A_UART_LSB_FIRST,                        // LSB First     数据低位优先
        EUSCI_A_UART_ONE_STOP_BIT,                     // One stop bit  1位停止位
        EUSCI_A_UART_MODE,                             // UART mode    UART模式
        EUSCI_A_UART_OVERSAMPLING_BAUDRATE_GENERATION  // 过采样发生器
      };
      
     
      MAP_GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P3,GPIO_PIN2 | GPIO_PIN3, GPIO_PRIMARY_MODULE_FUNCTION);
     
      MAP_UART_initModule(EUSCI_A2_BASE, &uartConfig);
     
      UCA2IRCTL = UCIREN;
      
     
      MAP_UART_enableModule(EUSCI_A2_BASE);
     
      MAP_UART_enableInterrupt(EUSCI_A2_BASE, EUSCI_A_UART_RECEIVE_INTERRUPT);
      MAP_Interrupt_enableInterrupt(INT_EUSCIA2);
    }
    
     
    void UARTA2_Send(uint8_t* data,uint32_t len)
    {
      uint32_t idx;
      
     
      MAP_Interrupt_disableInterrupt(INT_EUSCIA2);
      MAP_UART_disableInterrupt(EUSCI_A2_BASE, EUSCI_A_UART_RECEIVE_INTERRUPT);
      
      for(idx=0;idx<len;idx++)
      {
        MAP_UART_transmitData(EUSCI_A2_BASE, data[idx]);
      }    
     
      MAP_UART_enableInterrupt(EUSCI_A2_BASE, EUSCI_A_UART_RECEIVE_INTERRUPT);  
      MAP_Interrupt_enableInterrupt(INT_EUSCIA2);  
    }
    
     
    void UARTA3_Init()
    {
     
      eUSCI_UART_Config uartConfig =
      {
        EUSCI_A_UART_CLOCKSOURCE_SMCLK,                 // SMCLK Clock Source  
        26,                                             // BRDIV      时钟预分频值
        0,                                             // UCxBRF    第1级调制分频     
        0xB6,                                          // UCxBRS     第2级调制分频
        EUSCI_A_UART_NO_PARITY,                        // No Parity     无校验
        EUSCI_A_UART_LSB_FIRST,                        // LSB First     数据低位优先
        EUSCI_A_UART_ONE_STOP_BIT,                     // One stop bit  1位停止位
        EUSCI_A_UART_MODE,                             // UART mode    UART模式
        EUSCI_A_UART_OVERSAMPLING_BAUDRATE_GENERATION  // 过采样发生器
      };
      
     
      MAP_GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P9,GPIO_PIN6 | GPIO_PIN7, GPIO_PRIMARY_MODULE_FUNCTION);
      
      MAP_UART_initModule(EUSCI_A3_BASE, &uartConfig);
      
    
      UCA2IRCTL = UCIREN;
      
    
      MAP_UART_enableModule(EUSCI_A3_BASE);
    
      MAP_UART_enableInterrupt(EUSCI_A3_BASE, EUSCI_A_UART_RECEIVE_INTERRUPT);
      MAP_Interrupt_enableInterrupt(INT_EUSCIA3);
    }
    
    
    void UARTA3_Send(uint8_t* data,uint32_t len)
    {
       uint32_t idx;
      
      for(idx=0;idx<len;idx++)
      {
        MAP_UART_transmitData(EUSCI_A3_BASE, data[idx]);
      }   
    }
    
    
    
    void RTC_Init()
    {
       const RTC_C_Calendar currentTime =
       {
           0x00, //second
           0x00, //minute
           0x00, //hour
           0x00, //dayOfWeek
           0x1,  //day
           0x1,  //month
           0x2020//year
       };
     
         /* Initializing RTC with current time as described in time in
         * definitions section */
        MAP_RTC_C_initCalendar(&currentTime, RTC_C_FORMAT_BCD);
    
    
        RTC_C_definePrescaleEvent(RTC_C_PRESCALE_1,RTC_C_PSEVENTDIVIDER_128);
    
    
        MAP_RTC_C_clearInterruptFlag( 
           RTC_C_CLOCK_READ_READY_INTERRUPT | 
           //RTC_C_PRESCALE_TIMER0_INTERRUPT  |
           RTC_C_PRESCALE_TIMER1_INTERRUPT);
        
        MAP_RTC_C_enableInterrupt( 
           RTC_C_CLOCK_READ_READY_INTERRUPT | 
           //RTC_C_PRESCALE_TIMER0_INTERRUPT  |
           RTC_C_PRESCALE_TIMER1_INTERRUPT);
    
        /* Start RTC Clock */
        MAP_RTC_C_startClock();
    
        /* Enable interrupts and go to sleep. */
        MAP_Interrupt_enableInterrupt(INT_RTC_C);
    }
    
    
    void TIMERA0_Init()
    { 
    
      P7SEL0   |= BIT1;
      P7SEL1   &=~BIT1;
      TA0CTL   =TASSEL_0 + MC_2 + TACLR ;//TASSEL_1:ACLK   MC_2:连续计数模式 TACLR:清除计数值TAR 
    }
    
    
    void TA0RCount(u16 tar)
    {
      u16 curTAR=tar;
      u32 tmp;  
        
      if(curTAR<m_flowPulse.preTAR)
      {
        tmp=0x10000;
        m_flowPulse.curCount+=(tmp+(u32)curTAR-(u32)m_flowPulse.preTAR);   
      }
      else
      {
        m_flowPulse.curCount+=curTAR-m_flowPulse.preTAR;
      }  
      m_flowPulse.frequence=(u32)(m_flowPulse.curCount-m_flowPulse.preCount);
      m_flowPulse.preCount=m_flowPulse.curCount;
      m_flowPulse.preTAR=curTAR; 
      
      if(!m_flowPulse.isMainLock)
      {
        m_flowPulse.isNew=TRUE;
        m_flowPulse.curCountClone=m_flowPulse.curCount;
        m_flowPulse.frequenceClone=m_flowPulse.frequence;
      }
    }
    
    //==============================================================================
    //TA1 PO1PWM   P7.7
    void TIMERA1_Init(uint16_t fre)
    {
    
      if(0==fre)
      {
        P7SEL0 &=~BIT7;
        P7SEL1 &=~BIT7;
        P7DIR  |= BIT7;
        P7OUT  &=~BIT7;    
        return;
      }
      
    
      P7SEL0 |= BIT7;
      P7SEL1 &=~BIT7;
      P7DIR  |= BIT7;
        
      TA1CCTL1 = OUTMOD_7;  
      if(fre>=66)
      {
        //>66Hz TA1使用SMCLK作为时钟源
        TA1CTL = TASSEL__SMCLK + MC_1;
        TA1CCR0= 4000000/fre;  //频率 
      }
      else
      {
        //TA1使用ACLK作为时钟源
        TA1CTL = TASSEL__ACLK + MC_1;
        TA1CCR0= 32768/fre;  //频率 
      }   
      TA1CCR1 = TA1CCR0/2; //占空比50% 
      
    }
    
    uint16_t m_fre=2;
    
    
    int main(void)
    {
        //关看门狗
        MAP_WDT_A_holdTimer();
            
        InitCS();
        //InitWDT();
        //InitWDTInSoftReset();    
        //InitGPIO();
        //UARTA0_InitForInt();
        UARTA0_Init();
        UARTA2_Init();
        UARTA3_Init();
        LCDBu9799_InitPort();
        LCDBu9799_Display(TRUE);    
        TIMERA0_Init();    
        RTC_Init();
        while (1)
        {
          MAP_PCM_gotoLPM3(); 
    
        }
    }
    
    
    

  • There are some pieces missing, so it's a bit difficult to figure out the flow, but I suspect it isn't a coincidence that SysTick is running at 10Hz. If this code is using SysTick as the "real time" reference for the frequency counter:

    1) I suspect SysTick doesn't run in LPM3, though I haven't been able to find a statement (either way) in the TRM.

    2) Below 10Hz, some number of samples will have 0 ticks counted, which makes it fairly easy to introduce a rounding/truncation error.

    [Edit: minor clarification]