Mostrando postagens com marcador STM32F05xx. Mostrar todas as postagens
Mostrando postagens com marcador STM32F05xx. Mostrar todas as postagens

terça-feira, 3 de novembro de 2015

Antes do primeiro programa para a placa STM32F0Discovery

Antes de começarmos a programar o microcontrolador existente na placa STM32F0Dicovery, vamos entender alguns pontos da arquitetura de seu processador. Este implementa a arquitetura ARMv6-M que, por sua vez, implementa o conjunto de instruções ARMv6-M Thumb® . Com o intuito de poder ter seu processador disponível tanto para tecnologias ASIC quanto em dispositivos FPGA, a ARM emprestou o conjunto de instruções Thumb já existente arquitetura ARMv6 desenvolvendo uma nova arquitetura baseada no tratamento de exceções e de depuração da arquitetura ARMv7-M: a ARMv6-M, a qual equipa os processadores Cortex-M0 para ASIC e Cortex-M1 para FPGA.


O conjunto de instruções Thumb é um subconjunto de 16 bits do conjunto total de instruções de 32 bits da ARM. Cada instrução Thumb, além de trabalhar com o mesmo conjunto de registradores, possui uma correspondente de 32 bits que produz o mesmo efeito. Sendo de 16 bits, permite adensamento de código economizando espaço de memória flash e economia de energia, desejável em sistemas embarcados como, no caso, microcontroladores.

Sigamos então.

Estamos acostumados na programação de microcontroladores que, ao iniciar, a CPU executa a partir da posição zero de memória. No caso dos processadores ARM Cortex, o endereço zero de memória (mapeado na memória flash e remapeado no endereço 0x080000000 no processador STM32F051R8T6 presente na placa STM32F0Discovery) aponta para o chamado Vector Table que pode ser visto na figura abaixo:


Essa tabela começa, na posição 0x00000000, com o endereço inicial da pilha ou stack. Para esse processador, a pilha é descendente e o ponteiro para a pilha aponta para o último valor empilhado. Quando o processador é energizado, não há nada empilhado ainda, portanto a posição zero do Vector Table deve apontar para a última posição da memória RAM + 1. Novamente, no caso do processador STM32F051R8T6, que equipa a placa STM32F0Discovery, o endereço inicial da pilha deve ser 0x20002000. Quando for necessário guardar um valor na pilha, o processador subtrai 4 do ponteiro de pilha e armazena 4 bytes (ou 32 bits) na posição calculada. Na primeira vez que isso ocorrer, o processador obtém 0x20001ffc como novo ponteiro de pilha e armazena nas posições 0x20001ffc a 0x20001fff os 4 bytes.

Os processadores ARM Cortex podem organizar o acesso aos endereços na memória de duas formas: byte-invariant big-endian ou little-endian. Para o primeiro, os endereços são armazenados em registradores em ordem direta, do byte mais significativo ao menos significativo como na figura abaixo:

Byte-invariant big-endian
Já para o segundo, a ordem é inversa: do byte menos significativo para o mais significativo.
Little-endian
O microcontrolador STM32F051R8T6 gerencia todo o acesso em memória como little-endian. Se dermos uma olhada na memória do processador mostrada no post anterior, teremos:



Onde o endereço 0x20002000 armazenado na posição de memória 0x00000000 (ou 0x08000000 remapeada) como valor inicial do ponteiro de pilha é, na verdade, armazenado na sequência 0x00, 0x20, 0x00, 0x20.

Seguindo com o Vector Table, a partir da primeira entrada (ponteiro inicial da pilha), ele possui uma entrada para o endereço inicial de execução de cada uma das funções de exceção do microcontrolador. Por se tratar de um processador de 32 bits, cada entrada tem essa dimensão. Para indicar que o código presente nas funções de exceção são de 16 bits (código Thumb) o bit menos significativo de cada vetor deve ser um.

A primeira função de exceção, ou a de número um, é a função de RESET a qual é acionada sempre que o microcontrolador é reiniciado. Na prática, este é o endereço da primeira instrução de usuário a ser executada quando o microcontrolador inicia. Novamente no exemplo acima, temos o endereço 0x08000008 como endereço da função de tratamento do RESET. Como o bit menos significativo está ligado (0x08000009) essa função possui código Thumb.

No próximo post, faremos nosso primeiro programa para a placa STM32F0Discovery.

REFERÊNCIAS
"Cortex-M0 Devices Generic User Guide", ARM
"The Definitive Guide to the ARM Cortex-M0",Joseph Yiu
"The Thumb instruction set"- http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0210c/CACBCAAE.html
"PM0215 - STM32F0xxx Cortex-M0 programming manual" - STMicroelectronics

sexta-feira, 30 de outubro de 2015

Começando pela placa STM32F0Discovery

