<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic FTM Timer Confusion in Kinetis Microcontrollers</title>
    <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/FTM-Timer-Confusion/m-p/2269247#M68129</link>
    <description>&lt;P&gt;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??&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;&lt;U&gt;&lt;EM&gt;&lt;STRONG&gt;the not working code&lt;/STRONG&gt;&lt;/EM&gt;&lt;/U&gt;&lt;/P&gt;&lt;LI-CODE lang="markup"&gt;#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-&amp;gt;SC &amp;amp;= ~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-&amp;gt;BUSDIV = 0x01;   /* divide by 1 */
}

/* ================= UART0 INIT ================= */
void init_uart0(void)
{
    /* Enable UART0 clock */
    SIM-&amp;gt;SCGC |= SIM_SCGC_UART0_MASK;

    /* UART0 pin select (TX/RX) */
    SIM-&amp;gt;PINSEL |= SIM_PINSEL_UART0PS_MASK;

    /* Disable TX inversion (important!) */
    SIM-&amp;gt;SOPT &amp;amp;= ~SIM_SOPT_TXDME_MASK;

    /*
     * 9600 baud @ 32 MHz
     * SBR = 32e6 / (16 * 9600) ≈ 208
     */
    UART0-&amp;gt;BDH = 0x00;
    UART0-&amp;gt;BDL = 53;

    UART0-&amp;gt;C1 = 0x00;
    UART0-&amp;gt;C2 = UART_C2_TE_MASK | UART_C2_RE_MASK;
}

/* ================= FTM1 INIT ================= */
void init_FTM1(void)
{
    /* Enable FTM1 clock */
    SIM-&amp;gt;SCGC |= SIM_SCGC_FTM1_MASK;
    __DSB();

    /* ---- VERY IMPORTANT ORDER (KE02 SAFE) ---- */

    /* Stop counter completely */
    FTM1-&amp;gt;SC = 0;

    /* Disable write protection (WRITE ONCE) */
    FTM1-&amp;gt;MODE = FTM_MODE_WPDIS_MASK;

    /* Reset counter */
    FTM1-&amp;gt;CNTIN = 0;
    FTM1-&amp;gt;CNT   = 0;

    /*
     * 32 MHz / 128 = 250 kHz
     * 250000 ticks = 1 second
     */
    FTM1-&amp;gt;MOD = 249999;

    /* Enable overflow interrupt, prescaler = 128 */
    FTM1-&amp;gt;SC = FTM_SC_PS(7) | FTM_SC_TOIE_MASK;

    /* Enable NVIC */
    NVIC_EnableIRQ(FTM1_IRQn);

    /* START TIMER (LAST STEP ONLY) */
    FTM1-&amp;gt;SC |= FTM_SC_CLKS(1);
}

/* ================= UART SEND ================= */
void UART_Send(const char *s)
{
    while (*s)
    {
        while (!(UART0-&amp;gt;S1 &amp;amp; UART_S1_TDRE_MASK));
        UART0-&amp;gt;D = *s++;
    }
}&lt;/LI-CODE&gt;&lt;P&gt;&lt;EM&gt;&lt;STRONG&gt;&amp;nbsp;the working code&lt;BR /&gt;&lt;/STRONG&gt;&lt;/EM&gt;&lt;/P&gt;&lt;LI-CODE lang="cpp"&gt;#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-&amp;gt;SC &amp;amp;= ~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-&amp;gt;BUSDIV = 0x01;   /* divide by 1 */
}

/* ================= UART0 INIT ================= */
void init_uart0(void)
{
    /* Enable UART0 clock */
    SIM-&amp;gt;SCGC |= SIM_SCGC_UART0_MASK;

    /* UART0 pin select (TX/RX) */
    SIM-&amp;gt;PINSEL |= SIM_PINSEL_UART0PS_MASK;

    /* Disable TX inversion (important!) */
    SIM-&amp;gt;SOPT &amp;amp;= ~SIM_SOPT_TXDME_MASK;

    /*
     * 9600 baud @ 32 MHz
     * SBR = 32e6 / (16 * 9600) ≈ 208
     */
    UART0-&amp;gt;BDH = 0x00;
    UART0-&amp;gt;BDL = 53;

    UART0-&amp;gt;C1 = 0x00;
    UART0-&amp;gt;C2 = UART_C2_TE_MASK | UART_C2_RE_MASK;
}

