UNIVERSIDADE TECNOLÓGICA FEDERAL DO PARANÁ - UTFPR DEPARTAMENTO ACADÊMICO DE ELETROTÉCNICA - DAELT CURSO DE ENGENHARIA INDUSTRIAL ELÉTRICA MESTRADO EM SISTEMAS DE ENERGIA - PPGSE Microprocessadores Tópicos Esp. em Eletrônica Industrial - amauriassef@utfpr.edu.br paginapessoal.utfpr.edu.br/amauriassef 1
Introdução ao TivaWare, Inicialização e GPIO (Texas Instruments www.ti.com) 2
Configuração do clock É o 1º passo de um projeto de firmware utilizando a TivaWare Peripheral Driver Library 3
Árvore de clock principal 4
Configurar o clock do sistema para rodar a partir de um cristal de 16 MHz como oscilador principal Com o PLL (Phase-Locked Loop), a frequência do VCO (Voltage-controlled Oscillator) de 400 MHz oscila somente neste valor, utilizando cristais de 5 a 25 MHz Existe um divisor padrão por 2 no caminho do clock, derivando o sinal de 200 MHz A partir deste valor, é possível gerar outras frequências Função SysCtlClockSet (uint32_t ui32config), onde ui32config é o parâmetro de configuração com 32 bits 5
Exemplos // Setup the system clock to run at 50 MHz from PLL with crystal reference SysCtlClockSet(SYSCTL_SYSDIV_4 SYSCTL_USE_PLL SYSCTL_XTAL_16MHZ SYSCTL_OSC_MAIN) // Setup the system clock to run at 80 MHz from PLL with crystal reference SysCtlClockSet(SYSCTL_SYSDIV_2_5 SYSCTL_USE_PLL SYSCTL_XTAL_16M HZ SYSCTL_OSC_MAIN) 6
Técnicas de manipulação de bits ( -OU e &-E) Processo para atribuir valores em apenas alguns bits diretamente em variáveis/registros //Exemplo: variavel_teste = 0b0001 0100; // Atribuição na base binária variavel_teste = 0x14; // Atribuição na base hexadecimal variavel_teste = 20; // Atribuição na base decimal O modo de escrita de setar um bit é realizado pela operação OU com uma constante com todos os bits em nível 0, exceto o bit que se deseja setar O modo para limpar um bit é realizado pela operação E com uma constante com todos os bits em 1, exceto o bit que se deseja limpar 7
Exemplo para setar e limpar bits: 1) Setar os bits 3 e 7 do byte Reg: Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Reg 0 0 0 1 0 0 1 0 OU( ) 1 0 0 0 1 0 0 0 Reg 1 0 0 1 1 0 1 0 Equação: Reg = (1<<3) (1<<7); ou Reg = (0x04 0x80); 2) Limpar os bits 6 e 1 do byte Reg: Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Reg 1 1 0 1 1 0 1 0 E (&) 1 0 1 1 1 1 0 1 Reg 1 0 0 1 1 0 0 0 Equação: Reg &= ~((1<<1) (1<<6)); ou Reg &= ~(0x02 0x40); 8
Para identificar o valor de um ou mais bits diretamente em variáveis/registros realizar uma operação & somente com o(s) bit(s) de interesse setados Exemplo: Verificar se o bit 6 do byte Reg está setado Aplicação: Var = Reg & (1<<6); if (Var == 0) {} else {} Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Reg 0 0 0 1 0 0 1 0 & 0 1 0 0 0 0 0 0 Var 0 0 0 0 0 0 0 0 9
Configuração do GPIO (General Purpose I/O) No TM4C123GH6PM, os pinos de entrada e saída de propósito geral, comumente denominados de General- Purpose Input-Outputs (GPIOs), são divididos em seis blocos físicos GPIO: Porta A, Porta B, Porta C, Porta D, Porta E e Port F Antes de chamar qualquer função específica da driverlib (TivaWare Peripheral Driver Library), devemos habilitar o clock para o periférico Caso o clock não seja habilitado, será gerado um novo serviço de interrupção (ISR - Interrupt Service Routine) Fault (endereço fault) 10
Tiva C LaunchPad board Pinos dos LEDs e chaves Função SysCtlPeripheralEnable (uint32_t ui32peripheral), onde ui32peripheral é o periférico a ser habilitado 11
Os registradores para controle de clock dos periféricos são os Run Mode Clock Gating Control Register 0 a 3 (RCGC0 RCGC3) 12
Deve-se esperar alguns ciclos de clock (3 a 6) para iniciar o acesso aos periféricos // Exemplo de habilitação do periférico GPIO Port F // Enable and wait for the port to be ready for access SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); while(!sysctlperipheralready(sysctl_periph_gpiof)) { } // Exemplo sem o TivaWare volatile uint32_t delay = 0; // dummy variable /* Enable the clock on PORTF */ SYSCTL_RCGC2_R = 0x00000020; // 1) F clock delay = SYSCTL_RCGC2_R; // delay - ensure clock 13
Pode-se utilizar a função de atraso SysCtlDelay (uint32_t ui32count), sendo que cada unidade do ui32count representa 3 ciclos de clock (1/80MHz) // Exemplo de habilitação do periférico GPIO Port F // Atraso de 9 ciclos de clock SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); SysCtlDelay(3); Obs: SYSCTL_PERIPH_GPIOx, onde x é a letra do GPIO entre A e F 14
Características do módulo GPIO: Até 43 pinos programáveis de entrada/saída (E/S), dependendo da configuração; Configuração de entrada tolerante à 5 V (exceto os pinos PD4, PD5, PB0 e PB1, que são limitados a 3,6 V) Portas A à G acessíveis através de Barramento Avançado de Periférico (APB - Advanced Peripheral Bus) Rápida capacidade de inversão de nível a cada ciclo de clock nas portas AHB (Advanced High Perfomance Bus), e a cada dois ciclos para portas APB (usada para economia de energia) Controle programável de interrupções do GPIO Geração de interrupção mascarável Sincronismo por boda de subida, descida ou ambas Sensível à nível de valores alto ou baixo 15
Máscara de bit em ambas as operações de leitura e escrita através de linhas de endereço Pode ser usado para iniciar uma sequência de amostragem do ADC ou uma transferência do módulo µdma Pode manter o estado do pino durante o modo de Hibernação Pinos configurados como entradas digitais com Schmitttrigger Controle programável de configuração do pad GPIO Resistores de pull-up ou pull-down (valor nominal de 20 kω) Driver de corrente de 2 ma, 4 ma e 8 ma para comunicação digital; até quatro pinos podem drenar 18 ma para aplicações de alta corrente Controle de slew rate para pad de 8mA Habilitação de dreno aberto/habilitação de entrada digital 16
Ferramenta Cloud - PinMux: Allows the user to graphically configure the device pin-out Generates source and header files for use with any of the supported IDE s https://dev.ti.com/ 17
Ferramenta Cloud - PinMux: 18
Critical Function GPIO Protection Six pins on the device are protected against accidental programming: PC3,2,1 & 0: JTAG/SWD e PD7 & PF0: NMI Any write to the following registers for these pins will not be stored unless the GPIOLOCK register has been unlocked: GPIO Alternate Function Select register GPIO Pull Up or Pull Down select registers GPIO Digital Enable register The following sequence will unlock the GPIOLOCK register for PF0 using direct register programming: HWREG(GPIO_PORTF_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY; HWREG(GPIO_PORTF_BASE + GPIO_O_CR) = 0x01; HWREG(GPIO_PORTF_BASE + GPIO_O_LOCK) = 0; #include "inc/hw_gpio.h" Reading the GPIOLOCK register returns it to lock status GPIO_PORTF_LOCK_R = 0x4C4F434B; // Desbloqueio do GPIO_PORTF_CR_R = 0x1F; // pino PF0. 19
Os sinais GPIO possuem funções de hardware alternadas (alternativas analógicas e digitais) As funções de hardware alternativo digital são habilitadas definindo o bit apropriado nos registradores GPIO Alternate Function Select (GPIOAFSEL) e GPIO Digital Enable (GPIODEN) e configurando o campo de bits PMCx, no registro GPIO Port Control (GPIOPCTL) 20
Ferramenta Cloud - PinMux: 21
Pinos Digitais 22
Mapa de endereços GPIO Port A (APB): 0x4000.4000 GPIO Port A (AHB): 0x4005.8000 GPIO Port B (APB): 0x4000.5000 GPIO Port B (AHB): 0x4005.9000 GPIO Port C (APB): 0x4000.6000 GPIO Port C (AHB): 0x4005.A000 GPIO Port D (APB): 0x4000.7000 GPIO Port D (AHB): 0x4005.B000 GPIO Port E (APB): 0x4002.4000 GPIO Port E (AHB): 0x4005.C000 GPIO Port F (APB): 0x4002.5000 GPIO Port F (AHB): 0x4005.D000 23
Exemplo de configuração 24
Descrição dos registros de GPIO: GPIODIR (GPIO Data Direction) usado para configurar cada pino individual com entrada ou saída Valor Descrição 0 O pino correspondente é entrada 1 O pino correspondente é saída GPIODATA: cada porta de GPIO possui um endereço base e todos os 8 bits pode ser modificados. Entretanto, para modificar bits específicos é possível utilizar uma máscara de bits. Isto é realizado em hardware, mapeando as portas de GPIO para 256 endereços, através dos bits [9:2] do barramento de endereço, usado como máscara. Dessa maneira, os drivers de software podem modificar os pinos de GPIO individualmente sem afetar o estados de outros pinos. Este método é mais eficiente que as operações readmodify-write para setar ou limpar um pino GPIO 25
GPIO Address Masking O registrador que queremos mudra é o GPIO Port A (0x4005.8000) O conteúdo atual do registro é: O valor a ser escrito é 0xEB: GPIO Port A (0x4005.8000) 0 0 0 1 1 1 0 1 Write Value (0xEB) 1 1 1 0 1 0 1 1 Ao invés de escrever diretamente no GPIO Port A, escrever no 0x4005.8098. Os bits 9:2 (mostrados aqui) tornam-se a máscara de bits para o valor a ser escrito. 0 0 0 0 0 1 0 0 1 1 0 0 0 Apenas os bits marcados como 1 na máscada de bits são alterados. 0 0 1 1 1 0 1 1 New value in GPIO Port A (note that only the red bits were written) GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_5 GPIO_PIN_2 GPIO_PIN_1, 0xEB); 26
GPIODR2R (GPIO 2-mA Drive Select) Valor Descrição 0 O drive para o GPIO correspondente é controlado pelo registro GPIODR4R ou GPIODR8R 1 O GPIO correspondente possui drive de 2 ma (entrada) GPIODR4R (GPIO 4-mA Drive Select) Valor Descrição 0 O drive para o GPIO correspondente é controlado pelo registro GPIODR2R ou GPIODR8R 1 O GPIO correspondente possui drive de 4 ma (entrada) GPIODR8R (GPIO 8-mA Drive Select) Valor Descrição 0 O drive para o GPIO correspondente é controlado pelo registro GPIODR2R ou GPIODR4R 1 O GPIO correspondente possui drive de 8 ma (entrada) 27
GPIOAFSEL (GPIO Alternate Function Select) Valor Descrição 0 Configura o respectivo pino como GPIO 1 Configura o GPIO para uma função associada à periférico GPIOPCTL (GPIO Port Control): usado para selecionar uma das possíveis funções alternativas (0 a 15) 28
GPIOODR (GPIO Open Drain Select) Valor Descrição 0 Desabilitada o pino correspondente como dreno aberto 1 Habilita o pino correspondente como dreno aberto GPIOPUR (GPIO Pull-Up Select) Valor Descrição 0 Desabilita o resistor fraco de pull-up correspondente 1 Habilita o resistor fraco de pull-up correspondente GPIOPDR (GPIO Pull-Down Select) Valor Descrição 0 Desabilita o resistor fraco pull-down correspondente 1 Habilita o resistor fraco pull-down correspondente 29
GPIOSLR (GPIO Slew Rate Control Select) Valor Descrição 0 Desabilitada o controle de slew rate no pino correspondente 1 Habilitada o controle de slew rate no pino correspondente GPIODEN (GPIO Digital Enable) Valor Descrição 0 Desabilitada as funções digitais para o pino correspondente 1 Habilitada as funções digitais para o pino correspondente GPIOLOCK (GPIO Lock) Valor Descrição 0 O registro GPIOCR está travado e não pode ser modificado 1 O registro GPIOCR está destravado e pode ser modificado 30
GPIOCR (GPIO Commit) Valor Descrição 0 Os registros GPIOAFSEL, GPIOPUR, GPIOPDR, ou GPIODEN não podem ser modificados 1 Os registros GPIOAFSEL, GPIOPUR, GPIOPDR, ou GPIODEN podem ser modificados GPIOAMSEL (GPIO Analog Mode Select) Valor Descrição 0 Desabilita a função analógica e a isolação é habilitada (p/ GPIO em 5V) 1 Habilita a função analógica e a isolação é desabilitada 31
Configuração pelo TivaWare GPIOPinTypeGPIOOutput(uint32_t ui32port, uint8_t ui8pins) Função para configurar um pino da GPIO como saída, onde o parâmetro ui32port representa o PORT a ser configurado e o ui8pins o pino GPIOPinTypeGPIOInput(uint32_t ui32port, uint8_t ui8pins) Função onde um pino da GPIO do microcontrolador é configurado como entrada GPIOPadConfigSet(uint32_t ui32port, uint8_t ui8pins, uint32_t ui32strength, uint32_t ui32pintype) Função que configura as portas de entrada, onde o parâmetro ui32strength representa a corrente máxima a ser permitida pelo pino e o parâmetro ui32pintype configura se o pino terá Pull-Up, Pull-down ou Coletor Aberto 32
Exemplo de configuração de GPIO com o TivaWare //Configuração 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 os pinos PF1, PF2 e PF3 como saída (LED RGB da Launchpad), e os pinos PF0 e PF4 como entrada (dois botões da Launchpad). Além disso, nos pinos PF0 e PF4, permitem uma corrente de até 2 ma de entrada e configurados com pull-up Fonte: Introdução aos microcontroladores ARM Cortex-M4 Tiva C Series da Texas Instruments, Stéfano Andrade de Souza, Março de 2015 33
Exemplo de configuração de GPIO sem o TivaWare /* Enable the clock on PORTF */ SYSCTL_RCGC2_R = 0x00000020; delay = SYSCTL_RCGC2_R; // 1) F clock // delay - ensure clock /* configure other registers */ GPIO_PORTF_LOCK_R = 0x4C4F434B; // 2) unlock PortF PF0 GPIO_PORTF_CR_R = 0x1F; // allow changes to PF4-0 GPIO_PORTF_AMSEL_R = 0x00; // 3) disable analog function GPIO_PORTF_PCTL_R = 0x00000000; // 4) GPIO clear bit PCTL GPIO_PORTF_DIR_R = 0x0E; // 5) PF4,PF0 input, PF3,PF2,PF1 output GPIO_PORTF_AFSEL_R = 0x00; // 6) no alternate function GPIO_PORTF_PUR_R = 0x11; // enable pullup resistors on PF4,PF0 GPIO_PORTF_DEN_R = 0x1F; // 7) enable digital pins PF4-PF0 Fonte: Introdução aos microcontroladores ARM Cortex-M4 Tiva C Series da Texas Instruments, Stéfano Andrade de Souza, Março de 2015 34
Funções de escrita e leitura em GPIO GPIOPinRead(uint32_t ui32port, uint8_t ui8pins) Função que retorna se o pino selecionado está em nível lógico alto ( 1 ) ou baixo ( 0 ). Esta função retorna o valor do pino referente a sua posição no byte do PORT verificado. Por exemplo: PIN0 ativo = 00000001, PIN1 ativo = 00000010, seguindo até PIN7 ativo 10000000 GPIOPinWrite(uint32_t ui32port, uint8_t ui8pins, uint8_t ui8val) Função que envia nível lógico alto ( 1 ) ou nível lógico baixo ( 0 ) para o pino do PORT. 35
Exemplo de utilização das funções de entrada e saída de GPIO //Retorna o endereço, ou valor, do PIN_4 do PORTF caso 1. GPIOPinRead(GPIO_PORTF_BASE, GPIO_PIN_4); //Aciona somente o PIN_2 do PORTF GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_1 GPIO_PIN_2 GPIO_PIN_3,GPIO_P IN_2); 36
Definição da posição de bits //*************************************************************** // // 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
Referências Main page: www.ti.com/launchpad Tiva C Series TM4C123G LaunchPad: http://www.ti.com/tool/ek-tm4c123gxl TM4C123GH6PM folder: http://www.ti.com/product/tm4c123gh6pm LaunchPad Wiki: www.ti.com/launchpadwiki Valvano, Jonathan. Embedded Systems (Introduction to Arm\xae Cortex\u2122-M Microcontrollers) (p. 260). Jonathan Valvano. E Microcontroladores ARM7 (Philips - Família LPC213x) : O poder dos 32 Bits - teoria e prática / Daniel Rodrigues de Sousa Microcontroladores ARMTM CortexTM-M3 (família LPC175x/6x da NXP) : Programação em linguagem C / Alberto Noboru Miyadaira Introdução aos microcontroladores ARM Cortex-M4 Tiva C Series da Texas Instruments, Stéfano Andrade de Souza, Março de 2015 38