- Biblioteca de GPIO para a placa FRDM-KL25Z
- Bibliotecas para ADC da FRDM-KL25Z
- Biblioteca SPI para a placa FRDM-KL25Z
- Biblioteca I2C para FRDM-KL25Z
- Biblioteca PWM para FRDM-KL25Z
- PIT – Periodic Interrupt Timer para FRDM-KL25Z
- Biblioteca DAC para FRDM-KL25Z
- Biblioteca de Software de DMA para FRDM-KL25Z
- Biblioteca de Software de Watchdog Timer 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.
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.
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)”.
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:
Biblioteca Desenvolvida
Código fonte:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
/* * 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_ */ |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
/* * 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:
1 2 3 |
#ifndef DISABLE_WDOG #define DISABLE_WDOG 0 #endif |
Código Fonte da Aplicação
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
/* * 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
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!
Olá Vinicius, me desculpe pela demora em responder. Fico feliz que tem gostado dos meus artigos.
Infelizmente não sei te dizer quando vou poder escrever um artigo sobre USB. Eu sugiro que você veja o SDK que a NXP fornece para a FRDM-KL25Z https://www.nxp.com/support/developer-resources/software-development-tools/mcuxpresso-software-and-tools/mcuxpresso-software-development-kit-sdk:MCUXpresso-SDK
Também sugiro o artigo do professor Fernando Deluno Garcia :
https://www.embarcados.com.br/usb-hid-frdm-kl25z/