FAVORITAR
FecharPlease login

Aprendendo a trabalhar com interrupções externas e USART na Franzininho C0

Introdução

Neste artigo, iremos explorar passo a passo como configurar a Franzininho C0 utilizando as ferramentas STM32CUBE e CubeMx para lidar com interrupções externas e comunicação USART. Apresentaremos um exemplo prático, onde ao pressionar um botão, uma interrupção será acionada, e uma mensagem será transmitida pela USART indicando se ocorreu uma borda de subida ou descida. 

Material necessário

Nesse exemplo vamos usar a placa Franzininho C0 e o botão presente nela, conforme o pinout abaixo. Também será necessário um cabo micro USB para conseguir ler as informações na Serial. 

Entendendo a Interrupção

As Interrupções são mecanismos de hardware fundamentais que viabilizam a notificação de eventos importantes pelos periféricos ao software, mesmo durante a execução da rotina principal. Diversos eventos podem invocar uma interrupção, como overflow de um Timer, término de uma conversão ADC, transição de estado de um pino, recebimento de pacote USART ou I2C, etc. 

No núcleo do processador Cortex-M0+, o controlador de interrupção vetorial aninhado (NVIC) e o controlador de eventos externos (EXTI) desempenham papéis de gerenciamento dessas interrupções. O NVIC oferece suporte a níveis de prioridade, enquanto o EXTI é responsável por lidar com eventos externos, como a mudança de estado de pinos que exploraremos neste tutorial.

No dia 25 de Junho de 2024, ocorrerá o “Seminário de Sistemas Embarcados e IoT 2024“, no Holiday Inn Anhembi — Parque Anhembi, São Paulo–SP.

Garanta seu ingresso

É válido lembrar que no Franzininho C0, as linhas EXTI são numeradas de 0 a 15 (EXTI0, EXTI1, etc.),

Se você quiser encontrar a explicação mais abrangente leia o capítulo 3.13 do datasheet STM32C011F6 – Mainstream Arm Cortex-M0+ MCU with 32 Kbytes of Flash memory, 6 Kbytes RAM, 48 MHz CPU, 2x USART, timers, ADC, comm. I/F, 2-3.6V – STMicroelectronics 

Configuração CubeMX

  1. Abra STM32Cube , crie um novo projeto e selecione o microcontrolador de destino “STM32C011F6P6”. 
  1. Vá para a página de configurações de relógio e em HCLK digite 48 MHz para a frequência de saída desejada do sistema. Pressione a tecla “Enter” e deixe o aplicativo resolver os divisores/multiplicadores PLL necessários para atingir a taxa de clock desejada. Depois volte para a página de configuração dos pinos, selecione “Trace and Debug” e  habilite “Serial Wire
  1. Para configurar a interrupção no pino PA8, clique sobre ele e selecione a opção “GPIO_EXT8”. Em seguida, nas configurações do GPIO, ative o resistor interno de pull-up e defina o modo como “External Interrupt Mode with Rising/Falling Edge Trigger Detection”. Este modo de operação permite que a interrupção seja acionada quando ocorre uma mudança de nível lógico em um pino específico do microcontrolador, sendo capaz de detectar ambas as formas:
  • “Rising Edge” (Borda de Subida): A interrupção é acionada quando há uma transição do nível lógico baixo para o nível lógico alto no pino específico.
  • “Falling Edge” (Borda de Descida): A interrupção é acionada quando há uma transição do nível lógico alto para o nível lógico baixo no pino específico.
  1. Depois, habilite a entrada correspondente no NVIC.
  1. Iniciando a configuração da USART, primeiro em SYS habilite o uso dos pinos PA9 e PA10.
  1. Depois, seleciona PA10 como “USART1_RX” e PA9 como “USART1_TX”.
  1. Em “Connectivity” selecione a opção “USART1” e em Mode escolha o “Asynchronous”. As demais configurações deixe padrão. 
  1. Por fim, gere o código em “Project” > “Generate Code”.

Código

  1. Em Core > Src > main.c, após a definição “UART_HandleTypeDef huart1;”, vamos criar variáveis para armazenar as mensagens que serão transmitidas pela USART:

Neste exemplo, deixaremos o loop principal while vazio. A função de callback para lidar com a interrupção será declarada após o main.

  1. Para lidar com o tratamento de interrupção na borda de descida, utilizaremos a função void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin) e, para lidar com a borda de subida, void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin).

Portanto, crie as seguintes funções:

  • HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin): Esta função é chamada quando ocorre uma transição de borda de descida, ou seja, quando o sinal no pino vai de alto para baixo (em nosso exemplo quando pressionamos o botão). Ela verifica se a interrupção ocorreu no pino específico GPIO_PIN_8 e, se sim, transmite uma mensagem serial pela USART usando a função HAL_UART_Transmit.
  • HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin): Esta função é chamada quando ocorre uma transição de borda de subida, ou seja, quando o sinal no pino vai de baixo para alto (em nosso exemplo quando soltamos o botão). Assim como a função anterior, ela verifica se a interrupção ocorreu no pino específico GPIO_PIN_8 e, se sim, também transmite uma mensagem serial pela USART usando HAL_UART_Transmit.

Na imagem abaixo, pode ser visto o código.

Gravação STM32CubeIde

  1.  Utilizando um gravador ST-LINK realize as conexões como indicado na figura.
  1. Pressione no ícone semelhante a um martelo, aguarde o build do projeto e caso não tenha erros pressione “run”. Após o run, configure o debugguer conforme a imagem abaixo e aguarde a gravação do código.

Utilizando o console Serial no STM32CubeIde

  1. Antes de tudo, lembre-se de conectar um cabo usb. Caso a porta não seja identificada instale o driver CH340.
  1. Em “Open Console” clique em “Command Shell Console”
  1. Crie uma nova connection name e depois selecione-a conforme mostrado nas imagens abaixo. 

Funcionamento

Com o resistor de pull-up habilitado, o pino “PA8” está mantido em nível lógico alto até que o botão seja pressionado, momento em que ele passa a receber um nível lógico baixo. Portanto, quando pressionamos o botão, é identificada uma borda de descida, e quando o soltamos, uma borda de subida é identificada.

Conclusão

Neste artigo, exploramos passo a passo como configurar a Franzininho C0 para lidar com interrupções externas e comunicação USART. Começamos entendendo o papel das interrupções no hardware, permitindo que eventos sejam notificados ao software durante a execução da rotina principal. 

Demonstramos como configurar a interrupção no pino PA8, usando o modo de detecção de borda de subida/descida, e como associar a transição de níveis lógicos a eventos específicos. Implementamos funções de callback para lidar com essas interrupções, onde identificamos e transmitimos mensagens pela UART indicando se ocorreu uma borda de subida ou descida.

Outros artigos da série

<< Franzininho C0: aprenda a trabalhar com TimersMedindo Intervalos de Tempo com a Franzininho C0: Integrando Timer, Interrupções e USART >>
Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.
Comentários:
Notificações
Notificar
0 Comentários
Inline Feedbacks
View all comments
Home » Hardware » Aprendendo a trabalhar com interrupções externas e USART na Franzininho C0

EM DESTAQUE

WEBINARS

LEIA TAMBÉM

JUNTE-SE HOJE À COMUNIDADE EMBARCADOS

Talvez você goste:


Seminário de
Sistemas Embarcados e IoT 2024
 
Data: 25/06 | Local: Hotel Holiday Inn Anhembi, São Paulo-SP
 
GARANTA SEU INGRESSO

 
close-link