Índice:

Então, você carrega o carregador de boot STM32duino em seu "Blue Pill" E agora ?: 7 etapas
Então, você carrega o carregador de boot STM32duino em seu "Blue Pill" E agora ?: 7 etapas

Vídeo: Então, você carrega o carregador de boot STM32duino em seu "Blue Pill" E agora ?: 7 etapas

Vídeo: Então, você carrega o carregador de boot STM32duino em seu
Vídeo: Short Tutorial: How To Start Programming STM32 Arduino MCUs 2024, Julho
Anonim
Então, você carrega o gerenciador de inicialização STM32duino em seu
Então, você carrega o gerenciador de inicialização STM32duino em seu
Então, você carrega o gerenciador de inicialização STM32duino em seu
Então, você carrega o gerenciador de inicialização STM32duino em seu

Se você já leu minhas instruções explicando como carregar o bootloader STM32duino ou qualquer outra documentação semelhante, tente carregar o exemplo de código e … pode ser que nada aconteça.

O problema é que muitos, senão todos os exemplos de STM32 "Genérico" não funcionarão fora da caixa. Serão necessárias pequenas alterações para que funcione na sua placa STM32 "Blue Pill".

Selecionarei 4 exemplos de código para explicar o que precisa ser alterado e por quê. Os códigos são: "BlinkWithoutDelay", "Fading", "Dimmer" e "AnalogInSerial".

Nota: NÃO codifiquei nada. Acabei de emitir pequenas alterações nos códigos criados por:

David A. Mellis e posteriormente modificado por Tom Igoe, Marti Bolivar e alguns casos por Scott Fitzgerald

Tom Igoe e posteriormente modificado por Bryan Newbold

Portanto, prefiro manter os nomes dos autores mesmo nos códigos que modifico, mantendo o crédito de criação.

Etapa 1: Alfinetes e alfinetes … Por que o código não funciona?

Alfinetes e alfinetes … Por que o código não funciona?
Alfinetes e alfinetes … Por que o código não funciona?

Vamos dar uma olhada no pino STM32 "Blue Pill". Os pinos de nota são identificados como PA1 ou PC2 … algo assim.

Se você der uma olhada, por exemplo, no exemplo de código "BlinkWithoutDelay", o pin é declarado como "33" … Por quê?

Suspeito que seja porque o Sr. Marti Bolivar portou este código para a placa MAPLE.

Acho que não era sua intenção deixar código compatível com as placas "Blue Pill".

Os pinos das miniplacas Maple e Maple são declarados numéricos, como o Arduino, embora usem números como 33, 24 e alguns como este.

Eu disse que o código não estava funcionando? Meu erro. Compilar o código sem nenhum erro e fazer o upload corretamente para "Blue Pill", então, na minha opinião está funcionando, mas usando uma saída GPIO não esperamos. Pode nem estar disponível.

Portanto, poucas mudanças são necessárias no código para que ele funcione conforme o esperado.

Etapa 2: vamos "definir" alguns pinos…

Vamos
Vamos

É uma boa prática de código declarar recursos como variáveis de fácil identificação ou significado ou constantes. Isso permitirá que seu código seja mais fácil de entender e solucionar problemas.

Eu costumava declarar pinos do Arduino assim:

const int ledPin = 13;

…"

Se você gosta de mim, talvez esteja se perguntando: "Como posso declarar pinos com nomes como PC13 ???"

A resposta é: Use a instrução C "#define".

