Você está na página 1de 17

Seção 25: Atualizando o arquivo de cabeçalho específico do MCU com o domínio do barramento e

detalhes do periférico

****

93. Escrevendo macros C do endereço base para as memórias incorporadas do MCU: Parte 1

Agora, a primeira coisa que faremos é definir os endereços base do flash e da memória SRAM.

Isso significa que as memórias embutidas do microcontrolador.

Vamos definir os endereços básicos dessas memórias.

Agora podemos você C macros.

Me deixe escrever. #define FLASH_BASEADDR e deixe-me também criar #define O endereço base
SRAM1_BASEADDR e SRAM2 não é realmente necessário para nosso aplicativo, porque não o
usaremos.

No futuro, se precisarmos, podemos adicioná-lo. Caso contrário, não precisa adicionar, e a RAM
principal é na verdade a SRAM1.

É por isso que a SRAM é, na verdade, o endereço base SRAM1. O SRAM1 é chamado como SRAM
principal, que simplesmente chamamos de SRAM. Agora, qual é o endereço base do flash?

Você já sabe disso, 0x08000000 e qual é o endereço base da SRAM1, que é a nossa principal RAM
nesse microcontrolador ??

A RAM começa a partir de 0x20000000, certo? Então, é sobre os endereços base do flash e da
memória SRAM. Lembre-se que, por padrão, esses números são considerados números senoidais,
certo?
Portanto, o compilador tratará, por padrão, cada número como inteiros assinados. Mas os endereços
não podem ser assinados, certo?

Assim, endereços sempre valores não assinados.

Então, é por isso que para informar ao compilador que estes valores não são assinados, você pode
fazer um typecast para uint32_t, ou o que você pode fazer é, em vez de fazer isso, você pode
simplesmente escrever 'U' aqui, então 'U' significa unsign inteiro.

Isso é para denotar inteiros sem sinal. Na verdade, estamos mencionando 'U', estamos indicando ao
compilador que esse valor não está assinado, mas não assinado.

Você pode apenas mencioná-lo como 'U'. E eu também lhe darei uma pequena tarefa ou exercício
para adicionar o endereço base da SRAM2, bem como o endereço base da memória do sistema, que é
a ROM. Então, você pode adicionar essas informações também.

Esta informação pode ser obtida do próprio manual de referência. Você pode ir para a memória e
organização da memória ou pode ir para a interface de memória flash incorporada e aqui você terá
essa informação, isto é, a memória flash começa de 0x 0800 e esta é na verdade a memória flash,
memória principal significa memória flash e a memória do sistema, na verdade, é iniciada a partir
dessa base.
Esta é a área de ROM, lembre-se que, que é de 30KB e área OTP você também pode mencionar o
endereço base da área OTP e outros detalhes.

E você pode obter os detalhes da SRAM na memória e na arquitetura de barramento, assim você
pode apenas procurar por SRAM2.

Isso é chamado de SRAM2 interna auxiliar, que é de 16 KB, a qual segue após SRAM1, cujo tamanho é
de 112 KB.

Assim, você pode calcular o endereço base do SRAM2 e atualizar neste arquivo de cabeçalho, se
precisar dele.

Então, eu espero que você faça isso e eu vou te ver na próxima palestra.
94. Escrevendo macros C do endereço base para as memórias incorporadas do MCU: Parte 2

O endereço base do SRAM2. Então, como você calcula isso?

Na verdade nós temos SRAM1 de 112 KB. Portanto, após 112 KB desse endereço, a SRAM2 é exibida.

Então, é por isso que podemos calcular o endereço base do SRAM2 como algo assim.

Então, temos 112 KB de SRAM1, esses detalhes que você pode obter da seção de arquitetura de
memória e barramento.

A SRAM1 interna principal é de 112 KB, o que significa. 112 x 1024. Esses muitos bytes. Certo?

E se eu converter isso em hexadecimal, então este é o valor 1 C000. Então, posso dizer que um
endereço base do SRAM2 é 1C00.
E daqui em diante SRAM2 começa e o endereço base da ROM é, isto você pode obter do manual de
referência novamente,

v
você tem que ir para a interface de memória flash embutida e lá você obterá esta tabela e aqui está a
memória do sistema, esta é a ROM na verdade, então, isso você pode simplesmente copiar.

Portanto, lembre-se também que sempre que você criar macros C, é sempre bom explicar essa
macro.
Então, é por isso que vamos criar uma pequena área de explicação aqui. Então, você pode
simplesmente criar uma seção de comentários aqui.

E explique esta macro brevemente aqui.

Então, eu não vou fazer isso.

Então, espero que você faça isso quando estiver documentando o código.