A STMicroeletronics possui uma série de microcontroladores baseados nos processadores ARM Cortex. Possui também disponível algumas placas de desenvolvimento de fácil utilização. Comecemos com a placa STM32F0Discovery baseada no microcontrolador STM32F051R8T6 possuindo 64 KB de memória Flash e 8 KB de memória RAM .
STM32F0discovery
Como recursos, ela possui um botão de RESET, dois LEDs e um botão para uso do usuário, interface ST-LINK/V2 para debug e programação do microcontrolador alem de dezenas de pinos de entrada e saída do microcontrolador diretamente acessíveis por terminais externos da placa. O manual de usuário da placa STM32F0Discovery está disponível aqui. Caso o link não retorne o manual, basta procurar pelo documento UM1525 da STMicroelectronics.

Ao conectar a placa via cabo USB ao computador, a mesma será reconhecida automaticamente pelo WINDOWS, como mostrado na figura abaixo.

Placa STM32F0Discovery conectada

O microcontrolador é acessível pela interface ST-LINK/V2 através dessa conexão USB. Para programar, depurar ou mesmo visualizar registradores e áreas de memória do microcontrolador, é necessário o software STM32 ST-LINK utility. Ele pode ser encontrado aqui ou, caso seja necessário, procure por STSW-LINK004. Só há as versão para MS-WINDOWS. Sua instalação é simples e ele pode ser visto na figura seguinte.

Utilitário STM32 ST-LINK
Ao se clicar no botão , o utilitário se comunica com o microcontrolador e traz suas informações além da imagem do conteúdo da memória flash.

Conectado ao microcontrolador
Podemos ver que o microcontrolador é da família STM32F0 (ARM Cortex M0) e possui 64 KBytes de memória flash.
Algumas informações do microcontrolador
A interface ST-LINK/V2 embarcada na placa suporta apenas comunicação bidirecional a dois fios SWD (Serial Wire Debug) para microcontroladores da família STM32. A frequência é de 1,8 MHz e isso pode ser comprovado nas informações de configuração padrão do utilitário STM32 ST-LINK mostradas abaixo:


Alguns recursos e estados do microcontrolador alem da memória flash podem ser observados na tela MCU Core onde temos registradores e estado do microcontrolador. Esse painel possui ainda botões de comandos que usaremos mais adiante.


Finalmente, vamos às documentações obrigatórias para se trabalhar com esse microcontrolador. O manual de usuário da placa já mostrado acima é o primeiro documento útil. Nele temos a disposição dos pinos, LEDs, botões, jumpers e suas funções. 
O próximo manual indicado é o datasheet desse microcontrolador que pode ser encontrado aqui. Da mesma forma, caso não esteja disponível, procurar por DM00039193. Junto com esse, o manual de referência desse microcontrolador é de uso obrigatório e pode ser encontrado aqui ou procurando por RM0091.
Primeira informação relevante que obtemos é o mapeamento de memória como visto na figura abaixo:
Mapeamento de memória do microcontrolador STM32F05xx 
Nota-se que a memória flash, que é a disponível para o programa residir, está mapeada na faixa de endereços 0x08000000 a 0x0800ffff no caso desse microcontrolador que possui 64 KBytes de memória flash. Também nota-se que a memória RAM está mapeada na faixa de 0x20000000 a 0x20001fff para esse microcontrolador (4 KBytes de RAM).
O espaço inicial de memória (0x0000000) possui um mapeamento dependente da configuração de boot. Algumas implementações do processador AMR Cortex M0 possuem um pequeno programa chamado boot-loader. Esse programa é preparado com a fabricação do microcontrolador e possui algumas funções dentre as quais a possibilidade de remapeamento de memória. No caso da placa STM32F0Discovery o pino BOOT0 vem de fábrica com valor zero o que, segundo o manual de referência no capítulo 2.5, a memória flash é remapeada como área de boot. Dessa forma, a memória flash é vista pelo microcontrolador tanto no endereço 0x08000000 original como no endereço 0x00000000. Isto pode ser comprovado pela figura abaixo onde observa-se o conteúdo do endereço 0x00000000 idêntico ao mostrado anteriormente no endereço 0x08000000.


Como curiosidade, segundo o documento AN2606 do fabricante, a versão do boot loader para esse microcontrolador está presente na posição de memória 0x1ffff7a6 e tem o valor 0x21 que representa versão 1 e com uso de 2 interfaces USART para a carga de programa.



REFERÊNCIAS:
"The Definitive Guide to the ARM Cortex-M0",Joseph Yiu
UM1525 - "User manual STM32F0DISCOVERY Discovery kit for STM32 F0 microcontrollers"
http://www.arm.com/products/system-ip/debug-trace/coresight-soc-components/serial-wire-debug.php
STM32F051xx microcontrollers datasheet
AN2606-Application note-"STM32 microcontroller system memory boot mode"