Portanto, de acordo com o desenho da pinagem, o PC13 é o pino que temos no LED "BluePill". Para usá-lo, eu declararia assim, logo após a definição das bibliotecas (# inclui …) e antes de qualquer coisa:

# define LedPin PC13

…"

Observe que NÃO há ";" terminação de linha, NOR "=" atribuição.

Compare os dois códigos. Um é o exemplo original carregado do IDE. Em segundo lugar, fiz alguns ajustes para trabalhar com "BluePill".

Eu recomendo fortemente declarar todos os pinos que você pretende usar no código. Mesmo aqueles que pretendem usar como entrada ADC (mais sobre isso mais tarde).

Isso tornará sua vida mais fácil.

Etapa 3: PinMode () … Como você usará seus pinos …

Antes de continuar, vamos entender a função PinMode ().

Como o Arduino, os pinos STM32 têm várias funções. A maneira mais simples de selecionar um ou outro é usando a instrução pinMode ().

O Arduino tem apenas 3 modos disponíveis, INPUT, OUTPUT ou INPUT_PULLUP.

O STM32, por outro lado, tem muitos sabores de pinMode (). Eles são:

SAÍDA - Saída digital básica: quando o pino está ALTO, a tensão é mantida em +3,3 V (Vcc) e quando está BAIXA, é puxada para baixo até o solo

OUTPUT_OPEN_DRAIN - No modo de dreno aberto, o pino indica “baixo” ao aceitar o fluxo de corrente para o solo e “alto” ao fornecer impedância aumentada

INPUT_ANALOG - Este é um modo especial para quando o pino for usado para leituras analógicas (não digitais). Permite que a conversão ADC seja realizada na tensão no pino

INPUT_PULLUP - O estado do pino neste modo é relatado da mesma forma que com INPUT, mas a tensão do pino é gentilmente “puxada para cima” para + 3,3v

INPUT_PULLDOWN - O estado do pino neste modo é relatado da mesma forma que com INPUT, mas a tensão do pino é suavemente “puxada para baixo” em direção a 0v

INPUT_FLOATING -Sinônimo para INPUT

PWM - Este é um modo especial para quando o pino for usado para a saída PWM (um caso especial de saída digital)

PWM_OPEN_DRAIN -Como PWM, exceto que em vez de ciclos alternados de BAIXO e ALTO, a tensão no pino consiste em ciclos alternados de BAIXO e flutuante (desconectado)

(observação: extraído de

Acabei de abrir este parêntese porque quando você começar a criar seu próprio código, tenha o cuidado de usar pinMode () correto para sua necessidade.

Etapa 4: AnalogWrite () Versus PwmWrite () … Saída analógica em 2 sabores

AnalogWrite () Versus PwmWrite ()… Saída Analógica em 2 Sabores
AnalogWrite () Versus PwmWrite ()… Saída Analógica em 2 Sabores
AnalogWrite () Versus PwmWrite ()… Saída Analógica em 2 Sabores
AnalogWrite () Versus PwmWrite ()… Saída Analógica em 2 Sabores

Antes de usar os pins GPIO "Blue Pill" é necessário declarar o seu comportamento, ou seja, como irá funcionar. Isso é exatamente o que a função pinMode () faz.

Portanto, vamos nos concentrar agora em como definir corretamente uma saída analógica. Pode ser declarado como modo OUTPUT ou modo PWM.

Da mesma forma, os valores analógicos podem ser atribuídos ao GPIO de 2 maneiras: analogWrite () ou pwmWrite (), MAS, analogWrite () só funcionará se pinMode () = OUTPUT. Por outro lado, pwmWrite () só funcionará se pinMode () = PWM.

Vamos pegar o PA0, por exemplo: é um candidato a saída analógica / pwm.

analogWrite (): declara desta forma:

….

# define ledPin PA0

pinMode (ledPin, OUTPUT);

analogWrite (ledPin, <número>);

……"

onde o número deve estar entre 0 e 255, como o Arduino. Na verdade, é compatível com versões anteriores do Arduino.

pwmWrite (): declara desta forma:

# define ledPin PA0

pinMode (ledPin, PWM);

pwmWrite (ledPin, <número.>);

…."

Onde o número deve estar entre 0 ~ 65535, uma resolução muito maior do que Arduino.

Nas imagens é possível comparar entre 2 códigos. Você também pode ver o código original.

Etapa 5: Comunicação serial STM32

STM32 Serial Communication
STM32 Serial Communication

Vamos ver como as interfaces USART estão organizadas no STM32. Sim, interfaces no plural…..

A "Blue Pill" possui 3 USART's (RX / TX 1 ~ 3), e, se você estiver usando um bootloader permite usar USB, ele não está conectado a nenhum deles.

Dependendo de estar usando ou não USB, você precisa declarar a porta serial de uma ou outra forma em seu código.

Caso 1: usando USB:

Desta forma, os esboços são baixados diretamente via USB. Não há necessidade de mover o jumper BOOT0 para 1 posição e de volta para 0.

Nesse caso, sempre que você declarar "Serial" sem índice, significa comunicação via USB.

Portanto, Serial1 significa TX / RX 1 (pinos PA9 e PA10); Serial2 significa TX / RX 2 (pinos PA2 e PA3) e Serial 3 significa TX / RX 3 (pinos PA10 e PA11).

É assim que estamos trabalhando. Apresentarei mudanças em exemplos para esta forma de codificação.

Outra coisa: "Serial USB" não precisa inicializar. Em outras palavras, "… Serial.begin (15200);" não é necessário.

É possível chamar qualquer função Serial (Serial.read (), Serial.write (), etc) sem qualquer inicialização.

Se por algum motivo ele estiver presente no código, o compilador irá ignorá-lo.

Caso 2: Usando TTL seria para adaptador USB:

Desta forma, o bootloader não suporta comunicação USB STM32 nativa, então você precisa de um adaptador USB para serial conectado a TX / RX 1 (pino PA9 e PA10) para fazer upload de esboços.

Neste caso, a qualquer momento "Serial" sem índice é código, significa TX / RX1 (porta usada para fazer upload do código). Assim por diante, Serial1 se refere a TX / RX 2 (pinos PA2 e PA3) e Serial2 se refere a TX / RX 3 (pinos PA10 e PA11). Nenhum Serial3 disponível.

Etapa 6: Passando um valor para o microcontrolador

Passando um valor para o microcontrolador
Passando um valor para o microcontrolador

O exemplo de dimmer é uma maneira simples de mostrar como passar um valor para o microcontrolador.

Ele deve passar um valor de 0 a 255 para controlar o brilho do LED.

NÃO funcionará como esperado no Blue Pill devido:

  1. Para usar a função pwmWrite (), pinMode () DEVE ser declarado como modo PWM.
  2. Você nunca obterá um número inteiro de 3 dígitos. A função Serial.read () captura apenas o conteúdo do buffer, que é um "BYTE". se você digitar "100" e pressionar "enter", apenas o último "0" será capturado do buffer. E seu valor será "48" (valor ASCII decimal para "0"). Se pretende emitir o valor "100", é necessário digitar "d". Então, é correto dizer que vai converter um valor decimal do símbolo ASCII em brilho do LED, certo ?? … Bem, uma espécie de …
  3. Problema, mapear valores diretamente da função Serial.read () é uma ação complicada. É quase certo obter valores inesperados. A melhor abordagem é o conteúdo do buffer de armazenamento em uma variável temporária e DO QUE mapeá-lo.

Como expliquei antes no item 2, o código que introduzo alterações permitirá inserir um símbolo ASCII e isso controlará o brilho do LED com base em seu valor decimal ASCII … por exemplo, "espaço" é o valor 32 (na verdade é o menor caractere imprimível que você pode inserir) e "}" é possível o mais alto (valor 126). Outros caracteres não são imprimíveis, então o terminal não entenderá ou eles são possíveis uma combinação de caracteres (como "~" é uma tecla morta no meu teclado e não funcionará corretamente). Isso significa que este caractere composto, ao entrar no terminal, enviará o próprio caractere e algo mais. Normalmente um não imprimível. E é este último que o código irá capturar. Além disso, lembre-se que o seu Terminal, neste caso, NÃO deve enviar nem "Carriage Return" nem "Line Feed". Você deve prestar atenção a isso para que o código funcione corretamente.

Se você sentir fica um pouco confuso, fica pior …

Etapa 7: E se eu quiser digitar três dígitos…. ou ainda mais ??

E se eu gostaria de digitar três dígitos…. ou ainda mais ??
E se eu gostaria de digitar três dígitos…. ou ainda mais ??

Receber vários caracteres de uma comunicação serial não é uma tarefa simples.

O buffer serial é uma pilha FIFO de bytes de caracteres. Sempre que a função Serial.read () está chamando, o primeiro caractere enviado é removido da pilha e armazenado em algum outro lugar. Normalmente, uma variável char no código. Observe, dependendo do hardware, geralmente há um tempo limite para como o buffer de log pode manter as informações.

Se você pretende inserir mais de um dígito via serial, deverá "compor" uma string caractere por caractere, conforme eles entram no buffer UART.

Isso significa ler cada caractere do buffer, armazenar em uma variável temporária, carregá-lo na primeira posição de uma matriz de string, mover para a próxima posição e começar de novo, até … bem, depende da aplicação. Existem 2 maneiras de encerrar o ciclo:

  1. Usar algum caractere de "marca final", como "Retorno de carro" ou "Avanço de linha". Assim que o char "end Mark" for encontrado, o loop termina.
  2. Alternativamente, o número de caracteres na cadeia de string pode ser limitado, assim como o número de ciclos interativos. Quando atingir o limite, digamos, 4, adquira acabamentos de rotina por si mesmo.

Vamos dar uma olhada em um exemplo simples de como fazer isso:

  • Defina um caractere "final", como '\ n' (isso significa caractere ASCII de alimentação de linha).
  • looping entretanto Serial.available () é verdadeiro
  • armazenar Serial.read () resulta em uma variável char temporária. Lembre-se: assim que Serial.read () realmente "ler" o buffer, ele estará limpo e o próximo caractere será carregado nele.
  • incrementar uma variável de string com este char
  • Se o último char for "final", saia do loop.

Normalmente, a rotina para obter o array de caracteres seriais se parece com uma imagem.

Foi baseado em uma extensa adaptação do código original do Sr. David A. Mellis.

Fique à vontade para usá-lo e testá-lo. Lembre-se: os valores DEVEM ser inseridos no formato de 3 dígitos.

Por enquanto é isso. Não vou me estender em detalhes adicionais de comunicação serial. É muito complexo para cobrir aqui e merece o próprio Intructables.

Espero que ajude você a usar exemplos no Blue Pill e lhe dê um pouco de esclarecimento sobre como o código é correto para esta pequena placa.

Vejo você por aí em outro instrutível.

Recomendado: