FTM Timer Confusion

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 

FTM Timer Confusion

75 次查看
Jana_muralidharan
Contributor I

So, I am trying to start the timer FTM0/FTM1 it, upon running of the timer code it stucks at the HardFault why but the same code with FTM2 works perfectly fine why?? 

the not working code

#include "MKE02Z4.h"

/* ================= GLOBALS ================= */
volatile uint8_t uartFlag = 0;

/* ================= PROTOTYPES ================= */
void init_clock(void);
void init_uart0(void);
void init_FTM1(void);
void UART_Send(const char *s);

/* ================= FTM1 ISR ================= */
void FTM1_IRQHandler(void)
{
    /* Clear overflow flag (write 0 while set) */
    FTM1->SC &= ~FTM_SC_TOF_MASK;

    uartFlag = 1;
}

/* ================= MAIN ================= */
int main(void)
{
    init_clock();
    init_uart0();
    init_FTM1();

    UART_Send("FTM1 Initialized\r\n");

    while (1)
    {
        if (uartFlag)
        {
            uartFlag = 0;
            UART_Send("A\r\n");
        }

        __WFI();   /* wait for interrupt */
    }
}

/* ================= CLOCK INIT ================= */
void init_clock(void)
{
    /*
     * Assume internal clock already configured by SDK startup
     * Bus clock = 32 MHz
     */
    SIM->BUSDIV = 0x01;   /* divide by 1 */
}

/* ================= UART0 INIT ================= */
void init_uart0(void)
{
    /* Enable UART0 clock */
    SIM->SCGC |= SIM_SCGC_UART0_MASK;

    /* UART0 pin select (TX/RX) */
    SIM->PINSEL |= SIM_PINSEL_UART0PS_MASK;

    /* Disable TX inversion (important!) */
    SIM->SOPT &= ~SIM_SOPT_TXDME_MASK;

    /*
     * 9600 baud @ 32 MHz
     * SBR = 32e6 / (16 * 9600) ≈ 208
     */
    UART0->BDH = 0x00;
    UART0->BDL = 53;

    UART0->C1 = 0x00;
    UART0->C2 = UART_C2_TE_MASK | UART_C2_RE_MASK;
}

/* ================= FTM1 INIT ================= */
void init_FTM1(void)
{
    /* Enable FTM1 clock */
    SIM->SCGC |= SIM_SCGC_FTM1_MASK;
    __DSB();

    /* ---- VERY IMPORTANT ORDER (KE02 SAFE) ---- */

    /* Stop counter completely */
    FTM1->SC = 0;

    /* Disable write protection (WRITE ONCE) */
    FTM1->MODE = FTM_MODE_WPDIS_MASK;

    /* Reset counter */
    FTM1->CNTIN = 0;
    FTM1->CNT   = 0;

    /*
     * 32 MHz / 128 = 250 kHz
     * 250000 ticks = 1 second
     */
    FTM1->MOD = 249999;

    /* Enable overflow interrupt, prescaler = 128 */
    FTM1->SC = FTM_SC_PS(7) | FTM_SC_TOIE_MASK;

    /* Enable NVIC */
    NVIC_EnableIRQ(FTM1_IRQn);

    /* START TIMER (LAST STEP ONLY) */
    FTM1->SC |= FTM_SC_CLKS(1);
}

/* ================= UART SEND ================= */
void UART_Send(const char *s)
{
    while (*s)
    {
        while (!(UART0->S1 & UART_S1_TDRE_MASK));
        UART0->D = *s++;
    }
}

 the working code

#include "MKE02Z4.h"

/* ================= GLOBALS ================= */
volatile uint8_t uartFlag = 0;

/* ================= PROTOTYPES ================= */
void init_clock(void);
void init_uart0(void);
void init_FTM2(void);
void UART_Send(const char *s);

/* ================= FTM2 ISR ================= */
void FTM2_IRQHandler(void)
{
    /* Clear overflow flag (write 0 while set) */
    FTM2->SC &= ~FTM_SC_TOF_MASK;

    uartFlag = 1;
}

/* ================= MAIN ================= */
int main(void)
{
    init_clock();
    init_uart0();
    init_FTM2();

    UART_Send("FTM2 Initialized\r\n");

    while (1)
    {
        if (uartFlag)
        {
            uartFlag = 0;
            UART_Send("A\r\n");
        }

        __WFI();   /* wait for interrupt */
    }
}

/* ================= CLOCK INIT ================= */
void init_clock(void)
{
    /*
     * Assume internal clock already configured by SDK startup
     * Bus clock = 32 MHz
     */
    SIM->BUSDIV = 0x01;   /* divide by 1 */
}

