Sie sind auf Seite 1von 61

Introduo aos microcontroladores

ARM Cortex-M4 Tiva C Series da


Texas Instruments

Stfano Andrade de Souza


Maro de 2015

[Digite texto]

Um certo espadachim nos seus dias derradeiros disse o seguinte:

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.

Yamamoto Tsunetomo HAGAKURE

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.

Os microcontroladores da srie TM4C123x .......................................................................... 5


2.1

O Ncleo ARM Cortex-M4 ............................................................................................. 7

2.2

Perifricos Estudados .................................................................................................... 9

2.2.1

GPIO General Purpose IN/OUT ........................................................................... 9

2.2.2

NVIC Nested Vector Interrupt Controller ........................................................... 9

2.2.3

O TIMER ............................................................................................................... 10

2.2.4

A Memria ........................................................................................................... 10

3.

A Placa de Desenvolvimento TIVA C Series EK-TM4C123G................................................. 10

4.

Code Composer Studio v6 (CCS).......................................................................................... 13


4.1

5.

Instalando o CCS e configuraes necessrias ............................................................ 13

A TivaWare .......................................................................................................................... 19
5.1

Rodando os exemplos da TivaWare ............................................................................ 20

5.2

Criando um Projeto do Zero [3] .................................................................................. 27

5.3

Clock Geral do Sistema ................................................................................................ 35

5.4

Configurando o GPIO................................................................................................... 36

5.5

Utilizando uma UART .................................................................................................. 38

5.6

Configurando o NVIC ................................................................................................... 39

5.7

Configurando o TIMER ................................................................................................ 41

6.

Concluso ............................................................................................................................ 43

7.

ANEXOS ............................................................................................................................... 44

8.

7.1

Exemplo 1 Utilizando o GPIO e UART ....................................................................... 44

7.2

Exemplo 2 Utilizando uma Interrupo.................................................................... 46

7.3

Exemplo 3 Utilizando o Timer .................................................................................. 48

7.4

Arquivo TM4C123GH6PM_STARTUP_CCS.C ............................................................... 51

7.5

Funes da TivaWare .................................................................................................. 56

7.5.1

Funes da GPIO ................................................................................................. 56

7.5.2

Funes da UART................................................................................................. 57

7.5.3

Funes de Interrupo ...................................................................................... 58

7.5.4

Funes de Timer ................................................................................................ 59

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]

2. Os microcontroladores da srie TM4C123x


Os microcontroladores da srie TM4C123x da Texas Instruments so os mais novos
microcontroladores de baixo custo da Texas a possurem um ncleo ARM Cortex-M4. Alm
disto, o microcontrolador ainda conta com poderosos recursos como, resumidamente,
grande capacidade de memria (FLASH, SRAM e EEPROM), FPU (Floating Point United),
sadas PWM, Quadrature Encoder Inputs, Debug via JTAG, USART, SSI/SPI, I2C, CAN, USB,
Hibernate com RTC, Timers e entradas AD com comparadores.

Figura 1 - Os Microcontroladores TM4C123X

[Digite texto]

Figura 2 - Diagrama de Blocos do Microcontrolador TM4C123GH6PM

NOTA: Outras informaes podero ser encontradas no datasheet do microcontrolador


TM4C123GH6PM em [12].

[Digite texto]

2.1 O Ncleo ARM Cortex-M4


Os processadores ARM so conhecidos pela sua versatilidade, pois possuem poucas
instrues para programao. So encontrados em telefones celulares, calculadoras,
perifricos de computador, equipamentos eletrnicos em geral e aplicaes industriais.
Atualmente os processadores ARM so 90% dos processadores embarcados RISC de 32
bits.
Desenvolvida pela inglesa Acorn Computer Limited em 1983, foi o primeiro processador
RISC criado para uso comercial. At ento, a maioria dos computadores utilizava a
arquitetura CISC, com suporte instrues complexas, simultneas e de execuo mais lenta
mas que resultavam em cdigos menores, pela simplificao da estrutura de
programao decorrente e menos entradas e sadas (diminuindo assim a necessidade de
memria).
Os RISC, por outro lado, visam a simplificao dessas instrues, com o intuito de atingir
a mxima eficincia por ciclo (podendo realizar tarefas menores com processos mais
curtos) e uma maior ordenao das operaes dentro do ncleo de processamento.
Por terem um nmero menor de circuitos internos, os RISC tambm podem trabalhar
com clocks mais altos. No entanto, as divises entre estes dois termos esto se tornando
cada vez mais nebulosas, uma vez que os processadores modernos j combinam as duas
linhas em suas diferentes camadas de hardware.
Nos dias atuais, a empresa ARM (Advanced RISC Machine LTDA) se especializou em
licenciar seus ncleos para parceiros que fabricam e vendem para seus clientes. Como
parte da sua estratgia, a ARM investe na assistncia queles que desenvolvem produtos
que utilizam seus chips, atravs de softwares de depurao, placas de projeto, etc, se
tornando assim basicamente uma empresa de Propriedade Intelectual (IP), no possuindo
grandes fbricas de semicondutores. [6]

[Digite texto]

Figura 3 - Fabricantes que trabalham com o Ncleo ARM.

Inicialmente voltado para aplicaes de grande poder de processamento que exigiam


um sistema operacional, hoje a empresa ARM tambm possui outra linha de ncleos onde
fornece sua arquitetura para aplicaes de menor porte no campo de Microcontroladores
e FPGA.

Figura 4 - Linha de Ncleos A, R e M da ARM.

[Digite texto]

2.2 Perifricos Estudados


Como j citado, dentro da srie de microcontroladores TM4C123x, inicialmente sero
estudados os perifricos de GPIO, NVIC e TIMER.

2.2.1

GPIO General Purpose IN/OUT

O GPIO (General Purpose In Out) ou, em portugus, perifrico de Entradas e Sadas de


