ORGANIZAÇÃO DE COMPUTADORES
Interrupts and The Timer
ORGANIZAÇÃO DE COMPUTADORES
Este capítulo irá apresentar
o uso de interrupções no
ARM ® Cortex-M4 ® e o
módulo timer. O laboratório
irá utilizar o timer para
gerar interrupções.
Introdução
ORGANIZAÇÃO DE COMPUTADORES
A API Timer fornece um conjunto de
funções de utilização do módulo timer.
As funções são fornecidas para:
• Configurar e controlar o timer;
• Modificar os valores do
temporizador / contador;
• Gerenciar a manipulação de
interrupções.
Introdução
ORGANIZAÇÃO DE COMPUTADORES
• Lida com exceções e interrupções;
• Tem 8 níveis de prioridade programáveis​​ (agrupamento
prioridade)
• 7 exceções e 65 tipos de Interrupções;
• Salva e restaura o estado automático;
• Faz a leitura automática da entrada da tabela de vetor;
• Interrupções Pre-emptive/Nested
• Tail-Chaining;
• Determinista: sempre 12 ciclos ou 6 com tail-chaining.
Cortex M4 - NVIC
ORGANIZAÇÃO DE COMPUTADORES
Interrupt Latency – Tail Chaining
ORGANIZAÇÃO DE COMPUTADORES
Interrupt Latency – Pre - Emption
ORGANIZAÇÃO DE COMPUTADORES
Interrupt Latency - Late Arrival
ORGANIZAÇÃO DE COMPUTADORES
Cortex-M4 Manipulação de Interrupção e
Vetores
Manipulação de interrupção é automático. Não há sobrecarga de instruções.
• Entrada
• Insere automaticamente na pilha os registros R0-R3, R12, LR,
PSR, e PC;
• Em paralelo, ISR são pré-buscadas no “instruction bus”. ISR
pronto para começar a execução tão logo a pilha esteja completa;
• Saída
• Estado do processador é automaticamente restaurado a partir da
pilha;
• Em paralelo, instruções de interrupções são pré-buscadas para
serem executadas após a conclusão do POP na pilha;
ORGANIZAÇÃO DE COMPUTADORES
Tipos de Exceções do Cortex-M4 ®
Tabela 1: Tabela com os tipos de exceção do cortex-M4.
ORGANIZAÇÃO DE COMPUTADORES
Cortex-M4 ® Vector Table
• Depois de reset, a tabela de vetores
está localizada na endereço 0;
• Cada entrada contém o endereço do
função a ser executada;
• O valor no endereço 0x00 é usado
como endereço inicial da Main Stack
Pointer (MSP);
• A tabela de vetores pode ser
realocada para escrita com a instrução
VTABLE register;
• Abra o startup_ccs.c para ver a tabela
de codificação dos vetores.
ORGANIZAÇÃO DE COMPUTADORES
Módulo Timer Geral
• Seis timers de uso geral de 16/32-bit e seis de 32/64-bit;
• Doze pinos para capturar, comparar e PWN de 16/32-bit e doze de
32/64-bit;
• Possui os módulos de Timer:
• One-shot
• Contínuo
• Contagem de borda de entrada ou de captura de tempo com 16
bits
• Geração de PWM
• Relógio de tempo real
• Contagem Up ou Down
• PWM simples
• Suporte para sincronização de timer, daisy-chains, e parando durante
a depuração
• Pode desencadear amostras ADC ou transferências DMA
ORGANIZAÇÃO DE COMPUTADORES
O módulo timer fornece dois
temporizadores/contadores:
• De Meia Largura:
• Podem ser configurados para operar
independentemente como timers ou
contadores de eventos;
• De Largura Total:
• Pode funcionar como um cronômetro
ou no modo Tempo real Clock (RTC).
Módulo Timer Geral
ORGANIZAÇÃO DE COMPUTADORES
Configuração para esta API
Meia Largura Largura Total
16 bits 32 bits
32 bits 64 bits
TimerA TimerB TimerA
ORGANIZAÇÃO DE COMPUTADORES
Um timer pode ser configurado para funcionar como um
Timer One-shot:
• Se configurado no modo one-shot, o cronômetro para
de contar quando ele chega a zero quando a contagem
regressiva ou o valor da carga quando a contagem para
cima.
Timer One-shot
ORGANIZAÇÃO DE COMPUTADORES
Ou pode ser configurado para funcionar como um Timer
Contínuo:
• Se configurado em contínuo modo, o temporizador
conta a zero (contagem regressiva), ou o valor da
carga, então recarrega e continua a contagem.
Timer Contínuo
ORGANIZAÇÃO DE COMPUTADORES
Objetivo
Neste laboratório vamos configurar o timer para gerar
interrupções e, em seguida, escrever o código que responde
a interrupção, piscando o LED. Também vamos experimentar
gerar uma exceção, por tentar configurar um periférico antes
de ter sido ativado.
ORGANIZAÇÃO DE COMPUTADORES
Análise do Código
ORGANIZAÇÃO DE COMPUTADORES
ORGANIZAÇÃO DE COMPUTADORES
Procedimento
1 - Importe o Projeto Lab4.
ORGANIZAÇÃO DE COMPUTADORES
Arquivos de Cabeçalho
2. Incluir os arquivos de cabeçalho necessários para acessar as APIs
StellarisWare:
# include "inc / hw_ints.h"
# include "inc / hw_memmap.h"
# include "inc / hw_types.h"
# include "driverlib / sysctl.h"
# include "driverlib / interrupt.h"
# include "driverlib / gpio.h"
# include "driverlib / timer.h“
ORGANIZAÇÃO DE COMPUTADORES
Arquivos de Cabeçalho
• hw_ints.h: Macros que definem a atribuição de interrupção em
dispositivos Stellaris (NVIC);
• hw_memmap.h: Macros que definem o mapa de memória do dispositivo
Stellaris. Isto inclui definir as regiões periféricas da base de endereços,
por exemplo, GPIO_PORTF_BASE;
• hw_types.h: Define os tipos comuns e as macros, como tBoolean e
HWREG;
• sysctl.h: Definição e macros para o Sistema de Controle de API do
driverLib. Isto inclui as funções da API, como SysCtlClockSet e
SysCtlClockGet;
• interrupt.h: Definição e macros para NVIC Controller (Interrupção) API do
DriverLib. Isso inclui as funções da API, como IntEnable e IntPrioritySet.
• gpio.h: Definição e macros para GPIO API do driverLib. Isso inclui as
funções da API tais como GPIOPinTypePWM e GPIOPinWrite;
• timer.h: Definição e macros para API do timer de driverLib. Isso inclui as
funções da API tais como TimerConfigure e TimerLoadSet.
ORGANIZAÇÃO DE COMPUTADORES
Função main ()
3. Calcular o “timer delays” utilizando a variável Period.
int main (void)
{
unsigned long ulPeriod;
}
ORGANIZAÇÃO DE COMPUTADORES
Configuração do Relógio
4. Configure o relógio do sistema para ser executado em 40MHz com a seguinte
chamada:
SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16M
HZ | SYSCTL_OSC_MAIN);
GPIO Configuração
5. Ative o periférico GPIO e defina os pinos conectados para os LEDs como
saídas.
SysCtlPeripheralEnable (SYSCTL_PERIPH_GPIOF);
GPIOPinTypeGPIOOutput (GPIO_PORTF_BASE, GPIO_PIN_1 | GPIO_PIN_2
|GPIO_PIN_3);
ORGANIZAÇÃO DE COMPUTADORES
Configuração do Timer
6. Antes de chamar qualquer função específica do periférico driverLib é
necessário ativar o clock. Se isso não for feito irá resultar em uma ISR
Fault (falha de endereço). Adicione as seguintes linhas ao código:
• A segunda declaração configura o timer 0 como um timer de 32 bits.
SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
TimerConfigure (TIMER0_BASE, TIMER_CFG_32_BIT_PER);
ORGANIZAÇÃO DE COMPUTADORES
Cálculo do Delay
7. Para alternar um GPIO em 10Hz e um ciclo de trabalho de 50%, é
preciso gerar uma interrupção em ½ do período desejado. Em primeiro
lugar, calcular o número de ciclos de relógio necessários para um período
de 10Hz, chamando SysCtlClockGet () e dividindo-o por sua frequência
desejada, em seguida divida por dois, já que queremos uma contagem
que é ½ para a interrupção. Adicione as seguintes linhas ao código:
ulPeriod = (SysCtlClockGet () / 10) / 2;
TimerLoadSet (TIMER0_BASE, TIMER_A, ulPeriod -1);
ORGANIZAÇÃO DE COMPUTADORES
Ativar a Interrupção
8. Ative a interrupção não só no módulo Timer, mas também
no NVIC (The Nested Vector Interrupt Controller, controlador
de interrupção do Cortex M4).
IntEnable (INT_TIMER0A);
TimerIntEnable (TIMER0_BASE, TIMER_TIMA_TIMEOUT);
IntMasterEnable ();
ORGANIZAÇÃO DE COMPUTADORES
Ativar Timer
9. Ative o timer. Isto irá iniciar o timer e as interrupções começará acionando os
tempos de espera. Digite a seguinte linha de código após as anteriores:
TimerEnable (TIMER0_BASE, TIMER_A);
Loop Principal
10. O loop principal do código é simplesmente um tempo vazio (1) uma vez que a
alternância do GPIO vai acontecer na rotina de interrupção. Adicione as seguintes
linhas de código após as anteriores:
while (1)
{
}
ORGANIZAÇÃO DE COMPUTADORES
Timer de Interrupção Handler
11. Adicione um manipulador de interrupção no timer. Antes é necessário limpar a fonte de
manipulação. Adicione as seguintes linhas de código após o encerramento definitivo da
função main():
main (...)
Timer0IntHandler vazio (void)
{
/ / Limpar a interrupção do timer
TimerIntClear (TIMER0_BASE, TIMER_TIMA_TIMEOUT);
/ / Ler o estado atual do pino GPIO e
/ / Escrever de volta o estado oposto
if (GPIOPinRead (GPIO_PORTF_BASE, GPIO_PIN_2))
{
GPIOPinWrite (GPIO_PORTF_BASE, GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3, 0);
}
outro
{
GPIOPinWrite (GPIO_PORTF_BASE, GPIO_PIN_2, 4);
}
}
ORGANIZAÇÃO DE COMPUTADORES
12. Salve o código.
ORGANIZAÇÃO DE COMPUTADORES
Código Startup
13. Abra o arquivo startup_ccs.c. Este arquivo contém a tabela de vetores
discutidos durante a apresentação. Observe a linha comentada com “Timer 0
subtimer A”.
• Quando a interrupção ocorre o NVIC irá procurar o endereço da ISR neste local.
É neste local que o próximo código será executado.
• Você precisa encontrar cuidadosamente a posição apropriada do vetor e
substituir IntDefaultHandler com o nome de seu manipulador de interrupção
ORGANIZAÇÃO DE COMPUTADORES
Você também vai precisar para declarar esta função no topo deste
arquivo como externo. Isto é necessário para o compilador resolver o
símbolo. Encontre a linha que contém:
extern _c_int00 vazio (void);
e adicione:
extern Timer0IntHandler vazio (void);
logo abaixo dela, como mostrado abaixo:
Clique no botão salvar e execute o código.
ORGANIZAÇÃO DE COMPUTADORES
Exceções
15. Encontre a linha de código que ativa o periférico do GPIO
e comente, como mostrado na figura abaixo::
Agora o código vai acessar o periférico sem ativar o relógio.