/* ================= UART0 INIT ================= */
void init_uart0(void)
{
    /* Enable UART0 clock */
    SIM->SCGC |= SIM_SCGC_UART0_MASK;

    /* UART0 pin select (TX/RX) */
    SIM->PINSEL |= SIM_PINSEL_UART0PS_MASK;

    /* Disable TX inversion (important!) */
    SIM->SOPT &= ~SIM_SOPT_TXDME_MASK;

    /*
     * 9600 baud @ 32 MHz
     * SBR = 32e6 / (16 * 9600) ≈ 208
     */
    UART0->BDH = 0x00;
    UART0->BDL = 53;

    UART0->C1 = 0x00;
    UART0->C2 = UART_C2_TE_MASK | UART_C2_RE_MASK;
}

/* ================= FTM2 INIT ================= */
void init_FTM2(void)
{
    /* Enable FTM2 clock */
    SIM->SCGC |= SIM_SCGC_FTM2_MASK;
    __DSB();

    /* ---- VERY IMPORTANT ORDER (KE02 SAFE) ---- */

    /* Stop counter completely */
    FTM2->SC = 0;

    /* Disable write protection (WRITE ONCE) */
    FTM2->MODE = FTM_MODE_WPDIS_MASK;

    /* Reset counter */
    FTM2->CNTIN = 0;
    FTM2->CNT   = 0;

    /*
     * 32 MHz / 128 = 250 kHz
     * 250000 ticks = 1 second
     */
    FTM2->MOD = 249999;

    /* Enable overflow interrupt, prescaler = 128 */
    FTM2->SC = FTM_SC_PS(7) | FTM_SC_TOIE_MASK;

    /* Enable NVIC */
    NVIC_EnableIRQ(FTM2_IRQn);

    /* START TIMER (LAST STEP ONLY) */
    FTM2->SC |= FTM_SC_CLKS(1);
}

/* ================= UART SEND ================= */
void UART_Send(const char *s)
{
    while (*s)
    {
        while (!(UART0->S1 & UART_S1_TDRE_MASK));
        UART0->D = *s++;
    }
}

 