Uso Geral o perifrico mais importante no estudo de microcontroladores. Com o GPIO
possvel ler o estado de sensores externos, acionar rels, LEDs, sirenes, etc. Muito utilizado
no campo da automao de qualquer processo, qualquer que seja o equipamento.
Na famlia de microcontroladores TM4C123x, o GPIO conta com a possibilidade de sada
a +3,3V (tenso de operao do microcontrolador) e entrada a +3,3V ou +5V. O que
possibilita a compatibilidade eltrica de forma direta com uma vasta gama de perifricos
eletrnicos que operam com +5V.
Para aplicaes de leitura que requerem um rpido tratamento ou prioridade no
Firmware em aplicao, possvel habilitar interrupo para qualquer pino do GPIO. Alm
disso, todos os pinos tambm podem contar com: o recurso Schmitt Trigger, Pull Up, Pull
Down, modo Coletor Aberto e controle de corrente de sada a 2, 8 ou 18mA.
Tudo isto torna extremamente verstil diversas aplicaes envolvendo este
microcontrolador e outros perifricos e ainda reduzem custos no projeto de Placas de
Circuito Impressos (PCIs), evitando circuitos de drivers, buffers de tenso e resistores
externos.

2.2.2

NVIC Nested Vector Interrupt Controller

Contando com 256 nveis de prioridade, do 1 ao 15 para o ncleo ARM e do 16 ao 255


conforme a sua aplicao. As interrupes podem ser habilitadas em qualquer um dos
pinos do GPIO, conforme dito anteriormente, e disparadas de diversas formas como borda
de subida, descida, ambas ou nvel lgico.
Contando com as interrupes de nvel 16 aos 255, o NVIC permite que a prioridade das
interrupes seja alterada conforme sua aplicao at mesmo em tempo de execuo do
microcontrolador.

[Digite texto]

2.2.3

O TIMER

O perifrico TIMER composto por contadores de 32 e 64 bits podendo ser disparados


atravs de interrupes externas ou pelo cdigo no modo One Shot. Ou podendo
trabalhar em modos peridicos, habilitados para chamar uma interrupo a cada perodo
de tempo pr-selecionado.
Alm disto, ainda conta com modos PWM (Pulse Width Modulation), RTC (Hibernate) e
CCP (Capture, Compare, and Pulse Width Modulation).

2.2.4

A Memria

As memrias da srie de microcontroladores TM4C123x podem variar, conforme o


microcontrolador escolhido, atingindo o limite de:
Flash: 256KB
EEPROM: 2KB
SRAM: 32 KB

3. A Placa de Desenvolvimento TIVA C Series EK-TM4C123G


A Placa de Desenvolvimento ou Launchpad Evaluation Board pode ser adquirida no
site de venda da Texas [5] por aproximadamente $13,00. Ela foi desenvolvida de forma a
extrair e disponibilizar todos os recursos do microcontrolador e facilitar o acesso
programao via Software/ICDI e Debug.
Inicialmente, a Launchpad conta com duas entradas micro USB, uma somente para
alimentao (Device) e outra para alimentao e programao e depurao do cdigo
(Debug), chaveadas por uma chave seletora. Alm disto, pode ser visualizado um LED
verde indicando que a placa foi alimentada e, eventualmente, tambm poder ser
utilizado um boto para RESET do microcontrolador (SW0).
Para suas aplicaes esto disponveis dois barramentos de pinos com a GPIO, seus
perifricos de comunicao (I2C, UART, SPI, etc.) e alimentao totalmente compatvel
com os BoosterPacks disponveis pela Texas para os microcontroladores da linha TIVA e
MSP430.

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.

Figura 5 - Placa de Desenvolvimento EK-TM4C123G

11

[Digite texto]

Figura 6 - Diagrama de blocos da Placa de Desenvolvimento EK-TM4C123G

Nos exemplos mostrados nesta apostila sero utilizados os seguintes pinos do


microcontrolador:

Figura 7 - Pinos de entrada/sada da launchpad

Figura 8 - Pinos da porta Serial utilizada.

12

[Digite texto]
NOTA: Outras informaes podero ser acessadas na documentao: Tiva C Series
TM4C123G LaunchPad Evaluation Board Users Guide [1].

4. Code Composer Studio v6 (CCS)


Disponvel gratuitamente no site da Launchpad da Texas, o software oficial da Texas o
Code Composer Studio que est em sua sexta verso durante a elaborao deste trabalho.
O Code Composer conta com diversos recursos de debug e otimizao do cdigo e IDE
Eclipse. [4]
Alm do CCS, ainda podem ser utilizados outros softwares como: IAR, que livre at
30Kb de Flash utilizada, possui uma interface extremamente amigvel e excelente suporte
nacional; o KEIL; o Mentor Graphics e GCC, dentre outros.
Por ser gratuito, sem limitaes de memria, rodar todos os exemplos fornecidos pela
Texas para toda a sua linha de microcontroladores, dentre outros motivos, o software a
ser estudado ser o CCS.

4.1 Instalando o CCS e configuraes necessrias


Para baixar o CCS, e todos os aplicativos fornecidos pela Texas, inicialmente necessrio
criar uma conta no site da TI. Aps criar a conta, faa o download do CCS v6 conforme a
referncia [7] de acordo com seu sistema operacional.
NOTAS IMPORTANTES:

recomendvel que seja feito o download do software atravs do


instalador Off-line.
Durante a instalao, desativar a proteo em tempo real do antivrus
utilizado.
Fornecer as permisses de Firewall solicitadas.
Aps instalar o CCS, no salve seu workspace em usurios que
contenham acento, ou outros caracteres, no nome.
recomendado que todos os programas sejam instalados dentro da pasta
C:\ti.
Utilizando o Windows, clique com o boto direito no executvel do CCS e
execute como administrador.

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]

Figura 9 - Selecionando o suporte a famlia Tiva C Series no CCS.

2 Passo: Na tela de emuladores do CCS, mantenha a condio pr-estabelecida.

Figura 10 - Configurao padro do CCS.

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]

Figura 11 - App Center

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]

Figura 12 - Tela inicial do CCS.

Nota: Caso a caixa Updates Available no aparea de forma automtica clique em


Help e em seguida em Check for Updates.
5 Passo: Clique no cone App Center ou em View e, logo aps CCS App Center.
Digite tivaware e clique em Download. Voc ser redirecionado para uma pgina da TI
onde poder fazer o download da ultima verso da TivaWare.

16

[Digite texto]

