AnsweredAssumed Answered

TImer's update

Question asked by Anton Rudomanenko on Nov 9, 2018
Latest reply on Nov 11, 2018 by jeremyzhou

Hi everyone! I want to implemet simillar to WDT behavior on Timer. The idea is: on timer's interrupt timer is stop, but on the other MR0 is update and timer is go on. The problem that it is doesnt work(
Here is my code:

//-------------------------UART_SECTION------------------------------------
void UART_IRQHandler(void) {
     uint32_t IIR_value = LPC_USART->IIR;
     IIR_value >>= 1;
     
     if (IIR_value & IIR_RDA) {
          USART_Buff[USART_byte_count++] = LPC_USART->RBR;
     }

     timer0_update(WT);
}
//-------------------------------------------------------------------------


//----------------------TIMER_SECTION--------------------------------------
void timer0_init_sub(uint32_t pr, uint32_t tc, uint32_t mcr, uint32_t tcr) {
     if( iInit_T0 )
          return;
     iInit_T0 = 1;
     // Enable TIMER clock to the GPIO domain.
     LPC_SYSCON->SYSAHBCLKCTRL |= (1<<9);

     NVIC_DisableIRQ(TIMER_32_0_IRQn);     
     //NVIC_SetPriority( TIMER_32_0_IRQn, 0 );     
     
     LPC_TMR32B0->PR  = pr;
     LPC_TMR32B0->TC  = tc;
     LPC_TMR32B0->MCR = mcr;
     LPC_TMR32B0->TCR = tcr;

     NVIC_SetPriority(TIMER_32_0_IRQn, 3);
     NVIC_EnableIRQ(TIMER_32_0_IRQn);
}


void timer0_init(void) {
     timer0_init_sub(0, 0, 0, 0);
     LPC_TMR32B0->MCR |= 0x01;
     LPC_TMR32B0->IR &= 0x5f;
     LPC_TMR32B0->TCR |= (1 << 1);
     //LPC_TIM32B0->TCR |= 0x01;     
}


void timer0_start(uint32_t time) {
     LPC_TMR32B0->MR0 = time * 4800;  // 0.0001 * time (sec)
     LPC_TMR32B0->TCR = 0x01;
}


void timer0_stop(void) {
     LPC_TMR32B0->TCR = 0;
}


void timer0_reset(void) {
     LPC_TMR32B0->TCR = (1 << 1);
}


uint8_t timer0_performance_check(void) {
     return (LPC_TMR32B0->TCR & 0x01) ? 1 : 0;
}


void timer0_update(uint32_t time) {
     timer0_reset();
     timer0_start(time);
}


void timer0_wait_icc_message(uint32_t waiting_time) {
     timer0_start(waiting_time);
     while(timer0_performance_check());
}


void TIMER32_0_IRQHandler(void) {
     if (LPC_TMR32B0->IR & 0x01) {
          
          timer0_stop();
          timer0_reset();
          LPC_TMR32B0->IR = 1;
     }
}
//-----------------------------------------------------------------

//--------------------MAIN_SECTION---------------------------------

void foo(void) {
      pbDataIn = USART_Buff;
     *pwLngIn = USART_byte_count;
}

//-----------------------------------------------------------------

Outcomes