0 项奖励
回复
0 回复数
%3CLINGO-SUB%20id%3D%22lingo-sub-2269247%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3EFTM%20%E5%AE%9A%E6%97%B6%E5%99%A8%E6%B7%B7%E4%B9%B1%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2269247%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%3CP%3E%E6%88%91%E8%AF%95%E5%9B%BE%E5%90%AF%E5%8A%A8%20FTM0%2FFTM1%20%E5%AE%9A%E6%97%B6%E5%99%A8%EF%BC%8C%E4%BD%86%E5%9C%A8%E8%BF%90%E8%A1%8C%E5%AE%9A%E6%97%B6%E5%99%A8%E4%BB%A3%E7%A0%81%E6%97%B6%E5%8D%B4%E5%87%BA%E7%8E%B0%E4%BA%86%20HardFault%20%E6%95%85%E9%9A%9C%EF%BC%8C%E4%B8%BA%E4%BB%80%E4%B9%88%EF%BC%9F%3CBR%20%2F%3E%3CBR%20%2F%3E%3CU%3E%3CEM%3E%3CSTRONG%3E%E6%97%A0%E6%B3%95%E8%BF%90%E8%A1%8C%E7%9A%84%E4%BB%A3%E7%A0%81%3C%2FSTRONG%3E%3C%2FEM%3E%3C%2FU%3E%3C%2FP%3E%3CPRE%20class%3D%22lia-code-sample%20language-markup%22%3E%3CCODE%20translate%3D%22no%22%3E%23include%20%22MKE02Z4.h%22%0A%0A%2F*%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%20GLOBALS%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%20*%2F%0Avolatile%20uint8_t%20uartFlag%20%3D%200%3B%0A%0A%2F*%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%20PROTOTYPES%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%20*%2F%0Avoid%20init_clock(void)%3B%0Avoid%20init_uart0(void)%3B%0Avoid%20init_FTM1(void)%3B%0Avoid%20UART_Send(const%20char%20*s)%3B%0A%0A%2F*%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%20FTM1%20ISR%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%20*%2F%0Avoid%20FTM1_IRQHandler(void)%0A%7B%0A%20%20%20%20%2F*%20Clear%20overflow%20flag%20(write%200%20while%20set)%20*%2F%0A%20%20%20%20FTM1-%26gt%3BSC%20%26amp%3B%3D%20~FTM_SC_TOF_MASK%3B%0A%0A%20%20%20%20uartFlag%20%3D%201%3B%0A%7D%0A%0A%2F*%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%20MAIN%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%20*%2F%0Aint%20main(void)%0A%7B%0A%20%20%20%20init_clock()%3B%0A%20%20%20%20init_uart0()%3B%0A%20%20%20%20init_FTM1()%3B%0A%0A%20%20%20%20UART_Send(%22FTM1%20Initialized%5Cr%5Cn%22)%3B%0A%0A%20%20%20%20while%20(1)%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20if%20(uartFlag)%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20uartFlag%20%3D%200%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20UART_Send(%22A%5Cr%5Cn%22)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20__WFI()%3B%20%20%20%2F*%20wait%20for%20interrupt%20*%2F%0A%20%20%20%20%7D%0A%7D%0A%0A%2F*%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%20CLOCK%20INIT%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%20*%2F%0Avoid%20init_clock(void)%0A%7B%0A%20%20%20%20%2F*%0A%20%20%20%20%20*%20Assume%20internal%20clock%20already%20configured%20by%20SDK%20startup%0A%20%20%20%20%20*%20Bus%20clock%20%3D%2032%20MHz%0A%20%20%20%20%20*%2F%0A%20%20%20%20SIM-%26gt%3BBUSDIV%20%3D%200x01%3B%20%20%20%2F*%20divide%20by%201%20*%2F%0A%7D%0A%0A%2F*%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%20UART0%20INIT%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%20*%2F%0Avoid%20init_uart0(void)%0A%7B%0A%20%20%20%20%2F*%20Enable%20UART0%20clock%20*%2F%0A%20%20%20%20SIM-%26gt%3BSCGC%20%7C%3D%20SIM_SCGC_UART0_MASK%3B%0A%0A%20%20%20%20%2F*%20UART0%20pin%20select%20(TX%2FRX)%20*%2F%0A%20%20%20%20SIM-%26gt%3BPINSEL%20%7C%3D%20SIM_PINSEL_UART0PS_MASK%3B%0A%0A%20%20%20%20%2F*%20Disable%20TX%20inversion%20(important!)%20*%2F%0A%20%20%20%20SIM-%26gt%3BSOPT%20%26amp%3B%3D%20~SIM_SOPT_TXDME_MASK%3B%0A%0A%20%20%20%20%2F*%0A%20%20%20%20%20*%209600%20baud%20%40%2032%20MHz%0A%20%20%20%20%20*%20SBR%20%3D%2032e6%20%2F%20(16%20*%209600)%20%E2%89%88%20208%0A%20%20%20%20%20*%2F%0A%20%20%20%20UART0-%26gt%3BBDH%20%3D%200x00%3B%0A%20%20%20%20UART0-%26gt%3BBDL%20%3D%2053%3B%0A%0A%20%20%20%20UART0-%26gt%3BC1%20%3D%200x00%3B%0A%20%20%20%20UART0-%26gt%3BC2%20%3D%20UART_C2_TE_MASK%20%7C%20UART_C2_RE_MASK%3B%0A%7D%0A%0A%2F*%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%20FTM1%20INIT%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%20*%2F%0Avoid%20init_FTM1(void)%0A%7B%0A%20%20%20%20%2F*%20Enable%20FTM1%20clock%20*%2F%0A%20%20%20%20SIM-%26gt%3BSCGC%20%7C%3D%20SIM_SCGC_FTM1_MASK%3B%0A%20%20%20%20__DSB()%3B%0A%0A%20%20%20%20%2F*%20----%20VERY%20IMPORTANT%20ORDER%20(KE02%20SAFE)%20----%20*%2F%0A%0A%20%20%20%20%2F*%20Stop%20counter%20completely%20*%2F%0A%20%20%20%20FTM1-%26gt%3BSC%20%3D%200%3B%0A%0A%20%20%20%20%2F*%20Disable%20write%20protection%20(WRITE%20ONCE)%20*%2F%0A%20%20%20%20FTM1-%26gt%3BMODE%20%3D%20FTM_MODE_WPDIS_MASK%3B%0A%0A%20%20%20%20%2F*%20Reset%20counter%20*%2F%0A%20%20%20%20FTM1-%26gt%3BCNTIN%20%3D%200%3B%0A%20%20%20%20FTM1-%26gt%3BCNT%20%20%20%3D%200%3B%0A%0A%20%20%20%20%2F*%0A%20%20%20%20%20*%2032%20MHz%20%2F%20128%20%3D%20250%20kHz%0A%20%20%20%20%20*%20250000%20ticks%20%3D%201%20second%0A%20%20%20%20%20*%2F%0A%20%20%20%20FTM1-%26gt%3BMOD%20%3D%20249999%3B%0A%0A%20%20%20%20%2F*%20Enable%20overflow%20interrupt%2C%20prescaler%20%3D%20128%20*%2F%0A%20%20%20%20FTM1-%26gt%3BSC%20%3D%20FTM_SC_PS(7)%20%7C%20FTM_SC_TOIE_MASK%3B%0A%0A%20%20%20%20%2F*%20Enable%20NVIC%20*%2F%0A%20%20%20%20NVIC_EnableIRQ(FTM1_IRQn)%3B%0A%0A%20%20%20%20%2F*%20START%20TIMER%20(LAST%20STEP%20ONLY)%20*%2F%0A%20%20%20%20FTM1-%26gt%3BSC%20%7C%3D%20FTM_SC_CLKS(1)%3B%0A%7D%0A%0A%2F*%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%20UART%20SEND%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%20*%2F%0Avoid%20UART_Send(const%20char%20*s)%0A%7B%0A%20%20%20%20while%20(*s)%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20while%20(!(UART0-%26gt%3BS1%20%26amp%3B%20UART_S1_TDRE_MASK))%3B%0A%20%20%20%20%20%20%20%20UART0-%26gt%3BD%20%3D%20*s%2B%2B%3B%0A%20%20%20%20%7D%0A%7D%3C%2FCODE%3E%3C%2FPRE%3E%3CP%3E%3CEM%3E%3CSTRONG%3E%E5%B7%A5%E4%BD%9C%E4%BB%A3%E7%A0%81%3CBR%20%2F%3E%3C%2FSTRONG%3E%3C%2FEM%3E%3C%2FP%3E%3CPRE%20class%3D%22lia-code-sample%20language-cpp%22%3E%3CCODE%20translate%3D%22no%22%3E%23include%20%22MKE02Z4.h%22%0A%0A%2F*%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%20GLOBALS%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%20*%2F%0Avolatile%20uint8_t%20uartFlag%20%3D%200%3B%0A%0A%2F*%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%20PROTOTYPES%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%20*%2F%0Avoid%20init_clock(void)%3B%0Avoid%20init_uart0(void)%3B%0Avoid%20init_FTM2(void)%3B%0Avoid%20UART_Send(const%20char%20*s)%3B%0A%0A%2F*%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%20FTM2%20ISR%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%20*%2F%0Avoid%20FTM2_IRQHandler(void)%0A%7B%0A%20%20%20%20%2F*%20Clear%20overflow%20flag%20(write%200%20while%20set)%20*%2F%0A%20%20%20%20FTM2-%26gt%3BSC%20%26amp%3B%3D%20~FTM_SC_TOF_MASK%3B%0A%0A%20%20%20%20uartFlag%20%3D%201%3B%0A%7D%0A%0A%2F*%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%20MAIN%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%20*%2F%0Aint%20main(void)%0A%7B%0A%20%20%20%20init_clock()%3B%0A%20%20%20%20init_uart0()%3B%0A%20%20%20%20init_FTM2()%3B%0A%0A%20%20%20%20UART_Send(%22FTM2%20Initialized%5Cr%5Cn%22)%3B%0A%0A%20%20%20%20while%20(1)%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20if%20(uartFlag)%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20uartFlag%20%3D%200%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20UART_Send(%22A%5Cr%5Cn%22)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20__WFI()%3B%20%20%20%2F*%20wait%20for%20interrupt%20*%2F%0A%20%20%20%20%7D%0A%7D%0A%0A%2F*%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%20CLOCK%20INIT%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%20*%2F%0Avoid%20init_clock(void)%0A%7B%0A%20%20%20%20%2F*%0A%20%20%20%20%20*%20Assume%20internal%20clock%20already%20configured%20by%20SDK%20startup%0A%20%20%20%20%20*%20Bus%20clock%20%3D%2032%20MHz%0A%20%20%20%20%20*%2F%0A%20%20%20%20SIM-%26gt%3BBUSDIV%20%3D%200x01%3B%20%20%20%2F*%20divide%20by%201%20*%2F%0A%7D%0A%0A%2F*%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%20UART0%20INIT%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%20*%2F%0Avoid%20init_uart0(void)%0A%7B%0A%20%20%20%20%2F*%20Enable%20UART0%20clock%20*%2F%0A%20%20%20%20SIM-%26gt%3BSCGC%20%7C%3D%20SIM_SCGC_UART0_MASK%3B%0A%0A%20%20%20%20%2F*%20UART0%20pin%20select%20(TX%2FRX)%20*%2F%0A%20%20%20%20SIM-%26gt%3BPINSEL%20%7C%3D%20SIM_PINSEL_UART0PS_MASK%3B%0A%0A%20%20%20%20%2F*%20Disable%20TX%20inversion%20(important!)%20*%2F%0A%20%20%20%20SIM-%26gt%3BSOPT%20%26amp%3B%3D%20~SIM_SOPT_TXDME_MASK%3B%0A%0A%20%20%20%20%2F*%0A%20%20%20%20%20*%209600%20baud%20%40%2032%20MHz%0A%20%20%20%20%20*%20SBR%20%3D%2032e6%20%2F%20(16%20*%209600)%20%E2%89%88%20208%0A%20%20%20%20%20*%2F%0A%20%20%20%20UART0-%26gt%3BBDH%20%3D%200x00%3B%0A%20%20%20%20UART0-%26gt%3BBDL%20%3D%2053%3B%0A%0A%20%20%20%20UART0-%26gt%3BC1%20%3D%200x00%3B%0A%20%20%20%20UART0-%26gt%3BC2%20%3D%20UART_C2_TE_MASK%20%7C%20UART_C2_RE_MASK%3B%0A%7D%0A%0A%2F*%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%20FTM2%20INIT%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%20*%2F%0Avoid%20init_FTM2(void)%0A%7B%0A%20%20%20%20%2F*%20Enable%20FTM2%20clock%20*%2F%0A%20%20%20%20SIM-%26gt%3BSCGC%20%7C%3D%20SIM_SCGC_FTM2_MASK%3B%0A%20%20%20%20__DSB()%3B%0A%0A%20%20%20%20%2F*%20----%20VERY%20IMPORTANT%20ORDER%20(KE02%20SAFE)%20----%20*%2F%0A%0A%20%20%20%20%2F*%20Stop%20counter%20completely%20*%2F%0A%20%20%20%20FTM2-%26gt%3BSC%20%3D%200%3B%0A%0A%20%20%20%20%2F*%20Disable%20write%20protection%20(WRITE%20ONCE)%20*%2F%0A%20%20%20%20FTM2-%26gt%3BMODE%20%3D%20FTM_MODE_WPDIS_MASK%3B%0A%0A%20%20%20%20%2F*%20Reset%20counter%20*%2F%0A%20%20%20%20FTM2-%26gt%3BCNTIN%20%3D%200%3B%0A%20%20%20%20FTM2-%26gt%3BCNT%20%20%20%3D%200%3B%0A%0A%20%20%20%20%2F*%0A%20%20%20%20%20*%2032%20MHz%20%2F%20128%20%3D%20250%20kHz%0A%20%20%20%20%20*%20250000%20ticks%20%3D%201%20second%0A%20%20%20%20%20*%2F%0A%20%20%20%20FTM2-%26gt%3BMOD%20%3D%20249999%3B%0A%0A%20%20%20%20%2F*%20Enable%20overflow%20interrupt%2C%20prescaler%20%3D%20128%20*%2F%0A%20%20%20%20FTM2-%26gt%3BSC%20%3D%20FTM_SC_PS(7)%20%7C%20FTM_SC_TOIE_MASK%3B%0A%0A%20%20%20%20%2F*%20Enable%20NVIC%20*%2F%0A%20%20%20%20NVIC_EnableIRQ(FTM2_IRQn)%3B%0A%0A%20%20%20%20%2F*%20START%20TIMER%20(LAST%20STEP%20ONLY)%20*%2F%0A%20%20%20%20FTM2-%26gt%3BSC%20%7C%3D%20FTM_SC_CLKS(1)%3B%0A%7D%0A%0A%2F*%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%20UART%20SEND%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%20*%2F%0Avoid%20UART_Send(const%20char%20*s)%0A%7B%0A%20%20%20%20while%20(*s)%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20while%20(!(UART0-%26gt%3BS1%20%26amp%3B%20UART_S1_TDRE_MASK))%3B%0A%20%20%20%20%20%20%20%20UART0-%26gt%3BD%20%3D%20*s%2B%2B%3B%0A%20%20%20%20%7D%0A%7D%3C%2FCODE%3E%3C%2FPRE%3E%3CP%3E%3CEM%3E%3CSTRONG%3E%26nbsp%3B%3C%2FSTRONG%3E%3C%2FEM%3E%3C%2FP%3E%3C%2FLINGO-BODY%3E