Figura 13 - Buscando a TivaWare atravs do App Center.

Nota: Caso no seja possvel encontrar a TivaWare atravs do App Center, realizar o
download atravs da referncia [9].

Figura 14 - Download da TivaWare

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]

Figura 15 -Link de download da TivaWare

Na mesma pgina de downloads tambm podero ser encontrados pacotes mais


completos com os softwares utilizados e exemplos de outras launchpads da Texas.
Tambm podero ser encontrados aplicativos muito teis como o LM Flash Programmer e
os drivers ICDI/FTDI necessrios caso seu computador no reconhea a launchpad.
Nota: Como em outros downloads, ser necessrio realizar o login com a sua conta da TI
e dar uma sucinta justificativa de sua aplicao para concretizar os downloads.

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.

Figura 16 - Itens acrescidos ao Gerenciador de Dispositivos do Windows.

Nota 1: Para chegar ao Gerenciador de Dispositivos digite gerenciador de dispositivos


no iniciar, ou busca, do Windows ou v atravs do Painel de Controle. Caso tenha dvida,
checar a referncia [10].
Nota 2: Caso os itens destacados no apaream no Gerenciador de Dispositivos
automaticamente, realizar o download do driver necessrio conforme a referncia [11].

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.

Figura 17 - Documentao da TivaWare

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.

5.1 Rodando os exemplos da TivaWare


Aps a instalao da TivaWare, ser criada uma pasta de nome TivaWare_C_Seriesx.x.x.x, conforme recomendado, dentro da pasta C:\TI. Abrindo a pasta da TivaWare
sero encontradas vrias pastas muito teis para o desenvolvimento de novas aplicaes
contendo exemplos, documentao, bootloader, bibliotecas, drivers, etc.
1 Passo: Para rodarmos os exemplos, ser necessrio clicar em Project -> Import CCS
Projects.

Figura 18 - Importando Projetos I

20

[Digite texto]

2 Passo: Abra o Browse... e selecione a pasta da TivaWare.

Figura 19 - Importando Projetos II

21

[Digite texto]

3 Passo: Nesta etapa, sero expostos todos os projetos includos na TivaWare.


Selecione todos ou algum em especfico para testar. Inicialmente, iremos testar o
project0.

Figura 20 - Selecionando o Project0 da TivaWare

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.

Figura 21- Ferramenta de compilao

Caso sua rea de trabalho no esteja mostrando as janelas de Console e Problems


habilite-as em View. Aps compilar, construir ou depurar o projeto estas janelas exibiro
as mensagens referentes aos passos da compilao e erros encontrados.

Figura 22- Mensagens referentes compilao do projeto.

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]

Figura 23 - Atualizando a verso do compilador utilizado

Aps alterar o compilador, clique em Build novamente e verifique que o warning


desapareceu. Analise brevemente o que o cdigo faz no arquivo project0.c no Project
Explorer.
Logo, o projeto estar pronto para ser enviado para nossa launchpad e ser testado!
6 Passo: Para enviar o cdigo para o microcontrolador e debugar suas aes,
verifique na janela Target Configurations-> User Defined se o target: Tiva
TM4C123GH6PM.ccxml est marcado como Default.
Caso o target esteja correto, clique na ferramenta de Debug (inseto verde) e o cdigo
ir ser gravado na memria flash microcontrolador.

Figura 24 - Ferramentas de Debug

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]

Figura 25 - Configurao do Putty para Serial

Note que os itens alterados sero:

1.
2.
3.
4.

Connection type: Serial


Serial line: COM__
Speed: 115200
Saved Sessions: TM4C123

(Tipo de comunicao estabelecida)


(COM identificada pelo seu computador)
(Baud Rate)
(Nome opcional)

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]

Figura 26 - Mensagem exibida atravs do Putty

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.

5.2 Criando um Projeto do Zero [3]


Um dos projetos disponibilizados pela Texas o de nome project cuja funo
fornecer um projeto base, j com todas as configuraes necessrias, para projetos mais
complexos. Ainda sim, mostraremos como criar um projeto do zero para entender melhor
a utilizao de alguns dos recursos da TivaWare e do prprio CCS que estaro sendo
utilizados.
1 Passo: Para comearmos um projeto do zero, clique em Project-> New CCS Project.

Figura 27 - Iniciando um novo projeto

27

[Digite texto]

Habilite as configuraes interessantes ao projeto conforme a figura 28.

Figura 28 - Configuraes do novo projeto

2 Passo: Clique com o boto direito em cima do projeto e clique em Properties. Na


janela de propriedades CCS General marque o check box apresentado na figura 29.

28

[Digite texto]

Figura 29 - Alterando as opes de target

Nota: Inicialmente, atravs das configuraes de View, tente deixar sua rea de trabalho
do CCS conforme a figura 30.

Figura 30 - rea de trabalho do CCS

29

[Digite texto]

3 Passo: Clique com o boto direito em cima do projeto e clique em Properties.


Selecione janela de propriedades Resource-> Linked Resources -> Path Variables e
clique em New. Clicando em New selecione um nome e diretrio (pasta da TivaWare)
conforme a figura 31.

Figura 31 - Criando um New Path Variable

Logo aps, verifique se a nova Path foi adicionada a lista.

30

[Digite texto]

Figura 32 - Lista de Path Variables

3 Passo: Clique com o boto direito em cima do projeto e clique em Properties.


Selecione janela de propriedades CCS Build-> Variables (Note que a lista est vazia!),
clique em Add... e realize as definies conforme a figura 33.

Figura 33 - Adicionando um diretrio de variveis

31

[Digite texto]
Aps criar o diretrio, cheque se ele aparecer na lista de Variables.

Figura 34 - Diretrio de variveis criado

4 Passo: Aps preparar o nosso projeto, est na hora de realmente incluirmos os


recursos da TivaWare ao nosso projeto. Para isso, vamos vincular nosso projeto a Driver
Library.
Clique Project-> Add Files... e busque o arquivo driverlib.lib dentro de:
C:\ti\TivaWare_C_Series-2.1.0.12573\driverlib\ccs\Debug. 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 35.

Figura 35 - Vinculando o projeto a driverlib

