A maior rede de estudos do Brasil

Grátis
256 pág.
Descobrindo o STM32

Pré-visualização | Página 7 de 47

sub-sistema periférico é supor-
tado pelo barramento AHB, que é dividido em dois sub-barramentos AHB1 e
AHB2. O STM32 fornece um controlador sofisticado de acesso direto à me-
mória (DMA) que suporta a transferência direta de dados entre periféricos e
memória.
Revision: (None) ((None)) 35
CAPÍTULO 2. INTRODUÇÃO AO STM32 F1
DMA
Cortex-M3
B
u
s
M
at
ri
x
Flash
Memory
ICode
DCode
System
DMA
SRAM
Bridge 1
Bridge 2
AHB Bus
ADC1
AFIO
GPIOx
SPI1
TIM1
TIM15
TIM16
TIM17
USART1
APB2
BKP
CEC
DAC
I2C1
I2C2
SPI2
TIM2
TIM3
TIM4
TIM6
TIM7
USART2
USART3
WWDG
APB1
Figura 2.3: STM32 Arquitetura de Barramento Medium Density Value-Line
2.1 O Cortex-M3
O processador CM3 implementa o conjunto de instruções Thumb-2
que fornece um grande conjunto de instruções de 16 bits, permitindo acesso
a 2 instruções por acesso a memória, junto com um pequeno conjunto de
instruções de 32 bits para apoiar as operações mais complexas. Os detalhes
específicos deste conjunto de instruções são em grande parte irrelevantes para
este livro porque nós estaremos realizando toda a nossa programação em C.
No entanto, existem algumas ideias-chave que discutiremos a seguir.
Tal como acontece com todos os processadores RISC, o Cortex-M3 é
uma arquitetura de load/store (carrega/armazena) com três tipos básicos de
instruções –- operações registrador-para-registrador para processamento de
dados, operações de memória que move dados entre a memória e os regis-
tradores, e as operações de controle de fluxo permitindo o controle do fluxo
das linguagens de programação, tais como os comandos if, while e a chama-
das de procedimentos. Por exemplo, suponha que nós definimos o seguinte
procedimento em C bastante trivial:
36 Revision: (None) ((None))
2.1. O CORTEX-M3
int counter;
int counterInc(void){
return counter++;
}
O código em linguagem Assembly resultante (anotado) e o código de
máquina correspondente é mostrado a seguir:
counterInc:
0: f240 0300 movw r3, #:lower16:counter // r3 = &counter
4: f2c0 0300 movt r3, #:upper16:counter
8: 6818 ldr r0, [r3, #0] // r0 = *r3
a: 1c42 adds r2, r0, #1 // r2 = r0 + 1
c: 601a str r2, [r3, #0] // *r3 = r2
e: 4740 bx lr // return r0
Duas instruções de 32 bits (movw, movt) são usadas para carregar as
metades superiores/inferiores do endereço do counter (contador) (conhecido
em tempo de linkedição, e, portanto, 0 na listagem de código). Em seguida,
três instruções de 16 bits de carga (ldr) do valor do contador, incrementa
(adiciona) o valor, e escrever de volta (str) o valor atualizado. Finalmente, o
procedimento retorna o contador inicial.
Não se espera que o leitor deste livro entenda o conjunto de instruções
Cortex-M3, ou mesmo este exemplo em grande detalhe. Os pontos principais
são que o Cortex-M3 utiliza uma mistura de instruções de 32 bits e de 16 bits
(principalmente o último) e que o núcleo interage com memória exclusivamente
através de instruções de load/store (carga e armazenamento). Embora existam
instruções que fazem o load/store de grupos de registradores (em vários ciclos)
não existem instruções que operam diretamente sobre posições de memória.
O núcleo Cortex-M3 tem 16 registradores visíveis ao usuário (mostrados
na Figura 2.4) – todo o processamento ocorre nesses registradores. Três des-
tes registradores têm funções específicas, incluindo o contador de programa
(program counter)(PC), que guarda o endereço da próxima instrução a ser
executada, o registrador de link (link register)(LR), que guarda o endereço
a partir do qual o procedimento atual foi chamado, e “o” ponteiro da pilha
(stack pointer) (SP), que guarda o endereço do topo da pilha atual (como ve-
remos no Capítulo 11, o CM3 suporta múltiplos modos de execução, cada um
com seu próprio stack pointer privado). Mostrado separadamente temos um
registrador de status do processador (processor status register) (PSR), que é
implicitamente acessado por muitas instruções.
Revision: (None) ((None)) 37
CAPÍTULO 2. INTRODUÇÃO AO STM32 F1
r0
r1
r2
r3
r4
r5
r6
r7
r8
r9
r10
r11
r12
r13 (SP) PSP MSP
r14 (LR)
r15 (PC)
PSR
Figura 2.4: Conjunto de Registradores do Processador
O Cortex-M3, como outros processadores ARM foi projetado para ser
programado (quase) totalmente em uma linguagem de alto nível, como C. Uma
consequência disso é um bem desenvolvido “padrão chamada de procedimen-
tos” (“procedure call standard”) (geralmente chamada de ABI ou Application
Binary Interface) que dita como os registradores são usados. [2] Este modelo
assume explicitamente que a memória RAM para executar um programa é
dividida em três regiões, tal como mostrado na Figura 2.5. Os dados na RAM
são alocados durante o processo de linkedição e inicializados pelo código de
inicialização no reset (veja o Capítulo 3). O Heap (opcional) é gerenciado
em tempo de execução pela biblioteca de código que implementa as funções
como malloc e free que fazem parte da biblioteca C padrão. A stack (pilha)
é gerenciada em tempo de execução pelo código gerado pelo compilador que
gera stack frames por chamada a procedimentos contendo variáveis locais e
registradores salvos.
O Cortex-M3 possui um espaço de endereçamento “físico” de 232 by-
tes. O ARM Cortex-M3 Technical Reference Manual define como este espaço
de endereçamento deve ser utilizado. [1] Isso é mostrado (parcialmente) na
Figura 2.6. Como mencionado, a região de “Código” é acessada através dos
barramentos ICode (instruções) e DCode (dados constantes). As áreas de
SRAM e de Periféricos são acessadas através do barramento System. A po-
38 Revision: (None) ((None))
2.1. O CORTEX-M3
Data
Heap End
Main Stack
SP
RAM Start (low)
RAM End (high)
Heap Start
Figura 2.5: Modelo de Memória de Programa
pulação física destas regiões é dependente da implementação. Por exemplo,
os processadores STM32 têm memória flash 8K–1M com endereço base em
(0x08000000). 1 O processador STM32F100 na placa Discovery tem 8K de
SRAM com endereço base em 0x20000000. Não são mostrados neste mapa
de endereçamento os periféricos Cortex-M3 internos, como o NVIC, que está
localizado a partir do endereço 0xE000E000; estes são definidos no manual de
referência Cortex-M3. [1] Iremos discutir o NVIC mais adiante no Capítulo 11.
Como mencionado, o núcleo Cortex-M3 inclui um controlador de in-
terrupção vetorizado (NVIC) (veja o Capítulo 11 para maiores detalhes). O
NVIC é um dispositivo programável que fica entre o núcleo CM3 e o micro-
controlador. O Cortex-M3 usa um modelo de interrupção vetorizado priori-
zado – a tabela do vetor é definida para residir a partir de local de memória
0. As primeiras 16 entradas nesta tabela são definidas para todas as imple-
mentações Cortex-M3, enquanto o restante, até 240, são de específicas da
implementaçao; por exemplo, os dispositivos STM32F100 definem 60 vetores
adicionais. O NVIC suporta a redefinição dinâmica de prioridades com até
256 níveis de prioridade – o STM32 suporta apenas 16 níveis de prioridade.
Duas entradas na tabela de vetor são especialmente importantes: o endereço
0 contém o endereço do ponteiro de pilha inicial e o endereço 4 contém o
endereço do “reset handler” que será executado em tempo de inicialização.
O NVIC também fornece registradores chave para o controle do sis-
tema, incluindo o temporizador do sistema (System Timer) (SysTick) que
1Esta memória é “ajustada” (“aliased”) para 0x00000000 durante o boot.
Revision: (None) ((None)) 39
CAPÍTULO 2. INTRODUÇÃO AO STM32 F1
Code
0.5GB
0x00000000
0x1FFFFFFF
SRAM
0.5GB
0x20000000
0x3FFFFFFF
Peripheral
0.5GB
0x40000000
0x5FFFFFFF
0x60000000
0xFFFFFFFF
Figura 2.6: Espaço de Enderçamento da Memória do Cortex-M3
fornece uma interrupção normal de temporização. Fornecer um temporizador
integrado em toda a família Cortex-M3 tem a vantagem

Crie agora seu perfil grátis para visualizar sem restrições.