/* ================= FTM2 INIT ================= */
void init_FTM2(void)
{
    /* Enable FTM2 clock */
    SIM-&amp;gt;SCGC |= SIM_SCGC_FTM2_MASK;
    __DSB();

    /* ---- VERY IMPORTANT ORDER (KE02 SAFE) ---- */

    /* Stop counter completely */
    FTM2-&amp;gt;SC = 0;

    /* Disable write protection (WRITE ONCE) */
    FTM2-&amp;gt;MODE = FTM_MODE_WPDIS_MASK;

    /* Reset counter */
    FTM2-&amp;gt;CNTIN = 0;
    FTM2-&amp;gt;CNT   = 0;

    /*
     * 32 MHz / 128 = 250 kHz
     * 250000 ticks = 1 second
     */
    FTM2-&amp;gt;MOD = 249999;

    /* Enable overflow interrupt, prescaler = 128 */
    FTM2-&amp;gt;SC = FTM_SC_PS(7) | FTM_SC_TOIE_MASK;

    /* Enable NVIC */
    NVIC_EnableIRQ(FTM2_IRQn);

    /* START TIMER (LAST STEP ONLY) */
    FTM2-&amp;gt;SC |= FTM_SC_CLKS(1);
}

/* ================= UART SEND ================= */
void UART_Send(const char *s)
{
    while (*s)
    {
        while (!(UART0-&amp;gt;S1 &amp;amp; UART_S1_TDRE_MASK));
        UART0-&amp;gt;D = *s++;
    }
}&lt;/LI-CODE&gt;&lt;P&gt;&lt;EM&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/EM&gt;&lt;/P&gt;</description>
    <pubDate>Fri, 26 Dec 2025 11:29:37 GMT</pubDate>
    <dc:creator>Jana_muralidharan</dc:creator>
    <dc:date>2025-12-26T11:29:37Z</dc:date>
    <item>
      <title>FTM Timer Confusion</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/FTM-Timer-Confusion/m-p/2269247#M68129</link>
      <description>&lt;P&gt;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??&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;&lt;U&gt;&lt;EM&gt;&lt;STRONG&gt;the not working code&lt;/STRONG&gt;&lt;/EM&gt;&lt;/U&gt;&lt;/P&gt;&lt;LI-CODE lang="markup"&gt;#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-&amp;gt;SC &amp;amp;= ~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-&amp;gt;BUSDIV = 0x01;   /* divide by 1 */
}

/* ================= UART0 INIT ================= */
void init_uart0(void)
{
    /* Enable UART0 clock */
    SIM-&amp;gt;SCGC |= SIM_SCGC_UART0_MASK;

    /* UART0 pin select (TX/RX) */
    SIM-&amp;gt;PINSEL |= SIM_PINSEL_UART0PS_MASK;

    /* Disable TX inversion (important!) */
    SIM-&amp;gt;SOPT &amp;amp;= ~SIM_SOPT_TXDME_MASK;

    /*
     * 9600 baud @ 32 MHz
     * SBR = 32e6 / (16 * 9600) ≈ 208
     */
    UART0-&amp;gt;BDH = 0x00;
    UART0-&amp;gt;BDL = 53;

    UART0-&amp;gt;C1 = 0x00;
    UART0-&amp;gt;C2 = UART_C2_TE_MASK | UART_C2_RE_MASK;
}

/* ================= FTM1 INIT ================= */
void init_FTM1(void)
{
    /* Enable FTM1 clock */
    SIM-&amp;gt;SCGC |= SIM_SCGC_FTM1_MASK;
    __DSB();

    /* ---- VERY IMPORTANT ORDER (KE02 SAFE) ---- */

    /* Stop counter completely */
    FTM1-&amp;gt;SC = 0;

    /* Disable write protection (WRITE ONCE) */
    FTM1-&amp;gt;MODE = FTM_MODE_WPDIS_MASK;

    /* Reset counter */
    FTM1-&amp;gt;CNTIN = 0;
    FTM1-&amp;gt;CNT   = 0;

    /*
     * 32 MHz / 128 = 250 kHz
     * 250000 ticks = 1 second
     */
    FTM1-&amp;gt;MOD = 249999;

    /* Enable overflow interrupt, prescaler = 128 */
    FTM1-&amp;gt;SC = FTM_SC_PS(7) | FTM_SC_TOIE_MASK;

    /* Enable NVIC */
    NVIC_EnableIRQ(FTM1_IRQn);

    /* START TIMER (LAST STEP ONLY) */
    FTM1-&amp;gt;SC |= FTM_SC_CLKS(1);
}

/* ================= UART SEND ================= */
void UART_Send(const char *s)
{
    while (*s)
    {
        while (!(UART0-&amp;gt;S1 &amp;amp; UART_S1_TDRE_MASK));
        UART0-&amp;gt;D = *s++;
    }
}&lt;/LI-CODE&gt;&lt;P&gt;&lt;EM&gt;&lt;STRONG&gt;&amp;nbsp;the working code&lt;BR /&gt;&lt;/STRONG&gt;&lt;/EM&gt;&lt;/P&gt;&lt;LI-CODE lang="cpp"&gt;#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-&amp;gt;SC &amp;amp;= ~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-&amp;gt;BUSDIV = 0x01;   /* divide by 1 */
}

