Понимание работы сторожевого таймера PIC32

Я новичок в разработке UC и дурачусь с серией PIC уже около 6 месяцев. Недавно я начал работать с PIC32 и компилятором Microchip XC32 C++. Я не знаю, есть ли у меня фундаментальное непонимание того, как WDT работает в серии PIC, или есть какое-то предостережение, о котором я не знаю, однако у меня есть код, который, я думаю, должен зажечь светодиод на RA0, а затем включить он выключен, и через 512 мс WDT должен сбросить UC, и процесс должен начаться заново. На самом деле происходит то, что светодиод загорается на мгновение, затем гаснет и больше никогда не включается. Я не знаю, означает ли это, что WDT неправильно настроен или что. Вот мой код:

#include <xc.h>

#define LED _LATA0

/*
 * 
 */
int main(int argc, char** argv) {

    WDTCONbits.WDTPS = 0b1001; //512ms postscaler
    WDTCONbits.WDTCLR = 1; // feed the watchdog

    WDTCONbits.ON = 1; // enable the watchdog


    TRISAbits.TRISA0 = 0; //output on RA0
    ANSELAbits.ANSA0 = 0; // digital only


    LED = 1; //led on
    int i = 100000;
    while(i--);
    LED = 0; // led off
    while(1); // hang up and let WDT reset us

    return 0;
}

Какую часть успешного использования WDT я упускаю?

Ответы (1)

Покопавшись еще немного, я думаю, что нашел ответ. Согласно этому документу , WDTCONbits.WDTPSрегистр — это просто теневая копия битов постскейлера. Чтобы установить постскейлер, мне пришлось добавить в свой основной файл #pragma config WDTPS = PS512. Мой успешный код теперь гласит:

#define LED _LATA0
#pragma config WDTPS = PS512 // this is the magic line

/*
 * 
 */
int main(int argc, char** argv) {


    //WDTCONbits.WDTPS = 0b1001; //512ms postscaler

    WDTCONbits.WDTCLR = 1; // feed the watchdog



    WDTCONbits.ON = 1; // enable the watchdog


    TRISAbits.TRISA0 = 0; //output on RA0
    ANSELAbits.ANSA0 = 0; // digital only


    LED = 1; //led on
    int i = 100000;
    while(i--);
    LED = 0; // led off
    while(1); // hang up and let WDT reset us

    return 0;
}