Na atualidade quase todo equipamento eletrônico possui microcontroladores ARM (Advanced RISC Machine) como, por exemplo, computadores, celulares, eletrodomésticos, equipamentos industriais de comunicação, medicina, indústria automotiva, etc. Quase todas as empresas fabricantes de microcontroladores produzem microcontroladores ARM como, por exemplo, Intel, Texas Instruments, NXP, ST, Atmel, Freescale, etc. Por este motivos, é muito importante conhecer e programar estes microcontroladores. Neste artigo veremos que eles são fáceis de programar e muito semelhantes aos microcontroladores de 8 bits.
Microcontroladores de 8, 16 e 32 bits são praticamente iguais no que se refere ao funcionamento. Sua principal diferença está na quantidade de informação que manejam, mas a forma de executar as instruções é praticamente similar.
Microcontroladores de 8, 16, 32 bits son prácticamente iguales en lo que se refiere a su funcionamiento. Su principal diferencia está en la cantidad de información que manejan, pero la forma de ejecutar instrucciones es prácticamente similar.
A maioria dos fabricantes de microcontroladores adotou os microcontroladores ARM como base para a fabricação de seus produtos. Veja na figura 1. Abaixo a lista de alguns fabricantes que produzem microcontroladores ARM ou estão licenciados para seu uso.
3Comp
Actel
Alcatel
Analog Device
AppliedMicro
Atmel
Broadcom
Cirrus Logic
Cypress
Ember
Energy Micro
Freescale
Fujitsu
Holtek
Hyundai
HP
IBM
Infineon
Intel
Lapis
LG
Lucent
Marwell
Microsemi
Microsoft
Milandr
NEC
Nitendo
Nokia
Nordic Semiconductor
Nuvoton
NXP
NVidia
OKI Semiconductor
Qualcomm
Sansung
Sharp
Silicon Laboratories
Socle Technology
SONiX
Spansion
ST Microelectronics
Sony
Texas Instrumental
Toshiba
Triad Semiconductor
VLSI Technology
Yamaha
Winbond
WIZnet
Zilog
ZiiLABS
Os microcontroladores ARM são de 32 bits e, por este motivo, a partir de agora neste artigo vamos nos referir a eles como microcontroladores de 32 bits. Existem 3 classificações para os microcontroladores ARM.
Cortex-M (microcontroller) – Podem ser usados em aplicações típicas de microcontroladores como geladeiras, lavadoras, controles remotos, etc.
Cortex-R (Real Time) – Podem ser usados em reprodutores MP3, controles de motores, robóticas, etc.
Cortex-A (Application) – Podem ser usados em equipamentos que exigem sistemas operacionais como celulares, tablets, computadores, etc.
MICROCONTROLADORES DE 8 E 32 BITS.
A figura 2 mostra a arquitetura básica para um microcontroladores de 8 bits e a figura 3 mostra a arquitetura básica de um microcontroladores ARM de 32 bits.
Sua principal diferenças está na largura dos barramentos. Num microcontroladores típico de 8 bits, o barramento de dados é de 8 bits e o barramento de endereçamento de 16 bits. No microcontroladores de 32 bits, tanto o barramento de endereços como de dados são de 32 bits.
O restante segue sendo igual, quer dizer, possui uma CPU (Unidade Central de Processamento) memória de programa, memória RAM e portas de entrada e saída. Também a forma de buscar instruções na memória de programa e executá-las segue sendo igual, se bem que os microcontroladores ARM, a nível de hardware, a busca e execução foi otimizada.
Nos processadores ARM (Figura 3) podemos observar a presença de uma ponte (Bridge) nos barramentos de dados e endereços. Isso se faz por que os microcontroladores ARM processam instruções a uma grande velocidade e os periféricos necessitam de uma velocidade mais baixa para funcionar. Assim, podemos notar que a memória de programa e a memória RAM estão conectadas diretamente ao processador e os periféricos através da ponte.
A figura 4 mostra as configurações comuns de memória de programa para microcontroladores de 8 e 32 bits. Nos microcontroladores de 8 bits é normal encontrar memórias de programa de 1 k, 2 k, 4 k, 8 k, 16 k e 32 k bytes. Nos microcontroladores de 32 bits é normal encontrar tamanhos de memória de programa de 128 k, 256 k e 512 k bytes.
A figura 5 mostra as configurações comuns de memória de dados para microcontroladores de 8 e 32 bits. Nos microcontroladores de 8 bits é normal encontrar memórias de dados (RAM) de 64, 128 e 256 bytes. Nos microcontroladores de 32 bits é normal encontrar tamanhos de 8 k, 16 k, 32 k e 64 k bytes.
A figura 6 mostra dados comuns em xexadecimal para microcontroladores de 8 bits e a figura 7 para microcontroladores de 32 bits. Nos microcontroladores de 8 bits é comum que os dados oscilem entre 0x00 e 0xFF ou entre 0x0000 e 0xFFFF. Em microcontroladores de 32 bits é comum que estes dados oscilem entre 0x0000000 e 0xFFFFFFFF. É uma questão de grandezas ou adaptação ao formado hexadecimal de 32 bits que consta de 4 bytes (Ox FF FF FF )
La Figura 6 muestra datos comunes en hexagecimal para microcontroladores de 8 bits y la Figura 7 para microcontroladores de 32 bits. En microcontroladores de 8 bits, es común que estos datos oscilen entre 0x00 y 0XFF o entre 0x0000 y 0xFFFF. En microcontroladores de 32 bits, es común que estos datos oscilen entre 0x00000000 y 0XFFFFFFFF. Es una cuestión de magnitudes y de adaptarse al formato hexadecimal de 32 bits que consta de 4 bytes (0x FF FF FF FF).
A figura 8 mostra dados de números inteiros comuns para microcontroladores de 8 bits e a figura 9 para microcontroladores de 32 bits. Nos microcontroladores de 8 bits é comum que estes dados oscilem entre 0 e 255 ou 0 e 65 535. Nos microcontroladores de 32 bits estes dados oscilam entre 0 e 4 294 967 295. Aqui também temos uma questão de magnitudes e de adaptação ao formado decimal de 32 bits que consta de 4 bytes.
A figura 10 ostra registros de configuração de entradas e saídas para microcontroladores de 8 bits e a figura 11 para microcontroladores de 32 bits. Nos microcontroladores de 8 bits estes registros são de 8 bits enquanto que nos microcontroladores de 32 bits são de 32 bits. Aqui também é uma questão de se adaptar e visualizar e ler os registros de 32 bits, em outras palavras comocar em prática.
A CPU
A figura 12 mostra a configuração básica da CPU para microcontroladores de 8 bits, onde é comum haver um acumulador, um ou vários registros auxiliares, um registro de indexação que normalmente é usado para indexar dados, principalmente para armazenar os endereços de retorno quando se chamam as sub-rotinas, um registro contador de programa (CP) e um registro de estado.
A figura 13 mostra a configuração básica da CPU para microcontroladores de 32 bits, normalmente formada por 16 registros de 32 bits, numerados de r0 até r15 e registros para o estado do programa em execução. Os registros r0 até r13 são usados para finalidades gerais, podendo ser acumuladores, registros para indexação ou direcionamento indireto, dados. O r13 é usado párea apontar a pilha (Stack Pointer). O registro r14 (Link register) é usado para armazenar o endereço de retorno quando se chamam as sub-rotinas. O registro r15 (Counter Program) é usado como contador de programa. Também possui registro de estado.
Memória
Nos microcontroladores de 8 bits, as memórias são mais fáceis de manusear devido a sua pequena magnitude. Nos microcontroladores de 32 bits, a memória está mapeada num espaço de 32 bits, ou seja, de 0x 00000000 até 0xFFFFFFFF. Na figura 14 podemos ver um mapa da memória de 32 bits dividido em 8 regiões de 0,5 GBytes (512 MBytes). Os microcontroladores ARM usam esta divisão para colocar a diferentes memórias e periféricos do microcontrolador. Assim, fica fácil colocar as regiões onde estão colocadas as memórias.
Na figura 15 podemos observar um mapa de memória para um microcontrolador de 32 bits ARM Cortex-M3, onde a parte mais baixa do mapa de memória é usado para o código (Code), seguindo a memória RAM interna, os periféricos, a memória RAM externa, dispositivos externos, barramentos de periféricos e uma área para uso do fabricante. Aqui também se trata de prática para visualizar e entender o mapa de memória dos microcontroladores de 32 bits.
ARQUITETURA.
A figura 16 mostra o diagrama de blocos de uma configuração básica de um microcontrolador de 8 bits. No diagrama podemos notar a CPU , a memória de programa, a memória RAM ou de dados, os periféricos ou entradas e saídas. Os periférico mais comuns em um microcontrolador de 8 bits são: as GPIO (General Purpose Input Output) ou entradas/saídas de uso geral, as interrupções, os timers, o watchdog, ADC ou conversores analógico para digital.
A figura 17 mostra o diagrama de blocos da configuração básica de um microcontrolador de 32 bits. Também possui: a CPU, memória de programa e de dados, periféricos ou entradas/saídas. Podemos notar que tem GPIO, interrupções, timers, watchdog, ADC ou conversor analógico para digital, interfaces I2C, SPI, UART, USB, CAN, Ethernet.
Na figura 17 podemos notar a existência de 2 barramentos chamados:
AHB ou barramento avançado de alto desempenho (Advanced High-performance Bus)
APB oo barramento avançado de periféricos (Advanced Peripheral Bus)
Como comentado anteriormente, são usados dois barramentos devido à velocidade de trabalho dos periféricos que são muito menores que a frequência de operação da CPU e das memórias. Por exemplo, enquanto a CPU e memórias podem estar trabalhando a uma frequência de 72 MHz, os periféricos podem trabalhar a 36 MHz. Em alguns microcontroladores ARM, o barramento APB é dividido em 2 barramentos (APB1 e APB2). Isto é feito porque alguns periféricos são mais lentos que outros.
Uma das propriedades dos microcontroladores ARM é que para cada periférico é necessário habilitar seu pulso de clock e sua tensão para que possam trabalhar. Por default todos os periféricos estão sem tensão para que o consumo de corrente do sistema seja o menor possível. A figura 18 mostra como o clock do sistema é habilitado para cada periférico por uma porta AND. Sem esta habilitação, as operações de leitura e gravação que se façam no periférico não têm nenhum efeito.
Agora já estamos com a capacidade de entender um diagrama de um microcontrolador ARM. A figura 19 mostra o diagrama de blocos de um controlador ARM Cortex-M3, especificamente o STM32F103xx fabricado pela ST. Podemos observar que a frequência máxima do barramento AHB é de 72 MHz. Os barramentos APB1 e APB2 podem trabalhar em frequências diferentes.
O barramento APB1 pode funcionar com uma frequência entre 24 e 36 MHz e nele estão conectados os seguintes periféricos:
TIM2
TIM3
TIM4
USART2
USART3
SPI2
I2C1
I2C2
CAN
USB
SRAM
WDG
O barramento APB2 pode funcionar com frequência entre 48 e 72 MHz e estão conectados os seguintes periféricos:
WAKEUP
GPIOA
GPIOB
GPIOC
GPIOD
GPIOE
TIM1
SPI1
USART1
ADC1
ADC2
Temperature Sensor.
A figura 20 mostra o diagrama esquemático do microcontrolador STM32F103C8T6. Podemos observar a relação entre os periféricos e os pinos.
PROGRAMA EXEMPLO
Está na hora de entender como podemos programar o microcontrolador. A maioria dos fabricantes de microcontroladores ARM fornecem ao usuários listas de funções para utilizar os periféricos (Library). Em muitos microcontroladores é necessário criar esta funções.
Em microcontroladores de 8 bits para gravar e uma porta é típico uma linha de código como:
P0 = contador;
Para ler uma porta, é típico uma linha de código como:
temperatura = P2;
Nos microcontroladores de 32 bits isto se faz por meio de funções que o próprio fabricante fornece para serem usadas pelo programados. Por exemplo, para gravar em uma porta se usa:
GPIO_WriteBit(GPIOA, GPIO_Pin_6, 1);
A linha anterior de código gravará um 1 lógico (nível alto) no pino 6 da porta A.
Para le ruma porta em um microcontrolador de 32 bits podemos usar uma linha de código como a seguinte:
pulsador = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0);
A linha de código anterior lê o pino 0 da porta B. Como podemos perceber é fácil usar estas funções para ler ou gravar nas portas. Dependendo do fabricante do microcontrolador, o nome destas funções pode variar, mas normalmente são similares.
O programa seguinte é um programna exemplo simples para acender e apagar um LED de forma intermitente.
int main()
{
Init_IO();
while(1)
{
GPIO_WriteBit(GPIOA, GPIO_Pin_6, 1);
delay_stm(1000);
GPIO_WriteBit(GPIOA, GPIO_Pin_6, 0);
delay_stm(1000);
}
}
A função Init_IO() se encarrega de habilitar e configurar a porta A e seus respectivos clocks. A função Delay_stm(1000) retarda o microcontrolador em 1 segundo. Esta função recebe um parâmetro em milisegundos. 1 000 = 1 segundo.
A seguir, um programa exemplo para acender e apagar o LED, quando o pulsador P1 conectado ao pino 0 da porta B é pressionado.
int main()
{
Init_IO();
while(1)
{
If ( GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == 0 )
{
GPIO_WriteBit(GPIOA, GPIO_Pin_6, 1);
delay_stm(1000);
GPIO_WriteBit(GPIOA, GPIO_Pin_6, 0);
delay_stm(1000);
}
}
}
Para editar o código para microcontroladors ARM existem muitas ferramentas como, por exemplo, LEIL, IAR, etc. A figura 21 mostra a interface de desenvolvimento do compilador KEIL.
Analisando o pouco que vimos até aqui, programar um microcontrolador de 8 bits e um de 32 bits é praticamente o mesmo. A diferença está na magnitude dos dados, sua velocidade de processamento que é muito maior, seu maior número de periféricos. Nos próximos artigos vamos programar os periféricos e fazer projetos úteis para nos iniciarmos na programação dos microcontroladores ARM de uma maneira simples e de fácil compreensão.