Interrupts and the timer

  • 1.
  • 2.
    ORGANIZAÇÃO DE COMPUTADORES Estecapítulo irá apresentar o uso de interrupções no ARM ® Cortex-M4 ® e o módulo timer. O laboratório irá utilizar o timer para gerar interrupções. Introdução
  • 3.
    ORGANIZAÇÃO DE COMPUTADORES AAPI Timer fornece um conjunto de funções de utilização do módulo timer. As funções são fornecidas para: • Configurar e controlar o timer; • Modificar os valores do temporizador / contador; • Gerenciar a manipulação de interrupções. Introdução
  • 4.
    ORGANIZAÇÃO DE COMPUTADORES •Lida com exceções e interrupções; • Tem 8 níveis de prioridade programáveis​​ (agrupamento prioridade) • 7 exceções e 65 tipos de Interrupções; • Salva e restaura o estado automático; • Faz a leitura automática da entrada da tabela de vetor; • Interrupções Pre-emptive/Nested • Tail-Chaining; • Determinista: sempre 12 ciclos ou 6 com tail-chaining. Cortex M4 - NVIC
  • 5.
    ORGANIZAÇÃO DE COMPUTADORES InterruptLatency – Tail Chaining
  • 6.
    ORGANIZAÇÃO DE COMPUTADORES InterruptLatency – Pre - Emption
  • 7.
  • 8.
    ORGANIZAÇÃO DE COMPUTADORES Cortex-M4Manipulação de Interrupção e Vetores Manipulação de interrupção é automático. Não há sobrecarga de instruções. • Entrada • Insere automaticamente na pilha os registros R0-R3, R12, LR, PSR, e PC; • Em paralelo, ISR são pré-buscadas no “instruction bus”. ISR pronto para começar a execução tão logo a pilha esteja completa; • Saída • Estado do processador é automaticamente restaurado a partir da pilha; • Em paralelo, instruções de interrupções são pré-buscadas para serem executadas após a conclusão do POP na pilha;
  • 9.
    ORGANIZAÇÃO DE COMPUTADORES Tiposde Exceções do Cortex-M4 ® Tabela 1: Tabela com os tipos de exceção do cortex-M4.
  • 10.
    ORGANIZAÇÃO DE COMPUTADORES Cortex-M4® Vector Table • Depois de reset, a tabela de vetores está localizada na endereço 0; • Cada entrada contém o endereço do função a ser executada; • O valor no endereço 0x00 é usado como endereço inicial da Main Stack Pointer (MSP); • A tabela de vetores pode ser realocada para escrita com a instrução VTABLE register; • Abra o startup_ccs.c para ver a tabela de codificação dos vetores.
  • 11.
    ORGANIZAÇÃO DE COMPUTADORES MóduloTimer Geral • Seis timers de uso geral de 16/32-bit e seis de 32/64-bit; • Doze pinos para capturar, comparar e PWN de 16/32-bit e doze de 32/64-bit; • Possui os módulos de Timer: • One-shot • Contínuo • Contagem de borda de entrada ou de captura de tempo com 16 bits • Geração de PWM • Relógio de tempo real • Contagem Up ou Down • PWM simples • Suporte para sincronização de timer, daisy-chains, e parando durante a depuração • Pode desencadear amostras ADC ou transferências DMA
  • 12.
    ORGANIZAÇÃO DE COMPUTADORES Omódulo timer fornece dois temporizadores/contadores: • De Meia Largura: • Podem ser configurados para operar independentemente como timers ou contadores de eventos; • De Largura Total: • Pode funcionar como um cronômetro ou no modo Tempo real Clock (RTC). Módulo Timer Geral
  • 13.
    ORGANIZAÇÃO DE COMPUTADORES Configuraçãopara esta API Meia Largura Largura Total 16 bits 32 bits 32 bits 64 bits TimerA TimerB TimerA
  • 14.
    ORGANIZAÇÃO DE COMPUTADORES Umtimer pode ser configurado para funcionar como um Timer One-shot: • Se configurado no modo one-shot, o cronômetro para de contar quando ele chega a zero quando a contagem regressiva ou o valor da carga quando a contagem para cima. Timer One-shot
  • 15.
    ORGANIZAÇÃO DE COMPUTADORES Oupode ser configurado para funcionar como um Timer Contínuo: • Se configurado em contínuo modo, o temporizador conta a zero (contagem regressiva), ou o valor da carga, então recarrega e continua a contagem. Timer Contínuo
  • 16.
    ORGANIZAÇÃO DE COMPUTADORES Objetivo Nestelaboratório vamos configurar o timer para gerar interrupções e, em seguida, escrever o código que responde a interrupção, piscando o LED. Também vamos experimentar gerar uma exceção, por tentar configurar um periférico antes de ter sido ativado.
  • 17.
  • 18.
  • 19.
  • 20.
    ORGANIZAÇÃO DE COMPUTADORES Arquivosde Cabeçalho 2. Incluir os arquivos de cabeçalho necessários para acessar as APIs StellarisWare: # include "inc / hw_ints.h" # include "inc / hw_memmap.h" # include "inc / hw_types.h" # include "driverlib / sysctl.h" # include "driverlib / interrupt.h" # include "driverlib / gpio.h" # include "driverlib / timer.h“
  • 21.
    ORGANIZAÇÃO DE COMPUTADORES Arquivosde Cabeçalho • hw_ints.h: Macros que definem a atribuição de interrupção em dispositivos Stellaris (NVIC); • hw_memmap.h: Macros que definem o mapa de memória do dispositivo Stellaris. Isto inclui definir as regiões periféricas da base de endereços, por exemplo, GPIO_PORTF_BASE; • hw_types.h: Define os tipos comuns e as macros, como tBoolean e HWREG; • sysctl.h: Definição e macros para o Sistema de Controle de API do driverLib. Isto inclui as funções da API, como SysCtlClockSet e SysCtlClockGet; • interrupt.h: Definição e macros para NVIC Controller (Interrupção) API do DriverLib. Isso inclui as funções da API, como IntEnable e IntPrioritySet. • gpio.h: Definição e macros para GPIO API do driverLib. Isso inclui as funções da API tais como GPIOPinTypePWM e GPIOPinWrite; • timer.h: Definição e macros para API do timer de driverLib. Isso inclui as funções da API tais como TimerConfigure e TimerLoadSet.
  • 22.
    ORGANIZAÇÃO DE COMPUTADORES Funçãomain () 3. Calcular o “timer delays” utilizando a variável Period. int main (void) { unsigned long ulPeriod; }
  • 23.
    ORGANIZAÇÃO DE COMPUTADORES Configuraçãodo Relógio 4. Configure o relógio do sistema para ser executado em 40MHz com a seguinte chamada: SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16M HZ | SYSCTL_OSC_MAIN); GPIO Configuração 5. Ative o periférico GPIO e defina os pinos conectados para os LEDs como saídas. SysCtlPeripheralEnable (SYSCTL_PERIPH_GPIOF); GPIOPinTypeGPIOOutput (GPIO_PORTF_BASE, GPIO_PIN_1 | GPIO_PIN_2 |GPIO_PIN_3);
  • 24.
    ORGANIZAÇÃO DE COMPUTADORES Configuraçãodo Timer 6. Antes de chamar qualquer função específica do periférico driverLib é necessário ativar o clock. Se isso não for feito irá resultar em uma ISR Fault (falha de endereço). Adicione as seguintes linhas ao código: • A segunda declaração configura o timer 0 como um timer de 32 bits. SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0); TimerConfigure (TIMER0_BASE, TIMER_CFG_32_BIT_PER);
  • 25.
    ORGANIZAÇÃO DE COMPUTADORES Cálculodo Delay 7. Para alternar um GPIO em 10Hz e um ciclo de trabalho de 50%, é preciso gerar uma interrupção em ½ do período desejado. Em primeiro lugar, calcular o número de ciclos de relógio necessários para um período de 10Hz, chamando SysCtlClockGet () e dividindo-o por sua frequência desejada, em seguida divida por dois, já que queremos uma contagem que é ½ para a interrupção. Adicione as seguintes linhas ao código: ulPeriod = (SysCtlClockGet () / 10) / 2; TimerLoadSet (TIMER0_BASE, TIMER_A, ulPeriod -1);
  • 26.
    ORGANIZAÇÃO DE COMPUTADORES Ativara Interrupção 8. Ative a interrupção não só no módulo Timer, mas também no NVIC (The Nested Vector Interrupt Controller, controlador de interrupção do Cortex M4). IntEnable (INT_TIMER0A); TimerIntEnable (TIMER0_BASE, TIMER_TIMA_TIMEOUT); IntMasterEnable ();
  • 27.
    ORGANIZAÇÃO DE COMPUTADORES AtivarTimer 9. Ative o timer. Isto irá iniciar o timer e as interrupções começará acionando os tempos de espera. Digite a seguinte linha de código após as anteriores: TimerEnable (TIMER0_BASE, TIMER_A); Loop Principal 10. O loop principal do código é simplesmente um tempo vazio (1) uma vez que a alternância do GPIO vai acontecer na rotina de interrupção. Adicione as seguintes linhas de código após as anteriores: while (1) { }
  • 28.
    ORGANIZAÇÃO DE COMPUTADORES Timerde Interrupção Handler 11. Adicione um manipulador de interrupção no timer. Antes é necessário limpar a fonte de manipulação. Adicione as seguintes linhas de código após o encerramento definitivo da função main(): main (...) Timer0IntHandler vazio (void) { / / Limpar a interrupção do timer TimerIntClear (TIMER0_BASE, TIMER_TIMA_TIMEOUT); / / Ler o estado atual do pino GPIO e / / Escrever de volta o estado oposto if (GPIOPinRead (GPIO_PORTF_BASE, GPIO_PIN_2)) { GPIOPinWrite (GPIO_PORTF_BASE, GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3, 0); } outro { GPIOPinWrite (GPIO_PORTF_BASE, GPIO_PIN_2, 4); } }
  • 29.
  • 30.
    ORGANIZAÇÃO DE COMPUTADORES CódigoStartup 13. Abra o arquivo startup_ccs.c. Este arquivo contém a tabela de vetores discutidos durante a apresentação. Observe a linha comentada com “Timer 0 subtimer A”. • Quando a interrupção ocorre o NVIC irá procurar o endereço da ISR neste local. É neste local que o próximo código será executado. • Você precisa encontrar cuidadosamente a posição apropriada do vetor e substituir IntDefaultHandler com o nome de seu manipulador de interrupção
  • 31.
    ORGANIZAÇÃO DE COMPUTADORES Vocêtambém vai precisar para declarar esta função no topo deste arquivo como externo. Isto é necessário para o compilador resolver o símbolo. Encontre a linha que contém: extern _c_int00 vazio (void); e adicione: extern Timer0IntHandler vazio (void); logo abaixo dela, como mostrado abaixo: Clique no botão salvar e execute o código.
  • 32.
    ORGANIZAÇÃO DE COMPUTADORES Exceções 15.Encontre a linha de código que ativa o periférico do GPIO e comente, como mostrado na figura abaixo:: Agora o código vai acessar o periférico sem ativar o relógio.