5 Passo: Para que as bibliotecas utilizadas em nosso programa sejam encontradas,


agora iremos configurar as opes do Include.
Clique com o boto direito em cima do projeto e clique em Properties. Selecione
janela de propriedades CCS Build-> ARM Compiler -> Include Options e adicione o
diretrio TIVAWARE_INSTALL conforme a figura 36.

32

[Digite texto]

Figura 36 - Configurando o Include

Verifique se o diretrio criado foi adicionado lista.

Figura 37 - Diretrio TIVAWARE_INSTALL

6 Passo: Se todas as etapas anteriores foram seguidas corretamente. Ser possvel ver
os arquivos no Project Explorer conforme a figura 38.

Figura 38 - Project Explorer pronto iniciar o projeto

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!

Agora, vamos entender as funes de configurao da TivaWare perifrico por perifrico


at obtermos o conhecimento bsico para a criao de novos projetos.

5.3 Clock Geral do Sistema


Dando incio ao projeto do firmware utilizando a TivaWare, encontrado como primeiro
passo a ser seguido a configurao do clock geral do sistema. A funo a ser utilizada para
este procedimento a SyzCtlClockSet(uint32_t ui32Config). Onde ui32Config o
parmetro, ou os parmetros de configurao (quando vrios parmetros, os mesmos so
separados por |).
Exemplo de Configurao:

SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN)

No exemplo acima, pode ser verificado a utilizao de um cristal externo de 16MHz,


representados pelos parmetros SYSCTL_XTAL_16MHZ e SYSCTL_OSC_MAIN e
configurao do clock do sistema atravs de uma PLL (que possui 200MHz de referencia
para clculos) e diviso da mesma por 5, representadas pelos parmetros SYSCTL_SYSDIV5
e SYSCTL_USE_PLL.
Assim, o clock geral do sistema estar configurado para trabalhar com o cristal de 16
MHz da placa de desenvolvimento e estar funcionando a 40 MHz conforme a diviso da
PLL escolhida.
Nota: Para habilitar qualquer perifrico como o GPIO, Interrupo, etc. necessrio
habilitar o seu clock atravs da funo: SysCtlPeripheralEnable(ui32Peripheral). Onde
ui32Peripheral o perifrico a ser habilitado.
Exemplo de habilitao do perifrico GPIO Port F:
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);

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;

5.4 Configurando o GPIO


Para a configurao do GPIO so utilizadas basicamente trs funes:
1. GPIOPinTypeGPIOOutput(uint32_t ui32Port, uint8_t ui8Pins).
Funo onde um pino da GPIO do microcontrolador configurado como sada.
Onde o parmetro ui32Port representa o PORT a ser configurado e o ui8Pins o
pino.

2. GPIOPinTypeGPIOInput(uint32_t ui32Port, uint8_t ui8Pins).


Funo onde um pino da GPIO do microcontrolador configurado como entrada.

3. GPIOPadConfigSet(uint32_t ui32Port, uint8_t ui8Pins, uint32_t ui32Strength,


uint32_t ui32PinType).
Funo que configura as portas de entrada onde o parmetro ui32Strength
representa a corrente mxima a ser permitida pelo pino e o parmetro
ui32PinType configura se o pino ter Pull Up, Pull down ou Coletor Aberto.

Exemplo de configurao do GPIO:


////Configurao da GPIO F ////
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
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);

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

2. GPIOPinWrite(uint32_t ui32Port, uint8_t ui8Pins, uint8_t ui8Val).


Funo que manda nvel lgico alto (1) ou nvel lgico baixo (0) para o pino em
questo a partir do mesmo sistema de valores j citado na funo GPIOPinRead.

Exemplo de utilizao das Funes de entrada e sada:


GPIOPinRead(GPIO_PORTF_BASE, GPIO_PIN_4) //Retorna o endereo, ou
valor, do PIN_4 do PORTF caso 1.
GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3,GPIO_PIN
_2); //Aciona somente o PIN_2 do PORTF

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.

5.5 Utilizando uma UART


Para a configurao de uma UART segue abaixo as principais funes da Driverlib:

1. UARTConfigSetExpClk(uint32_t ui32Base, uint32t ui32UARTClk, uint32_t


ui32Baud, uint32_t ui32Config)
Funo que configura os parmetros da serial utilizada.

2. UARTCharPut(uint32_t ui32Base, unsigned char ucData).


Funo que imprime na serial onde o parmetro ucData a informao tipo char a
enviada.

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.

Figura 39 - Adicionando o arquivo uartstdio.c ao projeto.

Nota 3: Caso a funo Add Files... em Project esteja apagada, d um clique no nome
do seu projeto no Project Explorer.

5.6 Configurando o NVIC


Para a configurao de uma interrupo temos abaixo as principais funes:
1. IntMasterEnable()
Funo que permite ao processador responder a todas as chamadas de interrupo
utilizadas.
2. GPIOIntEnable(uint32_t ui32Port, uint32_t ui32IntFlags).
Funo onde um pino da GPIO do microcontrolador configurado como interrupo
e o parmetro ui32IntFlags representa o pino a ser configurado da seguinte forma:
GPIO_INT_PIN_0, GPIO_INT_PIN_1, ... ou GPIO_INT_PIN_7.
3. GPIOIntTypeSet(uint32_t ui32Port, uint8_t ui8Pins, uint32_t ui32IntType).
Funo onde um pino da GPIO do microcontrolador que configurado como
interrupo tem o seu modo de habilitao configurado, e o parmetro ui32IntType
que representa o modo de habilitao da interrupo pode ser configurado como:
GPIO_FALLING_EDGE (para borda de descida), GPIO_RISING_EDGE (para borda de

39

[Digite texto]
subida), GPIO_BOTH_EDGE (qualquer borda), GPIO_LOW_LEVEL (nvel lgico baixo)
e GPIO_HIGH_LEVEL (nvel lgico alto).

Exemplo de configurao de uma Interrupo no Port F e Pino 4 (SW1) por borda de


descida:
GPIOIntTypeSet(GPIO_PORTF_BASE, GPIO_PIN_4, GPIO_FALLING_EDGE);
GPIOIntEnable(GPIO_PORTF_BASE, GPIO_PIN_4);
IntEnable(INT_GPIOF);

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);
//**********************************************************************

