|
1. Conectando os níveis superior e inferior Não importa o quão bom seja o sistema operacional, seja o atual Win7 ou o futuro Win8 e Win9, sempre haverá uma BlueScreen, sem falar em um pequeno microcontrolador~ Razões imprevisíveis como ruído elétrico, queda de energia, descarga eletrostática, etc., podem causar o funcionamento anormal do sistema embarcado. O Watch Dog, para ser preciso, deveria ser um temporizador watchdog, que é uma estrutura de circuito especialmente usada para monitorar o status de funcionamento do programa do microcontrolador. O princípio básico é: após iniciar o temporizador watchdog, ele começará a contar a partir de 0; se o programa não apagar o tempo dentro do intervalo de tempo especificado, o timer watchdog reiniciará o sistema (equivalente a reiniciar o computador), como mostrado na figura abaixo (desenhado no Word, o desenho é mais uma dor de ovos~):
Vamos apresentar um método simples de aplicação de cão de guarda: Como soltar um cachorro? Como alimentar? O que vai acontecer se você não alimentar? 2. A história do cão de guarda(1) Introdução ao experimentoSe o cachorro for alimentado, o sistema está funcionando normalmente; Se você não alimentar o cachorro, o sistema continua reiniciando. (2) Fluxograma de programas
(3) Código-fonte experimental e análise/*
Descrição do experimento: No experimento watchdog, se o cachorro não for alimentado, o sistema continua reiniciando.
*/
#include
#define liderou1 P1_0
#define P1_1 liderado2
#define liderou 3 P1_2
#define P1_3 Led4
/*系统时钟初始化
-------------------------------------------------------*/
vazioxtal_init(vazio)
{ SONO &= ~0x04; //都上电
enquanto(! (SONO &0x40)); //晶体振荡器开启且稳定 CLKCON &= ~0x47; Escolha um oscilador de cristal de 32MHz SONO |=0x04;
}
/*LED初始化
-------------------------------------------------------*/
vazioled_init(vazio)
{ P1SEL =0x00; P1 é a porta normal de E/S P1DIR |=0x0F; Saída P1.0 P1.1 P1.2 P1.3
liderado1 =1; //关闭所有LED liderado2 =1; Liderado3 =1; liderado4 =1;
}
/*看门狗初始化
-------------------------------------------------------*/
vaziowatchdog_Init(vazio)
{ WDCTL =0x00; //看门狗模式,时间间隔一秒 WDCTL |=0x08; //启动看门狗
}
/*喂狗程序
-------------------------------------------------------*/
vazioFeetDog(vazio)
{ WDCTL =0xa0; WDCTL =0x50;
}
/*延时函数(小于1秒。读者可以想一下,若大于1秒,会出现什么情况)
-------------------------------------------------------*/
vazioAtraso(vazio)
{
sem assinatura intn;
para(n=50000; N>0; n--);
para(n=50000; N>0; n--);
para(n=50000; N>0; n--);
para(n=50000; N>0; n--);
para(n=50000; N>0; n--);
para(n=50000; N>0; n--);
para(n=50000; N>0; n--);
}
/*主函数
-------------------------------------------------------*/
vaziomain(vazio)
{ xtal_init(); led_init(); watchdog_Init();
Atraso(); liderado1 =0; //点亮led1
enquanto(1) { FeetDog(); Comando de alimentação para cães (o sistema não reinicia após a ligação, e a pequena luz não pisca; Se anotado, o sistema continuará a resetar, e a pequena luz piscará a cada 1 segundo) }
}
Como você pode ver no código-fonte acima, o método de operação do Watch Dog é muito simples, e todo o processo envolve apenas um novo SFR, ou seja,WDCTL。A seguir está uma descrição específica do CC2430 no manual chinês:
O uso de watchdogs pode ser resumido como:Selecione o modo → selecione o intervalo do temporizador → coloque o cachorro → alimentar o cachorro (1) Modo seleção: O temporizador watchdog possui dois modos, a saber, "modo watchdog" e modo "timer". No modo temporizador, é equivalente a um temporizador normal, e quando o intervalo do temporizador é atingido, ele gera uma interrupção (você pode encontrá-la no arquivo ioCC2430.h com um vetor de interrupção de WDT_VECTOR); No modo watchdog, quando um intervalo programado é atingido, não há interrupção, em vez disso, um sinal de reset é enviado ao sistema. Neste experimento, passouWDCTL. MODO=0para selecionar o modo guardião. (2) Selecione o intervalo programado: Como mostrado na figura acima, há quatro períodos de relógio para escolher, e para facilitar o teste, escolhemos o intervalo de tempo de 1s (ou seja, a ordem).WDCTL.INT=00)。 (3) Libertar o cachorro: OrdemWDCTL.EN=1para iniciar o cronômetro de vigilância. (4) Alimente o cachorro: Quando o cronômetro começa, ele começa a contar a partir de 0. Antes que sua contagem atinja 32.768 (ou seja, <1s), se alimentarmos o cachorro com o seguinte código: WDCTL =0xa0; WDCTL =0x50;
Então o valor de contagem do temporizador será apagado até 0, e então ele começará a contar a partir de 0x0000 novamente, o que impede que envie um sinal de reset, que é manifestado na placa de desenvolvimento: LED1 estará sempre ligado e não piscará; Se não alimentarmos o cachorro (ou seja, comentarmos este código), quando a contagem do temporizador chegar a 32768, um sinal de reset será emitido, e o programa rodará do zero, o que se manifesta na placa de desenvolvimento: LED1 está piscando constantemente e o intervalo de piscar é 1s. (Nota: O programa de alimentação para cães deve ser estritamente consistente com o código acima, e a ordem reversa/errada/escrita menos não terá papel na eliminação do 0.) ) Dicas CC2430Duas observações adicionais: (1) EmModo cão de guardaSe o temporizador watchdog foi ativado, definir 0 para WDCTL.EN é inválido (ou seja, esse bit não pode desempenhar o papel de parar o temporizador); (2) EmModo temporizador, você pode escrever 1 em WDCTL.CLR[0] para limpar o temporizador; Escrever 0 no bit de habilitação WDCTL.EN para o temporizador, enquanto escrever 1 no bit de habilitação reinicia o timer a partir de 0x0000.
(4) Resultados experimentais:Se você adicionar a função FeedDog, rodar o código e descobrir que LED1 está sempre ligado (o sistema não reseta); Se você comentar a função FeedDog, execute o código e veja que LED1 pisca em intervalos de 1s (o sistema reinicia a cada 1s). 3. ConclusãoEsta seção descreve o princípio e o uso dos circuitos de temporização watchdog. Em aplicações práticas, se for necessária alta confiabilidade, o watchdog pode ser usado no sistema. Quando o sistema cai por algum motivo (não consegue mais alimentar o cachorro), o cachorro que ninguém alimenta vai latir: "Mestre, existe uma anomalia, existe uma anomalia! ” Para uma rede de sensores sem fio, seu consumo de energia em tempo de funcionamento é um aspecto crítico da avaliação de desempenho. Na próxima seção, discutiremos o sono do sistema CC2430 e seu despertar interrompido.
|