Uma pequena digressão ...
Na última lição, vimos por onde começar se você decidiu estudar os microcontroladores STM32: como configurar um IDE, como criar um projeto simples, como compilar um programa e como executar um programa para execução. Depois de admirar os LEDs piscando na placa Discovery)
Ao iniciar um novo artigo, planejei passar imediatamente para uma análise detalhada da lista de programas, o que fez nossos LEDs piscarem alternadamente, mas, quando comecei a escrever, percebi repentinamente que havia um grande número de perguntas sem uma resposta para a qual seria necessário continuar a considerar o programa. prematuramente. E por mim mesmo, identifiquei uma lista completa desses problemas :
- O que são operações bit a bit ? Como usá-los?
- O que são registros e como eles estão relacionados às operações de bits?
- Em que consistem os microcontroladores da série STM32F0xx, como é realizado o relógio e o que proporciona vida dentro do MK?
- Como ocorre a inicialização do MK , por que preciso de um arquivo de inicialização , o que a função SystemInit faz ? Explicação nos dedos.
- Em que consiste a biblioteca CMSIS ? Como navegar? O que pode ser aprendido com ele e como usá-lo?
É da consideração dessas questões que eu gostaria de continuar a história sobre a programação do STM32.
Lista de artigos:
- Introdução Estudo do STM32 ou Gerenciamento inteligente da luz
- Introdução STM32: Operações de Bit
- Introdução STM32: O que são registros? Como trabalhar com eles?
Operações lógicas básicas
Apenas começando a estudar microcontroladores, as palavras “registrar” e “operações de bits” pareciam misteriosamente misteriosas para mim e por um longo tempo eu não quis passar a esse tópico. Mas quando entendi mais ou menos o que era, percebi que estava em vão adiando o estudo de um tópico tão importante em uma caixa distante. As operações de bits são provavelmente as operações mais comuns em um microcontrolador, e saber como e por que elas podem ser usadas em nosso trabalho abrirá um enorme potencial para controlarmos tudo e tudo em nosso MK!
Todos nós, nas aulas de ciência da computação da escola, nos familiarizamos com o que é a tecnologia digital, por que é chamada dessa maneira e com que operações lógicas básicas existem.Todas as tecnologias digitais modernas são baseadas em matemática e circuitos lógicos binários.
Um microcontrolador sempre opera com apenas dois estados: “zero” - sem tensão, “um” - tensão. Vamos atualizar um pouco nosso conhecimento sobre operações lógicas básicas. eles formam a base de toda a tecnologia digital.
- Conjunção - é designado como "Lógico AND" ou "Multiplicação Lógica" . De fato, o resultado da execução dessa operação lógica de dois para as expressões A e B é semelhante à sua multiplicação. Ou seja, a expressão assumirá o valor "1" somente se A e B tiverem o valor "1". Em todos os outros casos, o valor será "0". Pode ser indicado por AND, &&, AND, &
- Disjunção - é designada como "Lógica OR" ou "Adição lógica" . O resultado da execução dessa operação lógica duas para as expressões A e B é semelhante à sua adição. Ou seja, a expressão assumirá o valor "1" se pelo menos uma das expressões A e B tiver o valor "1". Pode ser designado como OR, ||, OR, |.
- Inversão - é designado como "NÃO Lógico" ou "Negação" . O resultado da execução dessa operação lógica de dois para a expressão A é o oposto. Ou seja, a expressão assumirá o valor 1 se a expressão A for 0 e vice-versa. Pode ser designado como NÃO,!, NÃO, ~.
- Disjunção Estrita - Designada como "OU Exclusivo" ou "OU Exclusivo de Adição Lógica" . O resultado da execução desta operação lógica de dois para as expressões A e B assumirá o valor 1 se A e B tiverem valores diferentes. Pode ser designado como Excl. OU XOR, ^.
Operações de bit
As operações de bits são quase as mesmas que as operações lógicas, com a única diferença que se aplicam aos bits e aos números binários.
A propósito, para simplificar o estudo das operações de bits, usei o programa ASM Calculator de 32 bits do ManHunter . Usando este programa, você pode verificar os resultados das operações de bits, transferir números de um sistema numérico para outro. O programa possui uma interface intuitiva e, após conhecê-lo, tornou-se uma das principais ferramentas no meu trabalho com microcontroladores. Uma pequena explicação da interface do programa é dada na imagem abaixo:
Operação de bit "NOT" - "~"
Se o bit for "1", depois de executar a operação "NOT" será igual a "0" e vice-versa. A operação é realizada imediatamente em todos os bits do número binário. Por exemplo, inverta o número FF:
Operação de bit "AND" - "&"
Se os dois bits do bit forem iguais a "1", depois de executar a operação "AND", o resultado no bit será igual a "1", mas se pelo menos um dos bits for "0", o resultado será igual a "0". A operação também é realizada bit a bit. Por exemplo, "multiplique" dois números 0xFF0 e 0xF0F:
Como resultado, veremos que nas categorias em que havia unidades em ambos os números, o resultado foi unidades, em todos os outros casos - zeros.
Considere as opções para aplicação prática:
- Em uma situação em que precisamos redefinir um bit ou grupo de bits específico para zero, podemos usar uma máscara. Eu acho que será mais claro mostrar isso com um exemplo. Suponha que pegemos um número e 0xF8F e precisamos que o sétimo bit se torne zero em vez de unidade. Não tem problema, coloque uma máscara e desmarque a parte desejada. Multiplique os números e obtenha o resultado:
- Se precisarmos verificar um bit específico em um número para 0 ou 1 - também usaremos a máscara para multiplicar. Na máscara, definimos a parte que gostaríamos de verificar. Se o bit requerido for "0", o resultado do cálculo será "0", se "1", respectivamente, "1". Se quisermos descobrir se o sétimo bit é igual a um, criamos a máscara correspondente e multiplicamos nosso número pela máscara. Tudo é simples:
Se precisarmos verificar a paridade de um número (ou seja, a capacidade de um número ser divisível por dois), então verificamos o 1º bit da mesma maneira, se for "1", então o número é ímpar, se houver "0", o número é par. Tente você mesmo, para treinar e desenvolver habilidades, faça este teste.
A operação bit a bit "OR" - "|"
Se um ou ambos os pares de bits for "1", o resultado será "1"; caso contrário, se os dois bits forem iguais a "0", o resultado será "0". Ou seja, grosso modo, a adição de todas as unidades nos dígitos é realizada. Por exemplo, se adicionarmos dois números 0xF8F e 0x7F, obteremos o seguinte resultado:
Considere uma aplicação prática:
- Se precisarmos definir um bit específico em um número como 1 , também usaremos a máscara para realizar a adição. Por exemplo, para definir o 15º bit no número 0xFF0, você precisa executar uma operação de adição lógica e obteremos o resultado desejado:
Tente jogar com números diferentes por conta própria e assista aos resultados.
A operação EXCLUSIVE OR bit a bit é "^"
Se os bits no bit forem diferentes e diferentes, o resultado será "1", caso contrário, "0". Por exemplo, se fizermos os números XOR 0xF8F e 0x7F, veremos que, nos bits em que existem bits excelentes, o resultado é "1" e em locais onde os bits são iguais, seja "0" ou "1", ocorre "0" ", No final, obtemos o seguinte resultado:
Considere as opções para aplicação prática:
- Se precisarmos inverter qualquer bit em um número , podemos usar a máscara para fazer isso facilmente usando a operação XOR. Vamos fazer a inversão dos 6º e 7º dígitos no número 0xF8 usando a máscara 0xC0. Você pode ver o resultado na imagem:
- Existem situações em que é necessário comparar dois registros e determinar se são iguais ou não . Nesse caso, precisamos registrar valores nas operações XOR. Se o resultado for "0", os registros serão iguais, caso contrário, não serão iguais:
Operações de deslocamento de bits
Existem várias operações de bits interessantes e às vezes extremamente úteis, conhecidas como operações de deslocamento . Você pode mover as descargas para a direita e para a esquerda. Durante esta operação, todos os bits do número binário são alterados pelo número especificado de posições; nesse caso, se o deslocamento for para a esquerda , o bit mais significativo (o mais à esquerda) é perdido e “0” é gravado no menos significativo (o mais à direita). Com uma mudança lógica para a direita, ocorre a situação oposta - o bit de ordem inferior (o mais à direita) é perdido e “0” é gravado no bit de ordem superior. Além disso, gostaria de observar que, no caso de palavras de 32 bits, todos os 32 bits são deslocados como um todo. Considere a operação de turno em mais detalhes.
Mudança para a esquerda - "<<"
Você pode ver como a mudança ocorre na imagem abaixo. Eu acho que tudo é bastante óbvio:
Com um turno binário, você pode notar um recurso interessante. Um deslocamento de um dígito multiplica nosso número por 2. Se mudarmos nosso número x por n dígitos, obtemos x * (2 * n). Tente rastrear independentemente esse padrão por meio do nosso utilitário de contagem. =)
Mude para a direita - ">>"
O que resulta de uma mudança para a direita é claramente refletido na imagem:
Com um deslocamento binário para a direita, você pode notar que a situação é o oposto de um deslocamento para a esquerda - o número é dividido por 2 s em um turno de 1 dígito e depois por 2 * n, em que n é o número de bits pelos quais a mudança foi feita. Tente também brincar com os números, que obviamente são divididos em 2 completamente. E a questão do preenchimento - qual será o resultado se você dividir o número ímpar dessa maneira?
Nota importante . Se você alterar uma variável com um sinal negativo (assinado), as posições desocupadas serão preenchidas com essas.
Em conclusão ...
Para muitos iniciantes, esse tópico pode parecer muito chato e pode não estar claro onde e como aplicar esse conhecimento. Eu me apresso a tranquilizá-lo, em situações em que você precisa elevar um ou outro pé do MK ou gravar um parâmetro em um encadeamento em um bloco ou módulo periférico - lá, o conhecimento das operações de bit será necessário. Como o artigo acabou sendo bastante volumoso, transferiremos a consideração dos registros para a próxima lição. Bem, no futuro você pode usar este artigo como uma folha de dicas.
Como tarefa de casa, tente analisar o código do nosso programa no bloco while (1) {...} e entender como ligamos e desligamos nossos LEDs com operações bit a bit . Bem, na próxima lição , vou lhe contar como isso realmente acontece!
Lista de artigos:
- Introdução Estudo do STM32 ou Gerenciamento inteligente da luz
- Introdução STM32: Operações de Bit
- Introdução STM32: O que são registros? Como trabalhar com eles?