/* ================= UART0 INIT ================= */
void init_uart0(void)
{
    /* Enable UART0 clock */
    SIM-&amp;gt;SCGC |= SIM_SCGC_UART0_MASK;

    /* UART0 pin select (TX/RX) */
    SIM-&amp;gt;PINSEL |= SIM_PINSEL_UART0PS_MASK;

    /* Disable TX inversion (important!) */
    SIM-&amp;gt;SOPT &amp;amp;= ~SIM_SOPT_TXDME_MASK;

    /*
     * 9600 baud @ 32 MHz
     * SBR = 32e6 / (16 * 9600) ≈ 208
     */
    UART0-&amp;gt;BDH = 0x00;
    UART0-&amp;gt;BDL = 53;

    UART0-&amp;gt;C1 = 0x00;
    UART0-&amp;gt;C2 = UART_C2_TE_MASK | UART_C2_RE_MASK;
}

/* ================= FTM2 INIT ================= */
void init_FTM2(void)
{
    /* Enable FTM2 clock */
    SIM-&amp;gt;SCGC |= SIM_SCGC_FTM2_MASK;
    __DSB();

    /* ---- VERY IMPORTANT ORDER (KE02 SAFE) ---- */

    /* Stop counter completely */
    FTM2-&amp;gt;SC = 0;

    /* Disable write protection (WRITE ONCE) */
    FTM2-&amp;gt;MODE = FTM_MODE_WPDIS_MASK;

    /* Reset counter */
    FTM2-&amp;gt;CNTIN = 0;
    FTM2-&amp;gt;CNT   = 0;

    /*
     * 32 MHz / 128 = 250 kHz
     * 250000 ticks = 1 second
     */
    FTM2-&amp;gt;MOD = 249999;

    /* Enable overflow interrupt, prescaler = 128 */
    FTM2-&amp;gt;SC = FTM_SC_PS(7) | FTM_SC_TOIE_MASK;

    /* Enable NVIC */
    NVIC_EnableIRQ(FTM2_IRQn);

    /* START TIMER (LAST STEP ONLY) */
    FTM2-&amp;gt;SC |= FTM_SC_CLKS(1);
}

/* ================= UART SEND ================= */
void UART_Send(const char *s)
{
    while (*s)
    {
        while (!(UART0-&amp;gt;S1 &amp;amp; UART_S1_TDRE_MASK));
        UART0-&amp;gt;D = *s++;
    }
}&lt;/LI-CODE&gt;&lt;P&gt;&lt;EM&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/EM&gt;&lt;/P&gt;</description>
      <pubDate>Fri, 26 Dec 2025 11:29:37 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/FTM-Timer-Confusion/m-p/2269247#M68129</guid>
      <dc:creator>Jana_muralidharan</dc:creator>
      <dc:date>2025-12-26T11:29:37Z</dc:date>
    </item>
    <item>
      <title>Re: FTM Timer Confusion</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/FTM-Timer-Confusion/m-p/2269461#M68131</link>
      <description>&lt;P&gt;Hi&amp;nbsp;&lt;a href="https://community.nxp.com/t5/user/viewprofilepage/user-id/258109"&gt;@Jana_muralidharan&lt;/a&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV&gt;Please debug to check whether the FTM1 clock is enabled and verify if the counter register is functioning properly.&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;BR&lt;/DIV&gt;
&lt;DIV&gt;Alice&amp;nbsp;&lt;/DIV&gt;</description>
      <pubDate>Mon, 29 Dec 2025 03:55:55 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/FTM-Timer-Confusion/m-p/2269461#M68131</guid>
      <dc:creator>Alice_Yang</dc:creator>
      <dc:date>2025-12-29T03:55:55Z</dc:date>
    </item>
    <item>
      <title>Re: FTM Timer Confusion</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/FTM-Timer-Confusion/m-p/2269468#M68132</link>
      <description>&lt;P&gt;I actually found the error&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;It is that I used registers that are specific to only FTM2,&lt;/P&gt;&lt;P&gt;So, after removing the unwanted registers it worked perfectly fine.&lt;/P&gt;&lt;P&gt;And I found out that&amp;nbsp;&lt;STRONG&gt;HardFault Error&amp;nbsp;&lt;/STRONG&gt;will only occur when, &lt;EM&gt;&lt;STRONG&gt;We use register which are not there in the first place.&lt;/STRONG&gt;&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;FONT size="5"&gt;&lt;STRONG&gt;&lt;EM&gt;Hey and thanks for your attention to this query thanks.....&lt;/EM&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;</description>
      <pubDate>Mon, 29 Dec 2025 05:19:34 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/FTM-Timer-Confusion/m-p/2269468#M68132</guid>
      <dc:creator>Jana_muralidharan</dc:creator>
      <dc:date>2025-12-29T05:19:34Z</dc:date>
    </item>
  </channel>
</rss>

