- Tipos de interrupções e ISR
- Sintaxe para interrupção em STM32
- Componentes necessários
- Diagrama de circuito e conexões
- Programando STM32F103C8 para interrupções
Interrupções são um mecanismo pelo qual uma E / S ou uma instrução pode suspender a execução normal do processador e ser atendida como se tivesse a maior prioridade. Por exemplo, um processador que executa uma execução normal também pode monitorar continuamente a ocorrência de algum tipo de evento ou interrupção. É quando uma interrupção externa ocorre (como de algum sensor), então o processador pausa sua execução normal e primeiro serve a interrupção e então continua sua execução normal.
Aqui neste projeto, para entender as interrupções no STM32F103C8, usaremos o botão de pressão como interrupção externa. Aqui iremos incrementar um número de 0 e exibi-lo no LCD 16x2, e sempre que o botão for pressionado o led acende e o display LCD mostra INTERROMPER. O LED apaga assim que o botão é liberado.
Tipos de interrupções e ISR
As interrupções podem ser amplamente classificadas em dois tipos:
Interrupções de hardware: se o sinal para o processador vier de algum dispositivo externo, como botão ou sensor, ou de algum outro dispositivo de hardware que gere um sinal e diga ao processador para realizar uma tarefa específica presente no ISR, é conhecido como interrupções de hardware.
Interrupções de software: As interrupções geradas pelas instruções do software.
Interromper a rotina de serviço
Rotina de serviço de interrupção ou um manipulador de interrupção é um evento que possui um pequeno conjunto de instruções e, quando ocorre uma interrupção, o processador primeiro executa esse código que está presente no ISR e, em seguida, continua com a tarefa que estava fazendo antes da interrupção.
Sintaxe para interrupção em STM32
O ISR tem a seguinte sintaxe attachInterrupt (digitalPinToInterrupt (pin), ISR, modo) no Arduino e o mesmo também pode ser usado no STM32 já que usamos o IDE do arduino para fazer upload do código.
- digitalPinToInterrupt (pin): Como na placa Arduino Uno, temos os pinos 2,3 e no Mega temos 2,3,18,19,20,21 para interrupções. No STM32F103C8, também temos pinos de interrupção, quaisquer pinos GPIO podem ser usados para interrupções. Nós apenas especificamos o pino de entrada que estamos usando para interrupção. Mas ao usar mais de uma interrupção ao mesmo tempo, podemos precisar seguir algumas restrições.
- ISR: é uma função de manipulador de interrupção que é chamada quando ocorre uma interrupção externa. Não tem argumentos e tipo de retorno nulo.
- Modo: Tipo de transição para acionar a interrupção
- RISING: Para disparar uma interrupção quando o pino transita de LOW para HIGH.
- FALLING: Para disparar uma interrupção quando o pino passa de HIGH para LOW.
- CHANGE: Para disparar uma interrupção quando o pino transita de LOW para HIGH ou HIGH para LOW (ou seja, quando o pino muda).
Algumas condições ao usar interrupção
- A função Interrupt Service Routine (ISR) deve ser o mais curta possível.
- A função Delay () não funciona dentro do ISR e deve ser evitada.
Componentes necessários
- STM32F103C8
- Botão de apertar
- CONDUZIU
- Resistor (10K)
- LCD (16x2)
Diagrama de circuito e conexões
Um lado do pino do botão é conectado a 3,3 V do STM32 e o outro lado é conectado ao pino de entrada (PA0) do STM32 por meio de um resistor pull down.
O resistor pull Down é usado para que o microcontrolador só obtenha HIGH ou LOW em sua entrada quando o botão for pressionado ou liberado. Caso contrário, sem puxar o resistor, o MCU pode ficar confuso e alimentar alguns valores flutuantes aleatórios para a entrada.
Conexão entre STM32F103C8 e LCD
A tabela a seguir mostra a conexão de pinos entre o LCD (16X2) e o microcontrolador STM32F103C8.
STM32F103C8 |
LCD |
GND |
VSS |
+ 5V |
VDD |
Para o PIN do centro do potenciômetro |
V0 |
PB0 |
RS |
GND |
RW |
PB1 |
E |
PB10 |
D4 |
PB11 |
D5 |
PC13 |
D6 |
PC14 |
D7 |
+ 5V |
UMA |
GND |
K |
Programando STM32F103C8 para interrupções
O programa para este tutorial é simples e fornecido no final deste tutorial. Não precisamos do programador FTDI para programar o STM32, simplesmente conecte seu PC à porta USB do STM32 e comece a programar com o Arduino IDE. Saiba mais sobre como programar STM32 por meio da porta USB.
Como dissemos aqui neste tutorial vamos incrementar um número de 0 e exibi-lo no LCD 16x2 e sempre que um botão for pressionado o led acende e o display LCD mostra 'INTERROMPIDO'.
Primeiro defina as conexões dos pinos do LCD com STM32. Você pode modificá-lo de acordo com seus requisitos.
const int rs = PB10, en = PB11, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14;
Em seguida, incluímos o arquivo de cabeçalho para o display LCD. Isso chama a biblioteca que contém o código de como o STM32 deve se comunicar com o LCD. Certifique-se também de que a função LiquidCrystal seja chamada com os nomes dos pinos que acabamos de definir acima.
incluir
Variáveis globais são usadas para passar dados entre ISR e o programa principal. Declaramos a variável ledOn como volátil e também como booleana para especificar True ou False.
volátil booleano ledOn = false;
Dentro da função void setup () , exibiremos uma mensagem de introdução e a limparemos após 2 segundos.
lcd.begin (16,2); lcd.print ("CIRCUITO DIGEST"); atraso (2000); lcd.clear ();
Novamente na mesma função void setup () , precisamos especificar os pinos de entrada e saída. Definimos o pino PA1 para saída para LED e PA0 para entrada do botão.
pinMode (PA1, OUTPUT) pinMode (PA0, INPUT)
Também iremos incrementar um número, então declare uma variável com valor zero.
int i = 0;
Agora, a parte importante do código é a função attachInterrupt () , ela também está incluída dentro do void setup ()
attachInterrupt (digitalPinToInterrupt (PA0), buttonPressed, CHANGE)
Especificamos o pino PA0 para interrupção externa, e buttonPressed é a função que deve ser chamada quando há MUDANÇA (LOW para HIGH ou HIGH para LOW) no pino PA0. Você também pode usar qualquer outro nome de função, pino e modo de acordo com os requisitos.
Dentro do loop void () , incrementamos um número (i) de zero e imprimimos o número no LCD (16x2).
lcd.clear (); lcd.print ("NÚMERO:"); lcd.print (i); ++ i; atraso (1000);
A parte mais importante é criar uma função de tratamento de interrupção de acordo com o nome que usamos na função attachInterrupt () . Usamos buttonPressed, então aqui criamos uma função void buttonPressed ()
void buttonPressed () { if (ledOn) { ledOn = false; digitalWrite (PA1, LOW); } else { ledOn = true; digitalWrite (PA1, HIGH); lcd.setCursor (0,1); lcd.print ("Interromper"); } }
Funcionamento deste botão Pressionado () ISR:
De acordo com o valor da variável ledOn , o LED acende e apaga.
ESTADO DO BOTÃO |
ledOn (valor) |
LED (vermelho) |
LCD (16x2) |
SEM IMPRESSÃO |
Falso |
FORA |
- |
PRESSIONADO |
Verdadeiro |
EM |
Mostra '' INTERRUPT ' |
Se o valor de ledOn for falso, o LED permanecerá desligado e se o valor de ledOn for True, o LED acende e o display LCD mostra 'Interromper' nele.
NOTA: Pode haver efeito de debounce do interruptor às vezes e pode contar com disparos múltiplos quando o botão de pressão é pressionado, isso ocorre porque vários picos de tensão devido à razão mecânica do botão de alternância. Isso pode ser reduzido pela introdução do filtro RC.
O funcionamento completo das interrupções no STM32F103C8 é mostrado no vídeo abaixo.