Porque a documentação é muito importante, lembre-se. Então, não deixe apenas algo assim.

Claro, essa linha pode intuitivamente você pode adivinhar que sim, é o endereço base do flash, mas é
bom se você documentar cada macro.

Então, a documentação é realmente importante.

Depois disso, o que podemos fazer é, podemos dar um passo à frente e podemos criar as macros para
vários domínios de barramento, como AHBx e APBx.

95. Definindo endereços base de diferentes domínios de barramento

Nesta aula vamos definir os endereços base de vários domínios de barramento presentes em nosso
microcontrolador como o AHB e o APB.

Estes são os diferentes domínios de barramento do microcontrolador STM32F4x e sobre os domínios


de barramento e sobre os endereços de base que discutimos na parte anterior do curso quando
estávamos discutindo sobre as interfaces de barramento MCU.
A base periférica é dividida em quatro seções, digamos assim, base periférica APB1, base periférica
APB2, base periférica AHB1 e base periférica AHB2. E temos que mencionar os endereços dessas
bases periféricas.

Diferentes periféricos estão pendurados em diferentes barramentos.

Assim, o barramento AHB é usado para os periféricos que precisam de comunicação de dados de alta
velocidade, interfaces de câmera de exemplo, GPIOs, etc.

O barramento APB é usado para os periféricos para os quais a comunicação em baixa velocidade seria
suficiente.

Vamos considerar o mapa de memória do microcontrolador.

Começa de 0 a FFFF_FFFF. E a base periférica começa nesse endereço. 0x4000_0000

Então, daqui em diante, os endereços de registro periféricos começam. Tudo certo.

Agora não vamos avançar. Pause por um momento e descubra 0x4000_0000 é o endereço de qual
registro de qual periférico.

Você pode identificar isso usando o manual de referência do microcontrolador? Então, você tem que
dizer o nome do registro. Assim, podemos descobrir a resposta, consultando o manual de referência.
No manual de referência, eu iria para a arquitetura de memória e barramento e aqui vai para o mapa
de memória e aqui você pode obter uma tabela e esta tabela você tem que navegar. 4000.?
Vamos procurar 0x4000 que está aqui e vamos procurar por 000 e está bem aqui.

Sabemos que, em 0x4000 0000, o primeiro periférico que conseguimos é, TIMER2, correto ??

Então, o TIM2 é o primeiro periférico que aparece na base periférica.

E depois disso, você tem que ir para o periférico do TIM2 para descobrir qual é o registro.

Então, vamos para o periférico do TIM2.


Que está aqui, 18 timers de uso geral (TIM2 a TIM5) Tudo bem. Depois disso, vá para registros.

Apenas expanda isso. E depois disso, navegue aqui e vá para registrar o mapa aqui e aqui novamente,
podemos ver que no offset 0 você obtém o registro de controle do TIM2 1. Então, o offset é
basicamente do endereço base daquele periférico.

Então, chegamos a saber que 0x4000 0000 é o endereço base do periférico TIM2 e, a partir desse
endereço, adicionando esses deslocamentos, você pode obter o endereço de registro em 00.

Você encontrará o registrador CR1 do TIM2 que é o registrador de controle 1 e, no 04, você obterá o
registrador de controle 2 do TIM2 assim. Tudo certo.

Agora a resposta para esta pergunta é, neste local, encontramos o registro CR1 do TIM2. Então, isso
pode não ser verdade em outro microcontrolador, você tem que realmente verificar o manual de
referência, a fim de entender o que exatamente o periférico vem lá.

Agora vamos seguir em frente.

Tudo bem, agora vamos recapitular rapidamente nosso domínio periférico diferente e os endereços
base.

Esta figura mostra o endereço base periférico de diferentes domínios de barramento presentes neste
microcontrolador.
A base periférica começa daqui e que também passa a ser a base periférica do periférico APB1.

E a partir deste endereço você encontrará os registros dos periféricos que estão pendurados no início
do ônibus APB2.

Este é o endereço base da base periférica APB2 e este é o endereço base do periférico AHB1.

Isso significa que a partir deste endereço, os registros dos periféricos que estão pendurados no
barramento AHB1 serão iniciados.

E a partir deste endereço, os registros dos periféricos do barramento AHB2 serão iniciados. Então é
assim.

Você precisa documentar todos esses endereços básicos no arquivo de cabeçalho específico do seu
dispositivo.

Tudo certo!! Agora vamos voltar ao nosso arquivo de cabeçalho específico do MCU.

E aqui vamos definir todos esses valores.

Primeiro de tudo, vamos definir a base periférica.


Esta é uma base periférica.

