Sistemas Embebidos I Licenciatura em Eng. de Electrónica e Telecomunicações e de Computadores Licenciatura em Engenharia Informática e de Computadores Mestrado em Engenharia de Electrónica e Telecomunicações
1. Conceito e utilizações mais comuns To be completed 2
3
Características principais Disponibiliza a funcionalidade de relógio Informação de hora, minutos e segundos Disponibiliza a funcionalidade de calendário Informação de ano, mês, dia do mês, dia da semana e dia do ano Possibilidade de definição de alarmes para todos os campos Possibilidade de sinalização de eventos ao processador recorrendo a interrupção Funcionamento baseado em sinal de relógio com frequência de 32,768 khz Utiliza PCLK como sinal de relógio de referência Definição da frequência do sinal de relógio interno recorrendo a um prescaler fracionário Pode usar sinais de relógio com frequências no intervalo 65,536kHz PCLK 160 MHz Não permite funcionamento autónomo Perda total de informação no corte de energia Erros na medição do tempo aquando da alteração do sinal PCLK 4
Diagrama de blocos 5
Frequência do sinal de relógio interno A contagem de tempo realizada pelo RTC é baseado num sinal de relógio de frequência 1Hz, obtido a partir de um sinal de relógio de referência com frequência 32,768Khz. Este sinal de referência é gerado pelo módulo prescaler a partir do sinal PCLK, o que permite o correto funcionamento do RTC independentemente da frequência escolhida para CCLK. O prescaler implementa um processo de divisão fracionário, em que as partes inteira (PREINT) e fracionária (PREFRAC) do divisor são definidas como: PREINT = (PCLK / 32768) - 1; PREFRAC = PCLK ( (PREINT + 1) 32768 ). 6
Interface de programação/utilização 7
Interface de programação/utilização :: Grupo de Registos Genéricos Interrupt Location Register (ILR) Permite definir os módulos que geram notificações por interrupção ao processador. É acedido a partir do endereço 0xE0024000 para leitura e escrita de valores. Após o reset do microcontrolador, mantém os valores anteriormente definidos.. 8
Interface de programação/utilização :: Grupo de Registos Genéricos Clock Tick Counter Register (CTCR) Disponibiliza o valor do contador divisor do sinal de relógio, cuja saída serve de base à atualização do valor dos segundos do relógio implementado pelo RTC. É acedido a partir do endereço 0xE0024004 apenas para consulta do seu valor. Pode ser reiniciado com o valor 0x0 por alteração do estado do registo CCR. Após o reset do microcontrolador, mantém os valores anteriormente definidos.. 9
Interface de programação/utilização :: Grupo de Registos Genéricos Clock Control Register (CCR) Permite controlar a operação do divisor do sinal de relógio e, consequentemente, do RTC. É acedido a partir do endereço 0xE0024008 para leitura e escrita de valores. Após o reset do microcontrolador, mantém os valores anteriormente definidos.. Nota: O campo Test deve tomar o valor 0x0 para que o RTC funcione no modo Normal. 10
Interface de programação/utilização :: Grupo de Registos Genéricos Counter Increment Interrupt Register (CIIR) Permite habilitar/inibir os pedidos de interrupção ao processador, aquando da atualização de um dos contadores do RTC. Os pedidos de interrupção mantêm-se ativos até a sua deteção ser sinalizada, o que corresponde a escrever o valor lógico 1 no bit associado ao módulo correspondente do registo ILR. É acedido a partir do endereço 0xE002400C para leitura e escrita de valores. Após o reset do microcontrolador, mantém os valores anteriormente definidos. 11
Interface de programação/utilização :: Grupo de Registos Genéricos Alarm Mask register (AMR) Permite habilitar/inibir os pedidos de interrupção ao processador associados a alarmes. Os pedidos de interrupção são gerados aquando da ativação do alarme e desde que estejam habilitados, i.e. o valor lógico do bit correspondente ao alarme seja 0. Os pedidos de interrupção mantêm-se ativos até a sua deteção ser sinalizada, o que corresponde a escrever o valor lógico 1 no bit associado ao módulo correspondente do registo ILR. É acedido a partir do endereço 0xE0024010 para leitura e escrita de valores. Após o reset do microcontrolador, mantém os valores anteriormente definidos. 12
Interface de programação/utilização :: Grupo de Registos Genéricos Consolidated Time Registers (CTIMEx) Possibilitam a leitura de todos os registos com a informação horária e de calendário de forma compactada e recorrendo apenas a 3 operações de acesso à memória. Vantajosos para a obtenção dos dados de forma consistente. São acedidos na gama de endereços 0xE0024014-0xE002401C e apenas para leitura de valores. Após o reset do microcontrolador, mantém os valores anteriormente definidos. 13
Interface de programação/utilização :: Grupo de Registos de Contagem de Tempo SEC, MIN, HOUR, DOM, DOW, DOY, MONTH e YEAR Estes registos disponibilizam a informação horária e de calendário de forma isolada. São acedidos na gama de endereços 0xE0024020-0xE002403C para leitura e escrita de valores. Após o reset do microcontrolador, mantém os valores anteriormente definidos. 14
Interface de programação/utilização :: Grupo de Registos de Alarme ALSEC, ALMIN, ALHOUR, ALDOM, ALDOW, ALDOY, ALMONTH e ALYEAR Estes registos definem o valor a informação horária e de calendário de forma isolada. São acedidos na gama de endereços 0xE0024060-0xE002407C para leitura e escrita de valores. Após o reset do microcontrolador, mantém os valores anteriormente definidos. 15
Interface de programação/utilização :: Divisão do Sinal de Relógio Prescaler Integer Register (PREINT) Permite definir a parte inteira do divisor utilizado pelo prescaler para gerar o sinal de relógio interno do RTC. É acedido a partir do endereço 0xE0024080 para leitura e escrita de valores. Após o reset do microcontrolador, apresenta o valor 0x0. 16
Interface de programação/utilização :: Divisão do Sinal de Relógio Prescaler Fraction Register (PREFRAC) Permite definir a parte fracionária do divisor utilizado pelo prescaler para gerar o sinal de relógio interno do RTC. É acedido a partir do endereço 0xE0024084 para leitura e escrita de valores. Após o reset do microcontrolador, apresenta o valor 0x0. 17
Implementação de um gestor de periférico Modelo da interface do módulo RTC typedef struct { /* Miscellaneous Register Group */ LPC210X_REG ILR, CTC, CCR, CIIR, AMR; LPC210X_REG CTIME0, CTIME1, CTIME2; /* Time Counter Group */ LPC210X_REG SEC, MIN, HOUR; LPC210X_REG DOM, DOW, DOY, MONTH, YEAR; LPC210X_REG RESERVED[8]; /* Dummy */ /* Alarm Register Group */ LPC210X_REG ALSEC, ALMIN, ALHOUR, ALDOM, ALDOW, ALDOY, ALMON, ALYEAR; /* Reference Clock Divider */ LPC210X_REG PREINT, PREFRAC; } LPC210X_TC; #ifndef _LPC210X_H_ #define _LPC210X_H_ /*********************************************\ HARDWARE REGISTER DEFINITIONS \*********************************************/ typedef volatile unsigned int LPC210X_REG;... #endif /* _LPC210X_H_ */ 18
Implementação de um gestor de periférico Modelo da interface do módulo RTC #ifndef _LPC2106_H_ #define _LPC2106_H_ #include "lpc210x.h" /****************************************************************************\ CLOCK DEFINITIONS FOR LPC2106 \****************************************************************************/ #define LPC2106_MAIN_OSC 14745600 // Main Oscillator #define LPC2106_CCLK LPC2106_MAIN_OSC // Output PLL Clock #define LPC2106_PCLK LPC2106_CCLK/4 // Peripheral Clock /****************************************************************************\ BASE ADDRESS DEFINITIONS FOR LPC2106 \****************************************************************************/ #define LPC2106_BASE_TC0 ( *( (LPC210X_TC *) 0xE0004000) ) #define LPC2106_BASE_TC1 ( *( (LPC210X_TC *) 0xE0008000) ) #define LPC2106_BASE_RTC ( *( (LPC210X_RTC *) 0xE0024000) ) #define LPC2106_BASE_GPIO0 ( *( (LPC210X_GPIO *) 0xE0028000) ) #define LPC2106_BASE_PCB ( *( (LPC210X_PCB *) 0xE002C000) ) #endif /* _LPC2106_H_ */ 19
Implementação de um gestor de periférico API para utilização do módulo RTC #ifndef _RTC_H_ #define _RTC_H_ #include lpc210x.h #include lpc2106.h #include <time.h> /* Faz a iniciação do sistema para permitir o acesso ao periférico RTC, que é iniciado com os valores do parâmetro datetime. Nota: A struct tm está definida na biblioteca standard da linguagem C. */ void RTC_Init(struct tm *datetime); /* Devolve em datetime o valor corrente do RTC preenche a estrutura. */ void RTC_GetValue(struct tm *datetime); /* Atualiza os registos do RTC com os valores do parâmetro datetime. */ void RTC_SetValue(struct tm *datetime); #endif /* _RTC_H_ */ 20
Exemplo de utilização? #include rtc.h #include <time.h> void main() {? } /* main */ 21