PIC24F32KA302 Спящий режим
Я хочу настроить PIC24F32KA302 на переход в спящий режим и активацию по прерыванию RTC. Однако после пробуждения моя программа снова запускается с самого начала. В техническом описании упоминается, что: - Если назначенный приоритет для прерывания меньше или равен текущему приоритету ЦП, устройство активируется и продолжит выполнение кода из инструкции, следующей за инструкцией PWRSAV, которая инициировала спящий режим. - Если назначенный уровень приоритета для источника прерывания больше, чем текущий приоритет ЦП, устройство активируется и начнется процесс исключения ЦП. Выполнение кода будет продолжено с первой инструкции ISR. Я пробовал обе конфигурации, но результаты одинаковы. Мой код ниже:
int main(void) {
SYS_Init();
while(1){
__delay_ms(400);
Sleep();
}
return 0;}
void __attribute__ ( (interrupt, no_auto_psv) ) _RTCCInterrupt(void) {
IFS3bits.RTCIF = 0;
//To do:
Total_Pulse += TMR1;
TMR1 = 0;
LED = ~LED;}
void InterruptPriority_Init(void) {
INTCON1bits.NSTDIS = 1;
INTCON2bits.ALTIVT = 0;
SRbits.IPL = 1;
IPC15bits.RTCIP = 6;//6
_U2RXIP = 5;
_T1IP = 4;
_U1RXIP = 2;
_HLVDIP = 3;}
Функция SYS_Init() инициализирует прерывание, RTC и другие периферийные модули. Эта функция всегда запускается после выхода устройства из спящего режима. У вас есть идея или совет для меня? Спасибо
1 ответ
Вполне может произойти какая-то ошибка, приводящая к перезагрузке вашего устройства.
Вы добавили процедуры ловушки? Если нет, добавьте этот код и посмотрите, попадете ли вы в одну из этих ловушек.
Также убедитесь, что в вашей цепи нет перебоев в питании, и что на выводе сброса нет какого-либо шума, вы можете добавить конденсатор на 100 нФ между выводом сброса и заземлением (конечно, сохраняя подтягивание).
/******************************************************************************/
/* Files to Include */
/******************************************************************************/
/* Device header file */
#if defined(__XC16__)
#include <xc.h>
#elif defined(__C30__)
#if defined(__PIC24E__)
#include <p24Exxxx.h>
#elif defined (__PIC24F__)||defined (__PIC24FK__)
#include <p24Fxxxx.h>
#elif defined(__PIC24H__)
#include <p24Hxxxx.h>
#endif
#endif
#include <stdint.h> /* Includes uint16_t definition */
#include <stdbool.h> /* Includes true/false definition */
/******************************************************************************/
/* Trap Function Prototypes */
/******************************************************************************/
/* <Other function prototypes for debugging trap code may be inserted here> */
/* Use if INTCON2 ALTIVT=1 */
void __attribute__((interrupt,no_auto_psv)) _OscillatorFail(void);
void __attribute__((interrupt,no_auto_psv)) _AddressError(void);
void __attribute__((interrupt,no_auto_psv)) _StackError(void);
void __attribute__((interrupt,no_auto_psv)) _MathError(void);
#if defined(__PIC24F__)||defined(__PIC24H__)
/* Use if INTCON2 ALTIVT=0 */
void __attribute__((interrupt,no_auto_psv)) _AltOscillatorFail(void);
void __attribute__((interrupt,no_auto_psv)) _AltAddressError(void);
void __attribute__((interrupt,no_auto_psv)) _AltStackError(void);
void __attribute__((interrupt,no_auto_psv)) _AltMathError(void);
#endif
/* Default interrupt handler */
void __attribute__((interrupt,no_auto_psv)) _DefaultInterrupt(void);
#if defined(__PIC24E__)
/* These are additional traps in the 24E family. Refer to the PIC24E
migration guide. There are no Alternate Vectors in the 24E family. */
void __attribute__((interrupt,no_auto_psv)) _HardTrapError(void);
void __attribute__((interrupt,no_auto_psv)) _DMACError(void);
void __attribute__((interrupt,no_auto_psv)) _SoftTrapError(void);
#endif
/******************************************************************************/
/* Trap Handling */
/* */
/* These trap routines simply ensure that the device continuously loops */
/* within each routine. Users who actually experience one of these traps */
/* can add code to handle the error. Some basic examples for trap code, */
/* including assembly routines that process trap sources, are available at */
/* www.microchip.com/codeexamples */
/******************************************************************************/
/* Primary (non-alternate) address error trap function declarations */
void __attribute__((interrupt,no_auto_psv)) _OscillatorFail(void)
{
INTCON1bits.OSCFAIL = 0; /* Clear the trap flag */
while(1);
}
void __attribute__((interrupt,no_auto_psv)) _AddressError(void)
{
INTCON1bits.ADDRERR = 0; /* Clear the trap flag */
while (1);
}
void __attribute__((interrupt,no_auto_psv)) _StackError(void)
{
INTCON1bits.STKERR = 0; /* Clear the trap flag */
while (1);
}
void __attribute__((interrupt,no_auto_psv)) _MathError(void)
{
INTCON1bits.MATHERR = 0; /* Clear the trap flag */
while (1);
}
#if defined(__PIC24F__)||defined(__PIC24H__)
/* Alternate address error trap function declarations */
void __attribute__((interrupt,no_auto_psv)) _AltOscillatorFail(void)
{
INTCON1bits.OSCFAIL = 0; /* Clear the trap flag */
while (1);
}
void __attribute__((interrupt,no_auto_psv)) _AltAddressError(void)
{
INTCON1bits.ADDRERR = 0; /* Clear the trap flag */
while (1);
}
void __attribute__((interrupt,no_auto_psv)) _AltStackError(void)
{
INTCON1bits.STKERR = 0; /* Clear the trap flag */
while (1);
}
void __attribute__((interrupt,no_auto_psv)) _AltMathError(void)
{
INTCON1bits.MATHERR = 0; /* Clear the trap flag */
while (1);
}
#endif
/******************************************************************************/
/* Default Interrupt Handler */
/* */
/* This executes when an interrupt occurs for an interrupt source with an */
/* improperly defined or undefined interrupt handling routine. */
/******************************************************************************/
void __attribute__((interrupt,no_auto_psv)) _DefaultInterrupt(void)
{
while(1);
}
#if defined(__PIC24E__)
/* These traps are new to the PIC24E family. Refer to the device Interrupt
chapter of the FRM to understand trap priority. */
void __attribute__((interrupt,no_auto_psv)) _HardTrapError(void)
{
while(1);
}
void __attribute__((interrupt,no_auto_psv)) _DMACError(void)
{
while(1);
}
void __attribute__((interrupt,no_auto_psv)) _SoftTrapError(void)
{
while(1);
}
#endif