2 Passo: Adicione essa funo ao vetor de interrupes em sua devida posio


substituindo a funo padro IntDefaultHandler pela sua funo utilizada. Para uma
interrupo no PORTF, sua posio ser aproximadamente na linha 116 do cdigo do
tm4c123gh6pmi_startup_ccs.c.
IntDefaultHandler,
PortFIntHandler,
IntDefaultHandler,
IntDefaultHandler,

//
//
//
//

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!

5.7 Configurando o TIMER


Para a configurao de um TIMER temos abaixo as principais funes:

1. TimerConfigure(uint32_t ui32Base, uint32t ui32Config)


Funo que configura o tipo de timer utilizado onde o parmetro ui32Config e
escolhido conforme a configurao de Timer peridico, Disparo nico, PWM, etc.

2. TimerEnable(uint32_t ui32Base, uint32_t ui32Timer).


Funo que habilita o timer escolhido aps a sua configurao onde o parmetro
ui32Timer o Timer escolhido: TIMER_A, TIMER_B, ou TIMER_BOTH.

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.

4. TimerIntClear(uint32_t ui32Base, uint32_t ui32IntFlags).


Funo que deve ser chamada aps a interrupo do timer peridico para manter
o Trigger.
Exemplo de configurao de Timer Peridico:

unsigned long Period;


////Habilitao do TIMER0////
SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
TimerConfigure(TIMER0_BASE, TIMER_CFG_PERIODIC);
Period = (SysCtlClockGet());
TimerLoadSet(TIMER0_BASE, TIMER_A, Period -1);
TimerIntEnable(TIMER0_BASE, TIMER_TIMA_PERIODIC);
TimerEnable(TIMER0_BASE, TIMER_A);
IntEnable(INT_TIMER0A);

NOTA: A funo SysCtlClockGet() retorna o valor do clock geral do sistema.


Como rotina de interrupo do Timer Peridico, a funo a ser chamada pelo Timer0 a
void Timer0IntHandler(void) que acionada sempre que o perodo do Timer atingido.
Um exemplo de aplicao conforme nossa configurao apresentada poder ser visto no
Exemplo 3 em Anexo.

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);
//**********************************************************************

2 Passo: Adicione essa funo ao vetor de interrupes em sua devida posio


substituindo a funo padro IntDefaultHandler pela sua funo utilizada. Para uma
interrupo no PORTF, sua posio ser aproximadamente na linha 106 do cdigo do
tm4c123gh6pmi_sturtup_ccs.c.
IntDefaultHandler,
Timer0IntHandler,
IntDefaultHandler,
IntDefaultHandler,

//
//
//
//

Watchdog timer
Timer 0 subtimer A
Timer 0 subtimer B
Timer 1 subtimer A

Aps estas configuraes, sempre que o timer atingir o perodo de contagem


selecionado, ele vai gerar uma interrupo e a funo declarada ser executada!

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/////////////////////////////////

Com este exemplo em funcionamento, ser verificado que:


1) Pressionado o boto SW1 o LED ficar vermelho e esta informao ser
impressa na serial.
2) Pressionado o boto SW2 o LED ficar verde e esta informao ser
impressa na serial.
3) Caso nenhum boto seja apertado o LED ficar azul e nada ser impresso
na serial.
4) Os valores 2, 4 e 8 representam os pinos (em hexadecimal) conforme
descrito no tpico 5.4 Configurando o GPIO.

45

[Digite texto]

7.2 Exemplo 2 Utilizando uma Interrupo


Neste exemplo ser demonstrado o funcionamento de uma Interrupo. Sempre que o
boto SW2 for pressionado o cdigo executar as linhas dentro do while e do if e o LED ficar
verde durante o tempo de delay selecionado. Caso o boto SW1 seja pressionado a execuo
do cdigo ir para a funo de tratamento de interrupo PortFIntHandler e o LED ficar
vermelho. Para verificar melhor como ocorre este procedimento, analise o cdigo linha por
linha atravs dos botes de Step.
/////////////EXEMPLO 2 - CONFIGURAES DE INTERRUPO////////////////
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

<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"

//"Defines" retirados da biblioteca "inc/tm4c123gh6pm.h"


//utilizados para declarar as variaveis de desbloqueio
//do pino PF4.
#define GPIO_PORTF_LOCK_R
(*((volatile uint32_t *)0x40025520))
#define GPIO_PORTF_CR_R
(*((volatile uint32_t *)0x40025524))
uint8_t LED=4;
/***Interrupo por borda de descida no PortF Pin4 (SW1)***/
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);
}

46

[Digite texto]
int main(void) {

SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL
_OSC_MAIN); // Habilita clock geral do sistema

////Configurao da GPIO F ////


SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
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);

////Configurando uma interrupo no PortD: Pin4 (SW1)////


GPIOIntTypeSet(GPIO_PORTF_BASE, GPIO_PIN_4, GPIO_FALLING_EDGE);
GPIOIntEnable(GPIO_PORTF_BASE, GPIO_PIN_4);
IntEnable(INT_GPIOF);
ConfigureUART();
while(1)
{
// Se SW2 for pressionado//
if(!(GPIOPinRead(GPIO_PORTF_BASE, GPIO_PIN_0) & GPIO_PIN_0))
{
LED=8;
UARTprintf("Verde\n");
GPIOPinWrite(GPIO_PORTF_BASE,
GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, LED);
SysCtlDelay(20000000);
}
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3,
LED);
SysCtlDelay(200);
LED=4;
}
}
//////////////////////EXEMPLO 2 - FIM///////////////////////////////////////

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.

7.3 Exemplo 3 Utilizando o Timer


Neste exemplo ser configurado um Timer peridico programado para gerar uma
interrupo sempre que alcanar seu perodo pr-estabelecido. Em paralelo com o
funcionamento do Timer, pressionando SW1 ainda ser gerada uma interrupo por borda de
subida, dessa maneira poder ser verificada a execuo de duas interrupes ao mesmo
tempo e a alternncia de prioridades entre elas.

