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++;
}
}