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.

 

Figura 1
Figura 1

 

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.

 

Figura 2
Figura 2

 

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.

 

 

Figura 3
Figura 3

 

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.

 

Figura 4
Figura 4

 

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.

 

 

Figura 5
Figura 5

 

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

 

Figura 6
Figura 6

 

 

Figura 7
Figura 7

 

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.

 

Figura 8
Figura 8

 

 

Figura 9
Figura 9

 

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.

 

Figura 10
Figura 10

 

 

Figura 11
Figura 11

 

 

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.

 

Figura 12
Figura 12

 

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.

 

Figura 13
Figura 13

 

 

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.

 

Figura 16
Figura 16

 

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.

 

 

Figura 17
Figura 17

 

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.

 

Figura 18
Figura 18

 

 

Figura 19
Figura 19

 

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.

 

Figura 20
Figura 20

 

 

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.

 

 

Figura 21
Figura 21

 

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.