///////////////EXEMPLO 3 - CONFIGURAES DE TIMER////////////////


#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"
#include "driverlib/interrupt.h"
#include "inc/hw_ints.h"
#include "driverlib/timer.h"
#include "inc/hw_timer.h"

#define GPIO_PORTF_LOCK_R
#define GPIO_PORTF_CR_R
#define MULT_TIMER 1

(*((volatile uint32_t *)0x40025520))


(*((volatile uint32_t *)0x40025524))

// Ajuste do Timer para teste

uint8_t LED=4, flag=0;


/***Interrupo periodica do timer0***/
void Timer0IntHandler (void)
{
TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT);
if(flag==1)
{
LED=4;

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);

////Configurao da GPIO F ////


SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
GPIO_PORTF_LOCK_R = 0x4C4F434B;
GPIO_PORTF_CR_R = 0x1F;

// 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);

////Configurando uma interrupo no PortD: Pin4 (SW1)////


GPIOIntTypeSet(GPIO_PORTF_BASE, GPIO_PIN_4, GPIO_FALLING_EDGE);
GPIOIntEnable(GPIO_PORTF_BASE, GPIO_PIN_4);
IntPrioritySet(INT_GPIOF, 0x40);
// Setando prioridade
IntEnable(INT_GPIOF);
////Habilitao do TIMER0////
SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
TimerConfigure(TIMER0_BASE, TIMER_CFG_PERIODIC);
como peridico

//Configura o Timer

Period = (SysCtlClockGet()*MULT_TIMER); // Recebe o valor do clock


multiplicado por uma varivel para o perodo
TimerLoadSet(TIMER0_BASE, TIMER_A, Period -1);
TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT);
TimerEnable(TIMER0_BASE, TIMER_A);
IntPrioritySet(INT_TIMER0A, 0x10);
// Setando prioridade
IntEnable(INT_TIMER0A);

ConfigureUART();
while(1)
{
//Isso mesmo! O while est vazio!
}
}
///////////////////////////EXEMPLO 3 - FIM//////////////////////

Com este exemplo em funcionamento, ser verificado que:


1) Sempre que o Timer atingir seu perodo, ser gerada uma interrupo que
mudar a cor do LED entre verde e azul.
2) Com a prioridade escolhida sempre que o boto SW1 for pressionado, a
interrupo por borda de descida ser executada deixando o LED vermelho.
Logo, como a prioridade do Timer maior que a do GPIOF, assim que o Timer
cumprir seu perodo o LED deixar de ficar vermelho e mudar para azul ou
verde.
3) Experimente alternar o valor das prioridades e poder verificar que
pressionando o boto SW1 o LED ficar vermelho at concluir o tempo de delay
selecionado. Independente das interrupes de Timer que agora esto com
uma prioridade inferior. Note que quanto menor o valor ajustado a prioridade
maior ser a prioridade da interrupo.
IntPrioritySet(INT_GPIOF, 0x10);

IntPrioritySet(INT_TIMER0A, 0x40);

4) Experimente tambm alterar o valor da constante MULT_TIMER para alterar o


perodo de ajuste do Timer.

#define MULT_TIMER 4

// Ajuste do Timer para teste

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.

7.4 Arquivo TM4C123GH6PM_STARTUP_CCS.C


Logo abaixo poder ser verificado o cdigo do programa que gerencia as interrupes com
as alteraes realizadas nos exemplos anteriores. Este cdigo, salvo as alteraes, foi gerado
automaticamente pelo CCS e de autoria da Texas Instruments.
///////////////////////TM4C123GH6PM_SARTUP_CCS.C/////////////////////////////
//
//***************************************************************************
//
// Startup code for use with TI's Code Composer Studio.
//
// Copyright (c) 2011-2014 Texas Instruments Incorporated. All rights
reserved.
// Software License Agreement
//
// Software License Agreement
//
// Texas Instruments (TI) is supplying this software for use solely and
// exclusively on TI's microcontroller products. The software is owned by
// TI and/or its suppliers, and is protected under applicable copyright
// laws. You may not combine this software with "viral" open-source
// software in order to form a larger program.
//
// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT
// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY
// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
// DAMAGES, FOR ANY REASON WHATSOEVER.
//
//***************************************************************************
#include <stdint.h>
//***************************************************************************
//
// Forward declaration of the default fault handlers.
//
//***************************************************************************
void ResetISR(void);
static void NmiSR(void);
static void FaultISR(void);
static void IntDefaultHandler(void);
//***************************************************************************
//
// External declaration for the reset handler that is to be called when the
// processor is started
//
//***************************************************************************

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//////////////////////

7.5 Funes da TivaWare


Atravs da TivaWare Peripheral Driver Library [2], ou C:\ti\TivaWare_C_Series2.1.0.12573\docs\ SW-TM4C-DRL-UG-2.1.0.12573.pdf, poder ser verificada vrias funes
que no foram demonstradas nesta apostila.

7.5.1 Funes da GPIO

void GPIOADCTriggerDisable (uint32_t ui32Port, uint8_t ui8Pins)


void GPIOADCTriggerEnable (uint32_t ui32Port, uint8_t ui8Pins)
uint32_t GPIODirModeGet (uint32_t ui32Port, uint8_t ui8Pin)
void GPIODirModeSet (uint32_t ui32Port, uint8_t ui8Pins, uint32_t
ui32PinIO)
void GPIODMATriggerDisable (uint32_t ui32Port, uint8_t ui8Pins)
void GPIODMATriggerEnable (uint32_t ui32Port, uint8_t ui8Pins)
void GPIOIntClear (uint32_t ui32Port, uint32_t ui32IntFlags)
void GPIOIntDisable (uint32_t ui32Port, uint32_t ui32IntFlags)

56

[Digite texto]

void GPIOIntEnable (uint32_t ui32Port, uint32_t ui32IntFlags)


