Beruflich Dokumente
Kultur Dokumente
[Digite texto]
Na vida de um homem existem nveis na busca dos estudos. No mais baixo, ele estuda, mas no
acontece, e o homem sente que tanto ele quanto os outros so incapazes. Nesse momento, ele
intil. No nvel intermedirio, ele ainda no possui utilidade, mas est consciente de suas
limitaes e tambm pode ver as limitaes dos outros. Num nvel mais elevado, ele tem
orgulho de suas habilidades, se regozija com os elogios das pessoas e lamenta a falta de
habilidade dos companheiros. Esse homem tem valor. No nvel mais alto, um homem aparenta
no conhecer nada.
Esses so os nveis em termos gerais. Mas existe um nvel transcendental, e este o mais
excepcional de todos. Quem atinge este nvel est ciente do infindvel quando se adentra
profundamente por um certo Caminho e nunca imagina a si mesmo no fim da jornada. Ele
realmente conhece suas falhas e nunca em toda sua vida chega a pensar que bem-sucedido.
Ele no orgulhoso, mas, com humildade conhece o caminho para o fim. Dizem que o mestre
Yagyu uma vez comentou: Eu no conheo o caminho para derrotar os outros, apenas o
caminho da minha prpria derrota.
Por toda sua vida avance diariamente, tornando-se mais capacitado a cada dia que passa. Isso
no tem fim.
Caso tenha algo a contribuir com essa apostila, por favor, entrar em contato:
Linkedin: br.linkedin.com/in/stefanoandrade/pt
Email: stefano.andrade@engenharia.ufjf.br
[Digite texto]
Sumrio
1.
Introduo ............................................................................................................................. 4
2.
2.2
2.2.1
2.2.2
2.2.3
O TIMER ............................................................................................................... 10
2.2.4
A Memria ........................................................................................................... 10
3.
4.
5.
A TivaWare .......................................................................................................................... 19
5.1
5.2
5.3
5.4
Configurando o GPIO................................................................................................... 36
5.5
5.6
5.7
6.
Concluso ............................................................................................................................ 43
7.
ANEXOS ............................................................................................................................... 44
8.
7.1
7.2
7.3
7.4
7.5
7.5.1
7.5.2
Funes da UART................................................................................................. 57
7.5.3
7.5.4
Referncias .......................................................................................................................... 60
[Digite texto]
1. Introduo
Com o crescimento cada vez maior da demanda de equipamentos eletrnicos no
mercado, ao passar dos anos pode ser visto um enorme avano da eletrnica em termos
de reduo de custo, miniaturizao dos componentes, melhoria da eficincia no consumo
de energia e, principalmente, aumento de desempenho. Este aumento de desempenho
vem acompanhado de inmeras inovaes tecnolgicas desde o projeto do ncleo dos
processadores at a interao deste com outros perifricos como memrias ou protocolos
de comunicao. O resultado deste avano pode-se ver cada vez mais em nossas casas
com o acrscimo de equipamentos inteligentes, que gerenciam suas prprias funes
possibilitando ao usurio diversas formas de controle, ou at mesmo em nossos bolsos, os
smartphones vm ganhando cada vez mais espao no mercado mundial e ano aps ano
esto sempre sendo lanadas novas verses com maior poder de processamento e
eficincia energtica.
Com este avano gradual da eletrnica surgiram no mercado diversos fabricantes que
optaram por desenvolver seus microcontroladores com alto poder de processamento e
barramento de 32 bits. Esta arquitetura foi um grande salto tecnolgico dos antigos
microcontroladores de 8 ou at 16 bits que j estavam amplamente difundidos no
mercado at ento, porm j tinham encontrado suas limitaes diante da necessidade de
utilizao de interfaces grficas, comunicao com diversos perifricos atravs de diversos
protocolos de comunicao ou at mesmo avanados recursos matemticos empregados a
processamentos de sinais envolvendo ponto flutuante. Foi nesse ambiente de avano de
arquiteturas que vrios fabricantes de microcontroladores empregaram um ncleo ARM
aos seus produtos.
O objetivo deste trabalho introduzir a alunos de graduao voltada para a rea de
sistemas embarcados, conhecimentos mnimos necessrios para iniciar seus estudos e
pesquisas diante da famlia de microcontroladores ARM Cortex-M4 Tiva C Series cuja
fabricante a Texas Instruments. Logo, este trabalho fornecer meios aos quais o
interessado na rea instale os softwares adequados, utilize os exemplos fornecidos pelo
fabricante, crie seus prprios projetos e utilize perifricos do microcontrolador como
GPIO, UART, Interrupo e Timer.
[Digite texto]
[Digite texto]
[Digite texto]
[Digite texto]
[Digite texto]
2.2.1
2.2.2
[Digite texto]
2.2.3
O TIMER
2.2.4
A Memria
10
[Digite texto]
Finalmente, a placa ainda disponibiliza um LED RGB e dois botes (SW1 e SW2)
conectados a pinos do microcontrolador para utilizao nos exemplos fornecidos pela
Texas, suas prprias aplicaes ou depurao e testes no firmware.
11
[Digite texto]
12
[Digite texto]
NOTA: Outras informaes podero ser acessadas na documentao: Tiva C Series
TM4C123G LaunchPad Evaluation Board Users Guide [1].
1 Passo: Aps aceitar os termos de licena, marque o item 32-bit ARM MCUs conforme
a figura 9 e clique em Next.
13
[Digite texto]
3 Passo: Na tela do App Center (Central de aplicativos da TI), marque a opo GUI
Composer. Este aplicativo no ser estudado nesta apostila, mas poder ser muito til em
aplicaes futuras. Para conhec-lo melhor verificar a referncia [8].
14
[Digite texto]
4 Passo: Caso os itens anteriores tenham ocorrido de maneira esperada, o CCS ter
concludo sua instalao e ser verificada a tela demonstrada na figura 12. Logo, marque a
opo Yes, para ter uma rea de trabalho simplificada, e clique na caixa Updates
Available e faa as atualizaes sugeridas.
15
[Digite texto]
16
[Digite texto]
Nota: Caso no seja possvel encontrar a TivaWare atravs do App Center, realizar o
download atravs da referncia [9].
Chegando a pgina de download, voc encontrar diversas opes das quais atendem
as linhas de launchpads DK e EK e dos microcontroladores da srie TM4C123 ou TM4C129.
Para a nossa launchpad em estudo ser necessrio baixar, dentro da opo Kit Software,
o arquivo SW-EK-TM4C123GXLx.x.x.x.exe.
17
[Digite texto]
6 Passo: Com o cabo USB, conecte sua launchpad ao computador atravs do conector
Debug da placa. Para que o computador reconhea a placa, a chave seletora dever
estar na posio Debug. Caso contrrio, para s alimentar a placa com a tenso provida
pela porta USB, passe a chave e o cabo USB para o modo Device.
Com a conexo feita no modo Debug, cheque se no gerenciador de dispositivos os
itens esto apresentados conforme a figura 16.
18
[Digite texto]
Caso todos os passos apresentados at aqui tenham sido concludos com xito, todos os
requisitos bsicos programao dos microcontroladores Tiva C Series foram instalados e
estaro operando corretamente.
5. A TivaWare
A TivaWare um conjunto de ferramentas que incluem uma vasta biblioteca de drivers
(Driver Library) e exemplos prontos para diversas vrias aplicaes. Fornecida pela Texas
para todos os microcontroladores da famlia TIVA ARM Cortex M4, ela fornece diversas
funes e bibliotecas que dinamizam a configurao de todos os registradores do
microcontrolador, facilitando assim o gerenciamento e configurao de seus perifricos e
comunicao com outros dispositivos. Toda a documentao que envolve sua utilizao e
exemplos de aplicaes pode ser baixada no site da Texas conforme a referncia [2].
Inicialmente, ser demonstrado como testar seus exemplos. Logo aps, seguiremos com
a criao de um projeto a utilizando como base e, concluindo, estudaremos seus recursos
bsicos para os perifricos utilizados.
Dois documentos muito importantes para o entendimento da TivaWare e dos seus
recursos
utilizados
nesta
apostila
estaro
dentro
da
pasta
docs
(C:\ti\TivaWare_C_Series-2.1.0.12573\docs), so eles: TivaWare Peripheral Driver Library e
TivaWare Utilities Library.
19
[Digite texto]
Aps incluirmos a TivaWare ao nosso projeto, ser possvel configurarmos de maneira
simples e rpida todos os perifricos estudados nesta apostila como GPIO, NVIC, TIMER e
UART.
20
[Digite texto]
21
[Digite texto]
22
[Digite texto]
4 Passo: Importando o project0 voc ir notar que ele aparece com uma exclamao
de warning dentro do Project Explorer. Para verificar os motivos destes warnings, clique
na ferramenta Build (cone do martelinho) ou com o boto direito em cima do projeto e
em seguida na opo de Build Project.
Seguindo o nico warning reportado pela janela Problems voc verificar que o
projeto foi criado para uma verso antiga do compilador (5.0.4) e a sua verso do CCS
requer a verso 5.1.8. Para reparar este problema, clique com o boto direito no seu
projeto -> Properties-> CCS General e mude a opo Compiler version para a TI
v5.1.8.
NOTA: Caso j exista uma verso acima da 5.1.8, selecione sempre a mais atual
recomendada.
23
[Digite texto]
24
[Digite texto]
Ao mandar o cdigo pela ferramenta de Debug, o cdigo inicialmente estar em
estado de pause na primeira linha do cdigo. Para ir depurando o cdigo passo a passo,
utilize as ferramentas de Step (setas amarelas), para rodar o cdigo normalmente clique
na ferramenta Resume (seta verde) ou aperte F8. Aps rodar o cdigo livremente voc
poder paus-lo em qualquer momento atravs da ferramenta Suspend (pause
amarelo). Para interromper o debug e comunicao com a placa clique em Terminate
(quadrado vermelho).
Nota: Caso queira debugar o cdigo com ele em funcionamento, insira break points
nas linhas de interesse dando dois cliques antes do nmero da linha. Assim, ao clicar em
Resume o cdigo ir rodar at alcanar a linha marcada.
Finalmente, com o cdigo rodando, voc ver o LED RGB da launchpad alternando de
cor periodicamente. Com isso, o project0 estar salvo na memria flash do
microcontrolador. Logo, mesmo que voc termine o debug e conecte a placa a outro
comutador ou alimentao externa, o cdigo continuar funcionando normalmente! Faa
o teste, troque o conector USB e a posio da chave seletora da placa das posies
Debug para a Device e veja que o cdigo continuar funcionando normalmente.
Lembrando que a posio Device fornece somente a alimentao da USB para a
launchpad (+5V/GND).
7 Passo: Vrios exemplos fornecidos pela Texas tem sua depurao realizada atravs da
porta serial. Para demonstrar a utilizao da UART, importe o projeto hello da mesma
forma que importou o projeto project0. Note que para rodar este novo projeto, o
mesmo dever estar marcado em negrito como Active-Debug no Project Explorer.
8 Passo: Para estabelecermos uma comunicao serial da launchpad com o
computador, precisaremos de um software prprio para este tipo de comunicao. Os
mais comuns, gratuitos, so o Hercules e o Putty. Em nossos exemplos usaremos o Putty
que poder ser baixado, conforme a referncia [13], em sua verso mais simples.
Verifique no gerenciador de dispositivos em qual COM est sua launchpad e configure
o software Putty conforme a figura 25 para a sua porta COM identificada.
25
[Digite texto]
1.
2.
3.
4.
Aps digitar o nome em Saved Sessions clique em Save e logo aps em Open. No
futuro, quando voc tiver vrias configuraes salvas, bastar clicar na configurao salva
e clicar em Load e logo aps Open, ou dar dois cliques em cima da configurao.
Aps abrir o terminal Putty, compile o projeto hello no CCS, verifique se ele est sem
warnings e clique em Debug para manda-lo para a launchpad. Com o terminal aberto, ao
rodar o cdigo, voc receber a seguinte mensagem conforme a figura 26.
26
[Digite texto]
Agora que ns temos nossos exemplos rodando, teste outros exemplos e para ver como
alguns perifricos esto sendo configurados, abra o documento SW-TM4C-EXAMPLES-UG2.1.0.12573.pdf dentro da pasta docs na pasta da TivaWare. Estas funes da TivaWare
que estaro sendo utilizadas em todos exemplos sero explicadas aps criarmos um
projeto do zero.
27
[Digite texto]
28
[Digite texto]
Nota: Inicialmente, atravs das configuraes de View, tente deixar sua rea de trabalho
do CCS conforme a figura 30.
29
[Digite texto]
30
[Digite texto]
31
[Digite texto]
Aps criar o diretrio, cheque se ele aparecer na lista de Variables.
32
[Digite texto]
6 Passo: Se todas as etapas anteriores foram seguidas corretamente. Ser possvel ver
os arquivos no Project Explorer conforme a figura 38.
33
[Digite texto]
7 Passo: Para validar o nosso projeto criado do zero. Vamos copiar as linhas de cdigo
referentes ao project0 disponibilizadas pela Texas, compilar e debugar o projeto.
Copiar o seguinte cdigo dentro do main.c do nosso projeto:
/////////////////////////////////////////////////////////////////////////////////////
// project0.c disponibilizado pela TI adaptado.
#include
#include
#include
#include
#include
#include
<stdint.h>
<stdbool.h>
"inc/hw_types.h"
// Incluso das bibliotecas
"inc/hw_memmap.h"
"driverlib/sysctl.h"
"driverlib/gpio.h"
#define RED_LED
GPIO_PIN_1
#define BLUE_LED GPIO_PIN_2 // Atribuio de nomes aos pinos do GPIO
#define GREEN_LED GPIO_PIN_3
#ifdef DEBUG
void
__error__(char *pcFilename, uint32_t ui32Line) // Rotina de erro
{
}
#endif
int
main(void)
{
//
// Configurando o clock do sistema
//
SysCtlClockSet(SYSCTL_SYSDIV_4|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN);
//
// Habilitando a GPIO F e configurando os pinos 1, 2 e 3 como sada. (Ver os defines!)
//
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, RED_LED|BLUE_LED|GREEN_LED);
//
// Loop
//
while(1)
{
//
// Liga o LED vermelho que est no pino 1 da GPIO F
//
GPIOPinWrite(GPIO_PORTF_BASE, RED_LED|BLUE_LED|GREEN_LED, RED_LED);
//
// Delay
//
SysCtlDelay(2000000);
//
// Liga o LED azul que est no pino 2 da GPIO F
//
GPIOPinWrite(GPIO_PORTF_BASE, RED_LED|BLUE_LED|GREEN_LED, BLUE_LED);
//
// Delay
//
SysCtlDelay(2000000);
}
}
/////////////////////////////////////////////////////////////////////////////////////
34
[Digite texto]
Se o cdigo rodou normalmente, nosso projeto do zero foi criado com sucesso!
SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN)
NOTA: Para entender melhor o sistema de variveis utilizadas pela TivaWare, dentro da
biblioteca stdint.h (C:\ti\ccsv6\tools\compiler\arm_5.1.8\include), dentre outras, poder
ser vista a seguinte declarao:
35
[Digite texto]
/* 7.18.1.1 Exact-width integer types */
typedef
signed char
int8_t;
typedef unsigned char uint8_t;
typedef
short int16_t;
typedef unsigned short uint16_t;
typedef
int
int32_t;
typedef unsigned int
uint32_t;
typedef
long long int64_t;
typedef unsigned long long uint64_t;
O exemplo acima configura na PORT F, os pinos PF1, PF2 e PF3 como sada (LED RGB da
Launchpad) e os pinos PF0 e PF4 como entrada (dois botes da Launchpad). Alm disso,
nos pinos PF0 e PF4, permitem uma corrente de at 2mA de entrada e configurados com
Pull Up.
36
[Digite texto]
Nota 1: Todas as funes apresentadas at agora so procedimentos que no retornam
nada void.
Nota 2: Por terem funes especficas, o microcontrolador vem com 6 pinos bloqueados
para evitar acidentais alteraes. So eles: PC0, PC1, PC2, PC3, PD7 e PF0. Como iremos
utilizar o PF0 como entrada do boto SW2, teremos de desbloque-lo. Para verificar como
ele desbloqueado verifique o Exemplo 1 em Anexo.
Para operar os pinos da GPIO sero utilizadas duas funes, uma para ler o estado dos
pinos de entrada e outra para mudana de estado do pino de sada.
1. GPIOPinRead(uint32_t ui32Port, uint8_t ui8Pins).
Funo que retorna se o pino selecionado est em nvel lgico alto (1) ou baixo (0).
Esta funo retorna o valor do pino referente a sua posio no byte referente ao
PORT verificado. Por exemplo: PIN0 ativo = 00000001, PIN1 ativo = 00000010,
seguindo at PIN7 ativo 10000000.
Abrindo
a
biblioteca
gpio.h
(C:\ti\TivaWare_C_Series2.1.0.12573\driverlib\gpio.h), podemos verificar esta declarao no sistema
hexadecimal.
//*****************************************************************
//
// The following values define the bit field for the ui8Pins
argument to
// several of the APIs.
//
//*****************************************************************
#define GPIO_PIN_0
0x00000001 // GPIO pin 0
#define GPIO_PIN_1
0x00000002 // GPIO pin 1
#define GPIO_PIN_2
0x00000004 // GPIO pin 2
#define GPIO_PIN_3
0x00000008 // GPIO pin 3
#define GPIO_PIN_4
0x00000010 // GPIO pin 4
#define GPIO_PIN_5
0x00000020 // GPIO pin 5
#define GPIO_PIN_6
0x00000040 // GPIO pin 6
#define GPIO_PIN_7
0x00000080 // GPIO pin 7
37
[Digite texto]
NOTA: Um exemplo de utilizao dos pinos de entrada e sada, conforme a configurao
apresentada, encontra-se no Exemplo 1 em Anexo.
3. UARTCharGet(uint32_t ui32Base).
Funo que retorna o caractere lido na serial como int32_t.
As funes acima so fornecidas pela Driverlib da TivaWare. Em nosso Exemplo 1 em
Anexo vamos usar algumas funes da biblioteca uartstdio.h (C:\ti\TivaWare_C_Series2.1.0.12573\utils\uartstdio.h) de Utils. Para entend-las melhor exercite sua busca pelas
funes verificando a documentao de Utils indicada na figura 17.
Exemplo de serial com baud rate: 115200 e enviando um caractere na UART 0 aps a
sua configurao:
void
ConfigureUART(void) // Funo retirada do exemplo hello.c
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
GPIOPinConfigure(GPIO_PA0_U0RX);
GPIOPinConfigure(GPIO_PA1_U0TX);
GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC);
UARTStdioConfig(0, 115200, 16000000);
}
int main(void) {
(...)
ConfigureUART(); // Funo de configurao da UART0
UARTprintf("Hello world after Engeneering!!!\n");
while(1)
{
38
[Digite texto]
(...)
}
}
Nota 1: Note que como a configurao da UART0 foi realizada dentro de uma funo,
dentro do int main do programa esta funo dever ser chamada na forma:
ConfigureUART();
Nota 2: Para que o projeto aceite a biblioteca vinda de utils ser necessrio clicar
Project-> Add Files... e busque o arquivo uartsdtio.c dentro de:
C:\ti\TivaWare_C_Series-2.1.0.12573\utils\uartstdio.c. Logo aps, escolha a opo Link to
files e mude o local de POROJECT_LOC para o nosso local criado TIVAWARE_INSTALL,
conforme a figura 39.
Nota 3: Caso a funo Add Files... em Project esteja apagada, d um clique no nome
do seu projeto no Project Explorer.
39
[Digite texto]
subida), GPIO_BOTH_EDGE (qualquer borda), GPIO_LOW_LEVEL (nvel lgico baixo)
e GPIO_HIGH_LEVEL (nvel lgico alto).
Como rotina de interrupo, a funo a ser chamada pela interrupo acima a void
PortDIntHandler(void) (nome arbitrrio) que acionada sempre que uma borda de
descida sujeita ao pino 4 do Port F. Um exemplo de sua utilizao pode ser visto no
Exemplo 2 Anexo.
Para que uma funo de interrupo seja executada, ser necessrio declar-la ao
cdigo tm4c123gh6pmi_sturtup_ccs.c que representa o vetor de gerenciamento das
funes.
1 Passo: Declare a funo a ser chamada atravs da interrupo desejada como funo
externa ao
cdigo, aproximadamente
na
linha 58
do
cdigo
do
tm4c123gh6pmi_sturtup_ccs.c.
//**********************************************************************
//
// External declarations for the interrupt handlers used by the
application.
//
//**********************************************************************
// To be added by user
extern void PortFIntHandler(void);
//**********************************************************************
//
//
//
//
FLASH Control
GPIO Port F
GPIO Port G
GPIO Port H
40
[Digite texto]
Aps estas configuraes, sempre que houver uma borda de descida no pino 4 do PortF
(SW1 pressionado), sua funo de interrupo ser executada!
3. TimerLoadSet(uint32_t
ui32Value).
ui32Base,
uint32_t
ui32Timer,
uint32_t
Funo que seleciona o valor de estouro do Timer (Em caso de Timer peridico)
onde o parmetro ui32Value um nmero inteiro representado por at 32 bits.
41
[Digite texto]
Novamente, para que uma funo de interrupo seja executada sempre que o nosso
timer desejar, ser necessrio declar-la ao cdigo tm4c123gh6pmi_sturtup_ccs.c.
1 Passo: Declare a funo a ser chamada atravs da interrupo desejada como funo
externa ao
cdigo, aproximadamente
na
linha 59
do
cdigo
do
tm4c123gh6pmi_sturtup_ccs.c.
//**********************************************************************
//
// External declarations for the interrupt handlers used by the
application.
//
//**********************************************************************
// To be added by user
extern void PortFIntHandler(void);
extern void Timer0IntHandler (void);
//**********************************************************************
//
//
//
//
Watchdog timer
Timer 0 subtimer A
Timer 0 subtimer B
Timer 1 subtimer A
42
[Digite texto]
6. Concluso
Visando introduzir os conceitos bsicos necessrios a aprendizagem dos
microcontroladores da srie ARM Cortex M4 TM4C123, este trabalho apresentou as
funcionalidades bsicas, diante da utilizao a TivaWare, de itens como GPIO, Timer,
USART e Interrupo. Para que o estudante de sistemas embarcados aprenda outros
perifricos no utilizados nesta apostila e aprofunde seus conhecimentos sobre esta
arquitetura, recomenda-se como algumas excelentes formas de informao o workshop
disponvel em forma de vdeos pela TI [3] ou o livro Introduction to ARM Cortex-M
Microcontrollers de Jonathan W. Valvano.
43
[Digite texto]
7. ANEXOS
7.1 Exemplo 1 Utilizando o GPIO e UART
Neste exemplo sero mostradas configuraes para utilizao da GPIO e UART. Os
pinos PF1, PF2 e PF3 sero configurados como sada por estarem conectados ao LED RGB
da launchpad e os pinos PF0 e PF4 sero configurados como entrada por estarem nos
botes SW1 e SW2 da launchpad. Alm disto, as informaes referentes cor do LED
sero impressas pela serial e podero ser verificadas atravs do terminal Putty.
//////////////EXEMPLO 1 - CONFIGURAES DA GPIO E UART////////////////////
#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/sysctl.h"
#include "driverlib/gpio.h"
#include "driverlib/uart.h"
#include "driverlib/pin_map.h"
#include "utils/uartstdio.h"
//"Defines" retirados da biblioteca "inc/tm4c123gh6pm.h"
//utilizados para declarar as variveis de desbloqueio
//do pino PF0.
#define GPIO_PORTF_LOCK_R
(*((volatile uint32_t *)0x40025520))
#define GPIO_PORTF_CR_R
(*((volatile uint32_t *)0x40025524))
int LED=4;
/***Configurao da UART0, Utils.c***/
void
ConfigureUART(void) // Funo retirada do exemplo hello.c
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
GPIOPinConfigure(GPIO_PA0_U0RX);
GPIOPinConfigure(GPIO_PA1_U0TX);
GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC);
UARTStdioConfig(0, 115200, 16000000);
}
int main(void) {
// Habilita clock geral do sistema
SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16
MHZ|SYSCTL_OSC_MAIN);
////Configurao da GPIO F ////
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
44
[Digite texto]
GPIO_PORTF_LOCK_R = 0x4C4F434B;
GPIO_PORTF_CR_R = 0x1F;
// Desbloqueio do
// pino PF0.
GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE,
GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);
GPIOPinTypeGPIOInput(GPIO_PORTF_BASE,
GPIO_PIN_4|GPIO_PIN_0);
GPIOPadConfigSet(GPIO_PORTF_BASE,GPIO_PIN_0|GPIO_PIN_4,
GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_STD_WPU);
ConfigureUART();
while(1)
{
// Se SW2 for pressionado//
if(!(GPIOPinRead(GPIO_PORTF_BASE, GPIO_PIN_0) &
GPIO_PIN_0))
{
LED=8;
UARTprintf("Verde\n");
}
// Se SW1 for pressionado//
if(!(GPIOPinRead(GPIO_PORTF_BASE, GPIO_PIN_4) &
GPIO_PIN_4))
{
LED=2;
UARTprintf("Vermelho\n");
}
GPIOPinWrite(GPIO_PORTF_BASE,
GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, LED);
SysCtlDelay(2000000);
LED=4;
}
}
//////////////////////////EXEMPLO 1 FIM/////////////////////////////////
45
[Digite texto]
<stdint.h>
<stdbool.h>
"inc/hw_memmap.h"
"inc/hw_types.h"
"driverlib/sysctl.h"
"driverlib/gpio.h"
"driverlib/uart.h"
"driverlib/pin_map.h"
"utils/uartstdio.h"
"driverlib/interrupt.h"
"inc/hw_ints.h"
46
[Digite texto]
int main(void) {
SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL
_OSC_MAIN); // Habilita clock geral do sistema
// Desbloqueio do
//pino PF0.
GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE,
GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);
GPIOPinTypeGPIOInput(GPIO_PORTF_BASE, GPIO_PIN_4|GPIO_PIN_0);
GPIOPadConfigSet(GPIO_PORTF_BASE,GPIO_PIN_0|GPIO_PIN_4,
GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_STD_WPU);
47
[Digite texto]
Com este exemplo em funcionamento, ser verificado que:
1) Se o LED estiver verde ou azul, ou seja, o cdigo est dentro do while, e o boto
SW1 for pressionado, ele ficar vermelho instantaneamente caracterizando a
entrada na interrupo.
2) Se a execuo estiver dentro da interrupo, LED vermelho, quando se
pressiona SW2 nada acontece. Ou seja, o cdigo s volta para o seu trajeto
normal depois de tratar a interrupo.
3) Neste exemplo a Interrupo foi configurada para borda de descida
(GPIO_FALLING_EDGE), verifique as variveis da funo GPIOIntTypeSet dentro
da documentao [2] e teste outras possibilidades como borda de subida, nvel
lgico, etc.
#define GPIO_PORTF_LOCK_R
#define GPIO_PORTF_CR_R
#define MULT_TIMER 1
48
[Digite texto]
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3,
LED);
UARTprintf("Blue\n");
flag=0;
}
else
{
LED=8;
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3,
LED);
UARTprintf("Green\n");
flag=1;
}
}
/***Interrupo por borda de descida no PortF Pin4***/
void PortFIntHandler(void)
{
GPIOIntClear(GPIO_PORTF_BASE, GPIO_PIN_4);
LED=2;
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, LED);
UARTprintf("Red\n");
SysCtlDelay(20000000);
}
/***Configurao da UART0, Utils.c***/
void
ConfigureUART(void) // Funo retirada do exemplo hello.c
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
GPIOPinConfigure(GPIO_PA0_U0RX);
GPIOPinConfigure(GPIO_PA1_U0TX);
GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC);
UARTStdioConfig(0, 115200, 16000000);
}
int main(void) {
unsigned long Period;
SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL
_OSC_MAIN);
// desbloqueia o PortF
// permite alteraes para PF4-0
GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE,
GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);
GPIOPinTypeGPIOInput(GPIO_PORTF_BASE, GPIO_PIN_4|GPIO_PIN_0);
49
[Digite texto]
GPIOPadConfigSet(GPIO_PORTF_BASE,GPIO_PIN_0|GPIO_PIN_4,
GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_STD_WPU);
//Configura o Timer
ConfigureUART();
while(1)
{
//Isso mesmo! O while est vazio!
}
}
///////////////////////////EXEMPLO 3 - FIM//////////////////////
IntPrioritySet(INT_TIMER0A, 0x40);
#define MULT_TIMER 4
50
[Digite texto]
5) Caso queira programar alguma funo para o boto SW2 no pino PF0, este
exemplo permaneceu com as suas configuraes como nos exemplos
anteriores.
51
[Digite texto]
extern void _c_int00(void);
//***************************************************************************
//
// Linker variable that marks the top of the stack.
//
//***************************************************************************
extern uint32_t __STACK_TOP;
//***************************************************************************
//
// External declarations for the interrupt handlers used by the application.
//
//***************************************************************************
// To be added by user
extern void PortFIntHandler(void);
extern void Timer0IntHandler(void);
//***************************************************************************
//
// The vector table. Note that the proper constructs must be placed on this
to
// ensure that it ends up at physical address 0x0000.0000 or at the start of
// the program if located at a start address other than 0.
//
//***************************************************************************
#pragma DATA_SECTION(g_pfnVectors, ".intvecs")
void (* const g_pfnVectors[])(void) =
{
(void (*)(void))((uint32_t)&__STACK_TOP),
// The initial stack pointer
ResetISR,
// The reset handler
NmiSR,
// The NMI handler
FaultISR,
// The hard fault handler
IntDefaultHandler,
// The MPU fault handler
IntDefaultHandler,
// The bus fault handler
IntDefaultHandler,
// The usage fault handler
0,
// Reserved
0,
// Reserved
0,
// Reserved
0,
// Reserved
IntDefaultHandler,
// SVCall handler
IntDefaultHandler,
// Debug monitor handler
0,
// Reserved
IntDefaultHandler,
// The PendSV handler
IntDefaultHandler,
// The SysTick handler
IntDefaultHandler,
// GPIO Port A
IntDefaultHandler,
// GPIO Port B
IntDefaultHandler,
// GPIO Port C
IntDefaultHandler,
// GPIO Port D
IntDefaultHandler,
// GPIO Port E
IntDefaultHandler,
// UART0 Rx and Tx
IntDefaultHandler,
// UART1 Rx and Tx
IntDefaultHandler,
// SSI0 Rx and Tx
IntDefaultHandler,
// I2C0 Master and Slave
IntDefaultHandler,
// PWM Fault
IntDefaultHandler,
// PWM Generator 0
IntDefaultHandler,
// PWM Generator 1
IntDefaultHandler,
// PWM Generator 2
52
[Digite texto]
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
Timer0IntHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
PortFIntHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
0,
0,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
0,
0,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
0,
0,
0,
0,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
Quadrature Encoder 0
ADC Sequence 0
ADC Sequence 1
ADC Sequence 2
ADC Sequence 3
Watchdog timer
Timer 0 subtimer A
Timer 0 subtimer B
Timer 1 subtimer A
Timer 1 subtimer B
Timer 2 subtimer A
Timer 2 subtimer B
Analog Comparator 0
Analog Comparator 1
Analog Comparator 2
System Control (PLL, OSC, BO)
FLASH Control
GPIO Port F
GPIO Port G
GPIO Port H
UART2 Rx and Tx
SSI1 Rx and Tx
Timer 3 subtimer A
Timer 3 subtimer B
I2C1 Master and Slave
Quadrature Encoder 1
CAN0
CAN1
Reserved
Reserved
Hibernate
USB0
PWM Generator 3
uDMA Software Transfer
uDMA Error
ADC1 Sequence 0
ADC1 Sequence 1
ADC1 Sequence 2
ADC1 Sequence 3
Reserved
Reserved
GPIO Port J
GPIO Port K
GPIO Port L
SSI2 Rx and Tx
SSI3 Rx and Tx
UART3 Rx and Tx
UART4 Rx and Tx
UART5 Rx and Tx
UART6 Rx and Tx
UART7 Rx and Tx
Reserved
Reserved
Reserved
Reserved
I2C2 Master and Slave
I2C3 Master and Slave
Timer 4 subtimer A
Timer 4 subtimer B
53
[Digite texto]
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
0,
0,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
0,
0,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
Reserved
Reserved
Reserved
Reserved
Reserved
Reserved
Reserved
Reserved
Reserved
Reserved
Reserved
Reserved
Reserved
Reserved
Reserved
Reserved
Reserved
Reserved
Reserved
Reserved
Timer 5 subtimer A
Timer 5 subtimer B
Wide Timer 0 subtimer A
Wide Timer 0 subtimer B
Wide Timer 1 subtimer A
Wide Timer 1 subtimer B
Wide Timer 2 subtimer A
Wide Timer 2 subtimer B
Wide Timer 3 subtimer A
Wide Timer 3 subtimer B
Wide Timer 4 subtimer A
Wide Timer 4 subtimer B
Wide Timer 5 subtimer A
Wide Timer 5 subtimer B
FPU
Reserved
Reserved
I2C4 Master and Slave
I2C5 Master and Slave
GPIO Port M
GPIO Port N
Quadrature Encoder 2
Reserved
Reserved
GPIO Port P (Summary or P0)
GPIO Port P1
GPIO Port P2
GPIO Port P3
GPIO Port P4
GPIO Port P5
GPIO Port P6
GPIO Port P7
GPIO Port Q (Summary or Q0)
GPIO Port Q1
GPIO Port Q2
GPIO Port Q3
GPIO Port Q4
GPIO Port Q5
GPIO Port Q6
54
[Digite texto]
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler,
IntDefaultHandler
//
//
//
//
//
//
//
//
GPIO Port Q7
GPIO Port R
GPIO Port S
PWM 1 Generator
PWM 1 Generator
PWM 1 Generator
PWM 1 Generator
PWM 1 Fault
0
1
2
3
};
//***************************************************************************
//
// This is the code that gets called when the processor first starts
execution
// following a reset event. Only the absolutely necessary set is performed,
// after which the application supplied entry() routine is called. Any fancy
// actions (such as making decisions based on the reset cause register, and
// resetting the bits in that register) are left solely in the hands of the
// application.
//
//***************************************************************************
void
ResetISR(void)
{
//
// Jump to the CCS C initialization routine. This will enable the
// floating-point unit as well, so that does not need to be done here.
//
__asm("
.global _c_int00\n"
"
b.w
_c_int00");
}
//***************************************************************************
//
// This is the code that gets called when the processor receives a NMI. This
// simply enters an infinite loop, preserving the system state for
examination
// by a debugger.
//
//***************************************************************************
static void
NmiSR(void)
{
//
// Enter an infinite loop.
//
while(1)
{
}
}
//***************************************************************************
//
// This is the code that gets called when the processor receives a fault
// interrupt. This simply enters an infinite loop, preserving the system
state
// for examination by a debugger.
//
//***************************************************************************
55
[Digite texto]
static void
FaultISR(void)
{
//
// Enter an infinite loop.
//
while(1)
{
}
}
//***************************************************************************
//
// This is the code that gets called when the processor receives an
unexpected
// interrupt. This simply enters an infinite loop, preserving the system
state
// for examination by a debugger.
//
//***************************************************************************
static void
IntDefaultHandler(void)
{
//
// Go into an infinite loop.
//
while(1)
{
}
}
///////////////////////TM4C123GH6PM_SARTUP_CCS.C - FIM//////////////////////
56
[Digite texto]
57
[Digite texto]
58
[Digite texto]
59
[Digite texto]
8. Referncias
Tiva C Series TM4C123G LaunchPad Evaluation Board [1],
http://www.ti.com/lit/ug/spmu296/spmu296.pdf
TI Softwares [4],
http://www.ti.com/ww/en/launchpad/software.html
Ti eStore [5],
https://estore.ti.com/Tiva-C-LaunchPad.aspx
ARM [6],
http://www.arm.com/products/processors/index.php
http://www.tecmundo.com.br/qualcomm/7708-por-que-os-processadores-armpodem-mudar-o-rumo-dos-dispositivos-eletronicos-.htm
http://www.hardware.com.br/termos/arm
60
[Digite texto]
61