Interrupts and the timer

Post on 25-May-2015

605 views 3 download

description

Lab 4: Interrupts and The Timer

Transcript of Interrupts and the timer

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.