Hello,
I want to setup a watchdog but I don't want to use MQX watchdog. I rather use SWT watchdog from the microcontroller (MPC5668G). By the way, I'm using MQX 4.1.1.
Here is the init function to setup the watchdog. As you can see, I've setup the watchdog to interrupt first and then reset on second consecutive timeout. However, even if a watchdog timer timeout occurs, the ISR is never called.
/*==============================================================================
* Function name: SWT_Init
* Description: This function initializes the Software Watchdog Timer.
* Inputs:
* eMode -> Watchdog refresh mode (normal, window)
* eAction -> Action to be taken when watchdog timeout occurs
* u32Timeout -> Watchdog timeout in ms
* u32WindowStartValue -> Value after which watchdog should be refreshed if
* window mode is used (ignored in normal mode) in ms
* pfIsr -> Function that will be call upon watchdog timeout
* Outputs:
* None
==============================================================================*/
void SWT_Init(SWT_eWatchdogMode eMode, SWT_eWatchdogAction eAction, uint32_t u32Timeout, uint32_t u32WindowStartValue, INT_EXCEPTION_FPTR pfIsr)
{
uint32_t u32NbClkTicks;
vuint32_t u32TmpTCR;
vuint32_t u32TmpCR;
/* Clear any pending interrupt */
SWT.IR.B.TIF = (vuint32_t)1;
/* Install interrupt function to be called */
// _int_install_isr(PSP_EXCPT_WATCHDOG_TIMER, pfIsr, NULL);
_int_set_exception_handler(PSP_EXCPT_WATCHDOG_TIMER, pfIsr);
/* Enable watchdog interrupt */
_PSP_SPR_GET(u32TmpTCR, E200CORE_TCR);
u32TmpTCR |= E200CORE_TCR_WIE;
_PSP_SPR_SET(E200CORE_TCR, u32TmpTCR);
/* Set watchdog mode */
if(SWT_KE_MODE_WINDOW == eMode)
{
u32TmpCR |= SWT_KU32_CR_WND;
u32NbClkTicks = (SWT_KU32_WATCHDOG_CLOCK_FREQ / (uint32_t)1000) * u32WindowStartValue;
SWT.WN.R = u32NbClkTicks;
}
else
{
u32TmpCR &= ~SWT_KU32_CR_WND;
}
/* Set action to be taken when watchdog timeout occurs */
if(SWT_KE_ACTION_INTERRUPT_THEN_RESET == eAction)
{
u32TmpCR |= SWT_KU32_CR_ITR;
}
else
{
u32TmpCR &= ~SWT_KU32_CR_ITR;
}
/* Watchdog counter stop in debug mode, enable access by z6 core, enable watchdog and hardware lock bit */
u32TmpCR |= ( SWT_KU32_CR_FRZ
| SWT_KU32_CR_MAP0
| SWT_KU32_CR_HLK
| SWT_KU32_CR_WEN);
/* Set timeout value */
u32NbClkTicks = (SWT_KU32_WATCHDOG_CLOCK_FREQ / (uint32_t)1000) * u32Timeout;
SWT.TO.R = u32NbClkTicks;
/* Update control register */
SWT.CR.R = u32TmpCR;
}
Here is what I do in my init task:
printf("init\n");
_int_install_exception_isr();
/* Initialize and start watchdog */
SWT_Init(SWT_KE_MODE_REGULAR, SWT_KE_ACTION_INTERRUPT_THEN_RESET, (uint32_t)200, (uint32_t)0, HandleWatchdogTimeout);
Here is my ISR function:
void HandleWatchdogTimeout(uint32_t u32IsrVector, uint32_t u32ExceptionVector, void * pvIsrData, void * pvExceptionFrame)
{
printf("u32IsrVector: %d\nu32ExceptionVector: %d\n", u32IsrVector, u32ExceptionVector);
for(;;){}
}
I've also tried to setup a simple ISR function with _int_install_isr() but it doesn't work better. Does anyone has an idea of what the problem could be?
Thanks
Hugo
Solved! Go to Solution.
The interrupt flag (TSR[WIS] = 1) also need to be cleared during initialization.
The critical interrupt should be enabled (MSR[CE] = 1). In MQX it is already the case.
The proper interrupt has to be setup:
/* Install interrupt function to be called */
_int_install_isr(MPXN20_INTC_SWT_TIMEOUT_VECTOR, pfIsr, NULL);
_bsp_int_init(MPXN20_INTC_SWT_TIMEOUT_VECTOR, 15, 0, TRUE);
The interrupt flag (TSR[WIS] = 1) also need to be cleared during initialization.
The critical interrupt should be enabled (MSR[CE] = 1). In MQX it is already the case.
The proper interrupt has to be setup:
/* Install interrupt function to be called */
_int_install_isr(MPXN20_INTC_SWT_TIMEOUT_VECTOR, pfIsr, NULL);
_bsp_int_init(MPXN20_INTC_SWT_TIMEOUT_VECTOR, 15, 0, TRUE);
Hi Hugo:
From MQX point of view, installing application-defined ISR, we need to
1 _int_install_isr , this function replace the ISR with an application-defined, interrupt-specific ISR, which MQX RTOS calls, when the interrupt occurs. The application should do the replacement before it initializes the device
2 _bsp_int_init , it initializes a specific interrupt in the proper interrupt controller, set the priority of the interrupt
Regards
Daniel