Escolar Documentos
Profissional Documentos
Cultura Documentos
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.
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?
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
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.
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.
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.
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.
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.
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 ??
E depois disso, você tem que ir para o periférico do TIM2 para descobrir qual é o registro.
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á.
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 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.
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.
Esse driver deve ser aplicável a todas as portas GPIO que estão presentes no microcontrolador.
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.
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.
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, 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.
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.