void GPIOIntRegister (uint32_t ui32Port, void (_pfnIntHandler)(void))
uint32_t GPIOIntStatus (uint32_t ui32Port, bool bMasked)
uint32_t GPIOIntTypeGet (uint32_t ui32Port, uint8_t ui8Pin)
void GPIOIntTypeSet (uint32_t ui32Port, uint8_t ui8Pins, uint32_t
ui32IntType)
void GPIOIntUnregister (uint32_t ui32Port)
void GPIOPadConfigGet (uint32_t ui32Port, uint8_t ui8Pin, uint32_t
_pui32Strength, uint32_t_pui32PinType)
void GPIOPadConfigSet (uint32_t ui32Port, uint8_t ui8Pins,
uint32_t,ui32Strength, uint32_tui32PinType)
void GPIOPinConfigure (uint32_t ui32PinConfig)
int32_t GPIOPinRead (uint32_t ui32Port, uint8_t ui8Pins)
void GPIOPinTypeADC (uint32_t ui32Port, uint8_t ui8Pins)
void GPIOPinTypeCAN (uint32_t ui32Port, uint8_t ui8Pins)
void GPIOPinTypeComparator (uint32_t ui32Port, uint8_t ui8Pins)
void GPIOPinTypeEPI (uint32_t ui32Port, uint8_t ui8Pins)
void GPIOPinTypeEthernetLED (uint32_t ui32Port, uint8_t ui8Pins)
void GPIOPinTypeEthernetMII (uint32_t ui32Port, uint8_t ui8Pins)
void GPIOPinTypeFan (uint32_t ui32Port, uint8_t ui8Pins)
void GPIOPinTypeGPIOInput (uint32_t ui32Port, uint8_t ui8Pins)
void GPIOPinTypeGPIOOutput (uint32_t ui32Port, uint8_t ui8Pins)
void GPIOPinTypeGPIOOutputOD (uint32_t ui32Port, uint8_t ui8Pins)
void GPIOPinTypeI2C (uint32_t ui32Port, uint8_t ui8Pins)
void GPIOPinTypeI2CSCL (uint32_t ui32Port, uint8_t ui8Pins)
void GPIOPinTypeI2S (uint32_t ui32Port, uint8_t ui8Pins)
void GPIOPinTypeLPC (uint32_t ui32Port, uint8_t ui8Pins)
void GPIOPinTypePECIRx (uint32_t ui32Port, uint8_t ui8Pins)
void GPIOPinTypePECITx (uint32_t ui32Port, uint8_t ui8Pins)
void GPIOPinTypePWM (uint32_t ui32Port, uint8_t ui8Pins)
void GPIOPinTypeQEI (uint32_t ui32Port, uint8_t ui8Pins)
void GPIOPinTypeSSI (uint32_t ui32Port, uint8_t ui8Pins)
void GPIOPinTypeTimer (uint32_t ui32Port, uint8_t ui8Pins)
void GPIOPinTypeUART (uint32_t ui32Port, uint8_t ui8Pins)
void GPIOPinTypeUSBAnalog (uint32_t ui32Port, uint8_t ui8Pins)
void GPIOPinTypeUSBDigital (uint32_t ui32Port, uint8_t ui8Pins)
void GPIOPinWrite (uint32_t ui32Port, uint8_t ui8Pins, uint8_t ui8Val)

7.5.2 Funes da UART

void UART9BitAddrSend (uint32_t ui32Base, uint8_t ui8Addr)


void UART9BitAddrSet (uint32_t ui32Base, uint8_t ui8Addr, uint8_t
ui8Mask)
void UART9BitDisable (uint32_t ui32Base)
void UART9BitEnable (uint32_t ui32Base)
void UARTBreakCtl (uint32_t ui32Base, bool bBreakState)
bool UARTBusy (uint32_t ui32Base)
int32_t UARTCharGet (uint32_t ui32Base)
int32_t UARTCharGetNonBlocking (uint32_t ui32Base)
void UARTCharPut (uint32_t ui32Base, unsigned char ucData)
bool UARTCharPutNonBlocking (uint32_t ui32Base, unsigned char ucData)
bool UARTCharsAvail (uint32_t ui32Base)
uint32_t UARTClockSourceGet (uint32_t ui32Base)
void UARTClockSourceSet (uint32_t ui32Base, uint32_t ui32Source)

57

[Digite texto]

void UARTConfigGetExpClk (uint32_t ui32Base, uint32_t ui32UARTClk,


uint32_t _pui32Baud,
uint32_t _pui32Config)
void UARTConfigSetExpClk (uint32_t ui32Base, uint32_t ui32UARTClk,
uint32_t ui32Baud,
uint32_t ui32Config)
void UARTDisable (uint32_t ui32Base)
void UARTDisableSIR (uint32_t ui32Base)
void UARTDMADisable (uint32_t ui32Base, uint32_t ui32DMAFlags)
void UARTDMAEnable (uint32_t ui32Base, uint32_t ui32DMAFlags)
void UARTEnable (uint32_t ui32Base)
void UARTEnableSIR (uint32_t ui32Base, bool bLowPower)
void UARTFIFODisable (uint32_t ui32Base)
void UARTFIFOEnable (uint32_t ui32Base)
void UARTFIFOLevelGet (uint32_t ui32Base, uint32_t _pui32TxLevel,
uint32_t _pui32RxLevel)
void UARTFIFOLevelSet (uint32_t ui32Base, uint32_t ui32TxLevel,
uint32_t ui32RxLevel)
uint32_t UARTFlowControlGet (uint32_t ui32Base)
void UARTFlowControlSet (uint32_t ui32Base, uint32_t ui32Mode)
void UARTIntClear (uint32_t ui32Base, uint32_t ui32IntFlags)
void UARTIntDisable (uint32_t ui32Base, uint32_t ui32IntFlags)
void UARTIntEnable (uint32_t ui32Base, uint32_t ui32IntFlags)
void UARTIntRegister (uint32_t ui32Base, void (_pfnHandler)(void))
uint32_t UARTIntStatus (uint32_t ui32Base, bool bMasked)
void UARTIntUnregister (uint32_t ui32Base)
void UARTModemControlClear (uint32_t ui32Base, uint32_t ui32Control)
uint32_t UARTModemControlGet (uint32_t ui32Base)
void UARTModemControlSet (uint32_t ui32Base, uint32_t ui32Control)
uint32_t UARTModemStatusGet (uint32_t ui32Base)
uint32_t UARTParityModeGet (uint32_t ui32Base)
void UARTParityModeSet (uint32_t ui32Base, uint32_t ui32Parity)
void UARTRxErrorClear (uint32_t ui32Base)
uint32_t UARTRxErrorGet (uint32_t ui32Base)
void UARTSmartCardDisable (uint32_t ui32Base)
void UARTSmartCardEnable (uint32_t ui32Base)
bool UARTSpaceAvail (uint32_t ui32Base)
uint32_t UARTTxIntModeGet (uint32_t ui32Base)
void UARTTxIntModeSet (uint32_t ui32Base, uint32_t ui32Mode)

