Hello Community,
I have some problems with a kinetis mk10d7. I like to go into stopmode and use the interrupt of the LPTMR to wake up the processor. Behind every wake up the processor should send a char over the UART. Everything works nice when I use a timervalue that let the LPTMR generate a interrupt longer as 299ms. I tryed the LPO and the IRCLK as clock for the LPTMR. It will be nice when you can look on my code. I dont know what the problem is. Thx
#include "derivative.h" /* include peripheral declarations */
#include "driver.h"
int main(void)
{
UART_init(115200,9000); // baud rate=115200,UART_clk~9MHz
LPTMR_init(299); // init LPTMR 500ms 437
SMC_PMCTRL &= ~SMC_PMCTRL_STOPM_MASK;
SMC_PMCTRL |= SMC_PMCTRL_STOPM(0);
//Send data
for(;;)
{
enter_stopmode();
while(!(UART0_S1 & UART_S1_TDRE_MASK)){};
UART0_D = 'a';
}
return 0;
}
#include "derivative.h"
//Device inits
void UART_init(unsigned short baud,unsigned int uartclk_khz)
{
unsigned short sbr,brfa;
//Initialisation
SIM_SCGC4 |= SIM_SCGC4_UART0_MASK;
SIM_SCGC5 |= SIM_SCGC5_PORTB_MASK; // Activate clock for PortC
PORTB_PCR16 = PORT_PCR_MUX(3); // Set PortB 16 for UARC
PORTB_PCR17 = PORT_PCR_MUX(3); // Set PortB 17 for UARC
sbr = (unsigned short)((uartclk_khz*1000)/(baud*16));
UART0_BDH = (unsigned char)((sbr & 0x1F00)>>8); // Write high word of baud rate into register
UART0_BDL = (unsigned char)(sbr & 0x00FF); // Write low word of baud rate into register
brfa = (((uartclk_khz*32000)/(baud*16))-(sbr*32));
UART0_C4 = (unsigned char)(brfa & 0x001F); // Write divider into register
UART0_C1 = 0; // 8-Bit-Mode,No parity
UART0_C2 |= (UART_C2_TE_MASK | UART_C2_RE_MASK ); // Enable receiver and transmitter
}
void LPTMR_init(int timer)
{
SIM_SCGC5 |= SIM_SCGC5_LPTIMER_MASK; // Set clock to LPTMR
LPTMR0_CSR=0x00;
LPTMR0_PSR=0x00;
LPTMR0_CMR=0x00;
MCG_C1|=MCG_C1_IRCLKEN_MASK;
LPTMR0_CMR = timer; // Set counter
LPTMR0_PSR |= LPTMR_PSR_PBYP_MASK // Prescaler is bypassed
| LPTMR_PSR_PCS(1); // Set timer source 0=IRCLK,1=LPO
LPTMR0_CSR |= LPTMR_CSR_TIE_MASK; // Enable interrupt
NVICICPR2 |= (1<<21); //Clear any pending interrupts on LPTMR
NVICISER2 |= (1<<21); //Enable interrupts from LPTMR module
NVICIP85 = 0x10; //Set Priority 3 to the LPTMR module
LPTMR0_CSR |= LPTMR_CSR_TEN_MASK; // activate LPTMR
}
//Enter power modes
void enter_stopmode()
{
volatile unsigned int dummyread;
dummyread = SMC_PMCTRL;
SCB_SCR |= SCB_SCR_SLEEPDEEP_MASK;
asm("WFI");
}
My ISR:
void lptmr_irq(){
LPTMR0_CSR|=LPTMR_CSR_TCF_MASK;
}