E qual será a base periférica do APB1? Base periférica APB1 não é nada, mas a base periférica.

É por isso que usei essa macro. E depois disso, o APB2 para base periférica e endereços base
periféricos APB2, AHB1 e AHB2 serão essas coisas.

Vamos incluí-los.

Eu acabei de incluir todos esses valores aqui.

Então, isso completa a definição de endereços base de diferentes domínios de barramento do


microcontrolador.

96. Definindo endereços base de Periféricos AHB1


Então, na palestra anterior, você terminou de definir os endereços básicos de vários domínios de
barramento.

Vamos dar um passo adiante e vamos definir os endereços básicos dos periféricos AHB1, APB1 e
APB2.

Agora vamos definir os endereços base de todos os periféricos necessários que estão pendurados em
diferentes domínios de barramento. Por exemplo, no nosso caso, estamos usando GPIOs.

Estamos desenvolvendo drivers para GPIOs.

Esse driver deve ser aplicável a todas as portas GPIO que estão presentes no microcontrolador.

Então, de GPIOA para GPIOI.

E também estaremos desenvolvendo drivers para periféricos I2C.

Existem 3 periféricos I2C que estão neste microcontrolador, I2C1, I2C2 e I2C3, eles estão realmente
pendurados no barramento APB1.

E também temos que desenvolver driver para periféricos SPI, certo? SPI.

Existem 3 periféricos SPI nos quais o SPI2 e o SPI3 estão realmente pendurados no barramento APB1
e o SPI1 está no barramento APB2. E também temos que desenvolver driver para periféricos UART.

Existem cerca de 6 periféricos USART e alguns deles estão pendurados no barramento APB1 e alguns
deles estão pendurados no barramento APB2.

Também estaremos lidando com interrupções, então, é por isso que temos que usar este periférico
que é EXTI, que significa External Interrupt Controller. E também há mais um periférico chamado
periférico de configuração do sistema e que também estaremos utilizando neste curso.

Agora, o que faremos é, em nosso arquivo de cabeçalho específico do MCU, vamos definir o endereço
base para cada periférico que vamos usar neste curso.

Então, agora primeiro vamos definir os endereços base dos periféricos que estão pendurados no
barramento AHB1.
O primeiro periférico que vou pegar é o GPIOA. Então, defina GPIOA_BASEADDR.

Como calcular o endereço base do GPIOA? Sabemos que está pendurado no barramento AHB1.

Temos que tomar isso como base e você tem que adicionar o offset.

Então, qual é o deslocamento? Então, offset você pode obter no manual de referência.

Então, se formos ao mapa da memória e procurarmos o GPIOA.


Portanto, o deslocamento é 0000, porque o GPIOA é o primeiro periférico que aparece no
barramento AHB1. Então, o deslocamento é 0x0000.

E depois disso GPIOB, então, o GPIOB está bem aqui e o offset é o 0400.

Vamos mudar isso 0x0400. E assim, completo para todas as portas GPIO suportadas no seu
microcontrolador e eu vejo vocês na próxima palestra.

97. Definindo a conclusão dos endereços base

Então, acabei de concluir essas macros do endereço base do GPIOA para o endereço base do GPIOI.
Então, espero que você tenha concluído isso.

E agora vamos passar para a definição dos endereços de base dos periféricos.

Desculpe, aqui está faltando o suporte. Agora, endereços base de periféricos que estão pendurados
no barramento APB1. E quais são os periféricos que estão pendurados no barramento APB1?

Então, atualmente estamos interessados ​ ​ apenas nesses periféricos.

Vamos definir os endereços base para eles.

Deixe-me primeiro escrever #define

Deixe-me primeiro começar a partir do I2C.

Vamos fazer isso em ordem alfabética.


Endereço base I2C1 que não é nada além do endereço base do APB1. daqui, mais você tem que
adicionar o deslocamento.

Então, novamente vamos pegar o offset aqui e isso é 5400 e vamos adicionar 5400. Completo para
todos os outros periféricos que estão pendurados no barramento APB1.

E no que diz respeito ao APB2, vamos começar pelo EXTI.


Então, deixe-me ir aqui e vamos # definir EXTI_ BASEADDR. Então, o que é do APB2, né ?? endereço
base mais então, vamos procurar do mapa de memória e aqui está, 3C00. Vamos adicionar 3C00.

Então, eu fiz por apenas um periférico, portanto, completo para outros periféricos. Tudo bem! Então,
eu terminei para EXTI, então, você tem que fazer por todos esses periféricos.
Então, eu espero que você faça isso e eu te vejo na próxima palestra.

Resposta no video num. 98

Você também pode gostar