Biblioteca de Software de Watchdog Timer para FRDM-KL25Z

Biblioteca de GPIO
Este post faz parte da série Bibliotecas de Software para FRDM-KL25Z

Olá caro leitor, tudo bem? Continuando com a série de artigos “Biblioteca de Software para a FRDM-KL25Z”, neste artigo trataremos sobre o Watchdog Timer. Será apresentado o conceito básico sobre Watchdog, usando o princípio de funcionamento do periférico na Freedom Board KL25Z. Por fim, oferecemos a biblioteca desenvolvida e uma aplicação para a demonstração.

Introdução Watchdog Timer

Watchdog vem do inglês “cão de guarda”, sendo uma ferramenta que tem como objetivo o monitoramento do sistema. É uma ferramenta tanto de software como de hardware. O objetivo principal é monitorar o funcionamento do sistema. Esse monitoramento é feito por meio de um “Timer”, que precisa ser reiniciado periodicamente. Caso esse temporizador não seja reiniciado, o Watchdog “Reseta” o sistema.

Para implementar um bom algoritmo de Watchdog Timer, sugiro o artigo do “Felipe Lavrati” “Servindo Watchdog adequadamente”, onde ele apresenta a maneira correta de se desenvolver um bom Watchdog e também disponibiliza o código fonte de sua biblioteca.

Computer Operating Properly (COP) Watchdog

O COP é o periférico de Watchdog Timer que esta presente no microcontrolador do Freedom Board KL25Z. O COP funciona conforme qualquer outro Watchdog, uma vez ativado, o seu temporizador precisa ser reiniciado. Se a aplicação falhar em redefinir o “Timer” do COP, o mesmo força o microcontrolador reiniciar.

Toda vez que o microcontrolador é reiniciado, o valor do registrador “System Reset Status Register 0 (RCM_SRS0)” é alterado. Com isso é possível verificar se quem provocou o Reset foi o Watchdog. Na figura a seguir são apresentados os detalhes do registrador.

Detalhes do registrador System Reset Status Register 0 (RCM_SRS0)
Figura 1 – Detalhes do registrador System Reset Status Register 0 (RCM_SRS0)
Descrição do bit WDOG
Figura 2 – Descrição do bit WDOG

Para redefinir a contagem do temporizador do COP, e evitar que o microcontrolador seja reiniciado, é necessário escrever os valores 0x55 (85) e 0xAA (170) (nesta sequência) no registrador “Service COP Register (SIM_SRVCOP)”. A seguir é apresentada imagem detalhada do registrador.

Descrição do registrador Service COP Register (SIM_SRVCOP)
Figura 3 – Descrição do registrador Service COP Register (SIM_SRVCOP)

Configurando o COP Watchdog

Para ativar e configurar os parâmetros do “Computer Operating Properly”, é utilizado o registrador “COP Control Register (SIM_COPC)”. Esse registrador possui os seguintes parâmetros para configurações:

  • COPT – COP Watchdog Timeout: Define o valor de temporizador;
  • COPCLKS – COP Clock Select: Seleciona a fonte de “Clock” do periférico;
  • COPW – COP Windowed Mode: Define o modo de operação do periférico.

A seguir temos uma imagem que detalha os parâmetros do registrador “COP Control Register (SIM_COPC)”.

Detalhes do registrado “COP Control Register (SIM_COPC)”
Figura 4 – Detalhes do registrado “COP Control Register (SIM_COPC)”
Descrição dos parâmetros do registrador “COP Control Register (SIM_COPC)”
Figura 5 – Descrição dos parâmetros do registrador “COP Control Register (SIM_COPC)”

O periférico COP Watchdog permite diferentes possibilidades de configurações, para atender requisitos de diversos tipos de aplicações. A figura a seguir traz todas as configurações disponíveis no microcontrolador:

Tabela com as opções de configurações do COP
Figura 6 – Tabela com as opções de configurações do COP

Biblioteca Desenvolvida

Código fonte:

/*
 * wdog.h
 *
 *  Created on: set 30, 2018
 *      Author: Evandro Teixeira
 */

#ifndef WDOG_H_
#define WDOG_H_

#include "../LibKL25Z/externs.h"

// COP Watchdog Timeout
// These write-once bits select the timeout period of the COP.
// The COPT field along with the COPCLKS bit define the COP timeout period.
#define COP_DISABLED	0 	//00 COP disabled
#define COP_CYCLES_01	1 	//01 COP timeout after 2^5 LPO cycles or 2^13 bus clock cycles
#define COP_CYCLES_02	2 	//10 COP timeout after 2^8 LPO cycles or 2^16 bus clock cycles
#define COP_CYCLES_03	3	//11 COP timeout after 2^10 LPO cycles or 2^18 bus clock cycles

//COP Clock Select
//This write-once bit selects the clock source of the COP watchdog.
#define INTERNAL_1KHz	0	//00 Internal 1 kHz clock is source to COP
#define BUS_CLOCK		1	//01 Bus clock is source to COP