7.5.3 Funes de Interrupo

void IntDisable (uint32_t ui32Interrupt)


void IntEnable (uint32_t ui32Interrupt)
uint32_t IntIsEnabled (uint32_t ui32Interrupt)
bool IntMasterDisable (void)
bool IntMasterEnable (void)
void IntPendClear (uint32_t ui32Interrupt)
void IntPendSet (uint32_t ui32Interrupt)
int32_t IntPriorityGet (uint32_t ui32Interrupt)
uint32_t IntPriorityGroupingGet (void)
void IntPriorityGroupingSet (uint32_t ui32Bits)
uint32_t IntPriorityMaskGet (void)
void IntPriorityMaskSet (uint32_t ui32PriorityMask)
void IntPrioritySet (uint32_t ui32Interrupt, uint8_t ui8Priority)
void IntRegister (uint32_t ui32Interrupt, void (_pfnHandler)(void))

58

[Digite texto]

void IntTrigger (uint32_t ui32Interrupt)


void IntUnregister (uint32_t ui32Interrupt)

7.5.4 Funes de Timer

void TimerConfigure (uint32_t ui32Base, uint32_t ui32Config)


void TimerControlEvent (uint32_t ui32Base, uint32_t ui32Timer,
uint32_t ui32Event)
void TimerControlLevel (uint32_t ui32Base, uint32_t ui32Timer, bool
bInvert)
void TimerControlStall (uint32_t ui32Base, uint32_t ui32Timer, bool
bStall)
void TimerControlTrigger (uint32_t ui32Base, uint32_t ui32Timer,
bool bEnable)
void TimerControlWaitOnTrigger (uint32_t ui32Base, uint32_t
ui32Timer, bool bWait)
void TimerDisable (uint32_t ui32Base, uint32_t ui32Timer)
void TimerEnable (uint32_t ui32Base, uint32_t ui32Timer)
void TimerIntClear (uint32_t ui32Base, uint32_t ui32IntFlags)
void TimerIntDisable (uint32_t ui32Base, uint32_t ui32IntFlags)
void TimerIntEnable (uint32_t ui32Base, uint32_t ui32IntFlags)
void TimerIntRegister (uint32_t ui32Base, uint32_t ui32Timer, void
(_pfnHandler)(void))
uint32_t TimerIntStatus (uint32_t ui32Base, bool bMasked)
void TimerIntUnregister (uint32_t ui32Base, uint32_t ui32Timer)
uint32_t TimerLoadGet (uint32_t ui32Base, uint32_t ui32Timer)
uint64_t TimerLoadGet64 (uint32_t ui32Base)
void TimerLoadSet (uint32_t ui32Base, uint32_t ui32Timer, uint32_t
ui32Value)
void TimerLoadSet64 (uint32_t ui32Base, uint64_t ui64Value)
uint32_t TimerMatchGet (uint32_t ui32Base, uint32_t ui32Timer)
uint64_t TimerMatchGet64 (uint32_t ui32Base)
void TimerMatchSet (uint32_t ui32Base, uint32_t ui32Timer, uint32_t
ui32Value)
void TimerMatchSet64 (uint32_t ui32Base, uint64_t ui64Value)
uint32_t TimerPrescaleGet (uint32_t ui32Base, uint32_t ui32Timer)
uint32_t TimerPrescaleMatchGet (uint32_t ui32Base, uint32_t
ui32Timer)
void TimerPrescaleMatchSet (uint32_t ui32Base, uint32_t ui32Timer,
uint32_t ui32Value)
void TimerPrescaleSet (uint32_t ui32Base, uint32_t ui32Timer,
uint32_t ui32Value)
void TimerRTCDisable (uint32_t ui32Base)
void TimerRTCEnable (uint32_t ui32Base)
void TimerSynchronize (uint32_t ui32Base, uint32_t ui32Timers)
uint32_t TimerValueGet (uint32_t ui32Base, uint32_t ui32Timer)
uint64_t TimerValueGet64 (uint32_t ui32Base)

59

[Digite texto]

8. Referncias
Tiva C Series TM4C123G LaunchPad Evaluation Board [1],
http://www.ti.com/lit/ug/spmu296/spmu296.pdf

TivaWare Peripheral Driver Library [2],


http://www.ti.com/lit/ug/spmu298a/spmu298a.pdf
C:\ti\TivaWare_C_Series-2.1.0.12573\docs\SW-TM4C-DRL-UG-2.1.0.12573.pdf

Getting Started with the TIVA C Series TM4C123G Launchpad[3],


http://processors.wiki.ti.com/index.php/Getting_Started_with_the_TIVA%E2%84%A2_
C-Series_TM4C123G_LaunchPad?DCMP=tivac&HQS=TM4C123G-Launchpad-Workshop

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

Download CCS v6 [7],


http://processors.wiki.ti.com/index.php/Download_CCS

GUI Composer [8],


http://processors.wiki.ti.com/index.php/Category:GUI_Composer

Download TivaWare [9],


http://www.ti.com/tool/sw-tm4c

Abrir o Gerenciador de Dispositivos [10],


http://technet.microsoft.com/pt-br/library/cc754081.aspx

Download ICDI drivers [11],


http://www.ti.com/tool/stellaris_icdi_drivers

Tiva TM4C123GH6PM Microcontroller Datasheet [12],


http://www.ti.com/lit/ds/spms376e/spms376e.pdf

Putty download [13],


http://the.earth.li/~sgtatham/putty/latest/x86/putty.exe

Links Acessados em 30 de Novembro de 2014

60

[Digite texto]

61

Das könnte Ihnen auch gefallen