// Windowed mode is only supported when COP is running from the bus clock.
// The COP window is opened three quarters through the timeout period.
#define NORMAL_MODE	    0	//00 Normal mode
#define WINDOWED_MODE	1 	//01 Windowed mode

typedef struct
{
	uint8_t timeout;
	uint8_t clock_select;
	uint8_t windowsed_mode;
}COPC_config_t;

void wdog_Init(COPC_config_t *config);
void wdog_Denit(void);
void wdog_refresh(void);

#endif /* WDOG_H_ */
/*
 * wdog.h
 *
 *  Created on: set 30, 2018
 *      Author: Evandro Teixeira
 */
#include "wdog.h"

/**
 * @brief
 * @param *config
 */
void wdog_Init(COPC_config_t *config)
{

	SIM->COPC = (SIM_COPC_COPW(config->windowsed_mode))  | 	// COP windowed mode
			    (SIM_COPC_COPCLKS(config->clock_select)) | 	// COP Clock Select
			    (SIM_COPC_COPT(config->timeout));			// COP Watchdog Timeout

}

/**
 * @brief
 */
void wdog_Denit(void)
{
	SIM->COPC = SIM_COPC_COPW(COP_DISABLED);
}

/**
 * @brief
 */
void wdog_refresh(void)
{
	SIM_SRVCOP = 0x55;
	SIM_SRVCOP = 0xAA;
}

Aplicação de Demonstração 

A aplicação de teste criada para utilizar a biblioteca desenvolvida é bem simples, consistindo em: algoritmo para piscar o LED vermelho, ativar o COP Watchdog e no “Loop Infinito” ficar incrementando um contador. Caso o valor da diretiva de compilação REFRESH_WHATDOG esteja com valor verdadeiro (REFRESH_WHATDOG > 0). O temporizador do Watchdog é reiniciado, assim evitando que o microcontrolador seja “Resetado”. Caso o valor da diretiva de compilação (REFRESH_WHATDOG = 0) seja falso, o microcontrolador será reiniciado periodicamente.

Nota: Para o funcionamento do Watchdog é necessário alterar o valor da macro “DISABLE_WDOG para zero, que se encontra no arquivo “system_MKL25Z4.h“, pois o registrador COP Control Register (SIM_COPC) só pode ser escrito uma única vez. Conforme é mostrado na figura a seguir:

#ifndef DISABLE_WDOG
  #define DISABLE_WDOG                 0
#endif
Todos os bits neste registro podem ser gravados apenas uma vez após um reset.
Figura 7 – Todos os bits neste registro podem ser gravados apenas uma vez após um reset.

Código Fonte da Aplicação 

/*
 * Aplicação main
 */
#include "MKL25Z4.h"
#include "../LibKL25Z/externs.h"

#define REFRESH_WHATDOG		0
#define LED1 GPIOB,18

uint8_t counter = 0;
uint32_t i = 0;

int main(void)
{
	COPC_config_t config;

	SystemInit();
	SystemCoreClockUpdate();

	gpio_Init(LED1,OUTPUT,0);

	for(counter=0;counter<9;counter++)
	{
		gpio_Toggle(LED1);
		for(i=0;i<100000;i++);
	}

	config.clock_select = INTERNAL_1KHz ;
	config.timeout = COP_CYCLES_03;
	config.windowsed_mode = NORMAL_MODE;
	wdog_Init(&config);

	while(1)
	{
#if REFRESH_WHATDOG
		wdog_refresh();
#endif
		counter++;
		if(counter > 100) counter = 0;
	}
	return 0;
}

Conclusão 

Neste artigo apresentei mais um item da biblioteca de software para a Freedom Board KL25Z, utilizando o periférico Watchdog. O código fonte apresentado neste artigo esta disponível no Github. O Watchdog quando bem empregado, é uma ferramenta essencial para obter um sistema estável, protegendo que a aplicação fique presa em um estado indeterminado. E fica aqui o meu convite a você caro leitor, que se interessou pelo assunto, a contribuir com o projeto, testando e aperfeiçoando a biblioteca de software apresentada.

Saiba mais

Introdução aos sistemas embarcados e microcontroladores

Servindo Watchdog adequadamente

Referências

Watchdog timer for KL26

Reference Manual

Library-FRDM-KL25Z

Robolivre

Bibliotecas de Software para FRDM-KL25Z

Biblioteca de Software de DMA para FRDM-KL25Z
Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.
Comentários:
Notificações
Notificar
2 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Vinicius Kawakami
Vinicius Kawakami
25/10/2018 12:20

Olá Evandro, acompanho os seus artigos sobre a FDRM-KL25Z e são sempre muito bem explicados. Obrigado por compartilhar seus conhecimentos!
Você tem intensão de criar alguma biblioteca para comunicação USB, principalmente para modo Host_CDC? Estou com dificuldade de implementar comunicação USB entre duas FRDM!

Home » Software » Biblioteca de Software de Watchdog Timer para FRDM-KL25Z

EM DESTAQUE

WEBINARS

VEJA TAMBÉM

JUNTE-SE HOJE À COMUNIDADE EMBARCADOS

Talvez você goste: