STM32F0DISCOVERY + LCD

Neste projeto faremos uma aplicação utilizando o kit STM32F0Discovery para imprimir caracteres em um display LCD alfanumérico 16x4.
STM32F0DISCOVERY
Este post faz parte da série STM32F0DISCOVERY. Leia também os outros posts da série:

Objetivo

Neste projeto faremos uma aplicação utilizando o kit STM32F0Discovery para imprimir caracteres em um display LCD alfanumérico 16×4.

Materiais

Serão necessários: 

Neste projeto está sendo utilizado o display LCD modelo AGM 1604A-801 (azul – 16×04).

Esquema de conexão

A conexão entre a Discovery e o display é dada da seguinte forma:

Conexao Disco LCD 1
Figura 1

Ferramentas 

Para agilizarmos o desenvolvimento deste projeto, faremos o uso do STM32CubeMX, ferramenta já apresentada no artigo “Crie projetos com o STM32Cube“. Neste, o projeto exemplo tem como base o mesmo kit deste artigo. Assim, inicializaremos um novo projeto no STM32CubeMX da mesma forma que foi feito, porém com algumas ressalvas: depois que realizar as configurações necessárias, a ferramenta “alvo” para o desenvolvimento da aplicação será o MDK-ARM v5, esta opção é feita através de “Project Settings/Project/Toolchain IDE”.

Antes de pressionar “OK” para gerar o projeto, escolha a opção “Copy only the necessary library files”, assim, serão gerados somente arquivos pertinentes aos periféricos ativados e para escolher esta opção, realize o seguinte caminho: “Project Settings/Code Generator/STM32Cube Firmware Libray Package” (figura 2). 

ProjectSettings
Figura 2

Depois de escolhido o diretório para salvar o projeto STM32CubeMX e pressionado o botão “OK”, abra este mesmo diretório para visualizar os arquivos, cujos conteúdos podem ser vistos conforme a figura 3.

Diretorio
Figura 3

Abra o arquivo do projeto MDK-ARM v5 com a extensão .uvprojx para iniciarmos a ferramenta (uVision 5) e, consequentemente, a escrita do código da aplicação.

Código

O código fonte do driver para controlar e escrever no display LCD, pode ser visto a seguir:

O arquivo header pode ser visto também a seguir:

Após a criação tanto dos arquivos fonte (LCD.c) quanto do header (LCD.h), devemos adicioná-los ao mesmo diretório criado para STM32CubeMX, pois será criado um path  deste arquivo no uVision 5.

No arquivo fonte, percebe-se a utilização de rotinas de “delays” como: “TIM6delay_ms” e “TIM6delay_us”. Estas foram desenvolvidas em outros arquivos (intuito genérico) e também são de suma importância para o funcionamento deste driver. Assim, também deve-se criar outros dois arquivos (“Delay.c”“Delay.h”), conforme a seguir:

Header:

Assim sendo, adicione também estes dois arquivos no mesmo diretório em que estão os arquivos do LCD (vide figura 4).

Diretorio2
Figura 4

Feito isto e com a ferramenta já aberta como descrito antes, agora devemos adicionar o path para que esses arquivos sejam encontrados durante o processo de compilação. Assim, execute o seguinte caminho: Options for Target/C/C++/Include Paths/Folder Setup/New, depois disso, informe apenas qual o diretório (figura 5).

Config uV5
Figura 5

Finalizado o processo, você pode também adicioná-los à árvore do projeto, basta apenas clicar com o botão direito sobre o diretório “Application/User” criado pelo STM32CubeMX e depois em “Add Existing Files…” (figura 6).

Adic Files
Figura 6

Por fim, demonstraremos uma aplicação simples no arquivo main.c:

É importante destacar que: insira seu código dentro dos comentários “User Code Begin X e User Code End X”, isto protegerá seu código de ser apagado se houver alguma atualização no projeto do STM32CubeMX!

Funcionamento

Realizada a montagem conforme o Esquema de Conexão, criado o projeto, adicionados os arquivos pertinentes e compilado sem qualquer erro, podemos verificar o funcionamento da aplicação conforme a seguir:

No próximo artigo utilizaremos este mesmo setup com um módulo Bluetooth para comunicar com um terminal em um PC.

Outros artigos da série

STM32F0Discovery + LCD + Bluetooth >>
Notificações
Notificar
guest
4 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Flavio Ferreira
14/12/2018 08:49

Para usar com a placa Blue Pill (STM32F103C8T – R$20,00 no ML), não tem os pinos GPIO da porta C na quantidade necessária. Em LCD.C tem definições que deveriam estar somente em LCD.H. Arrumando isso funciona. em LCD.C de: GPIO_Conf.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3; alterar para: GPIO_Conf.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_3 | GPIO_PIN_4; em LCD.H de: #define LCD_RS GPIO_PIN_13 #define LCD_RW GPIO_PIN_14 #define LCD_EN GPIO_PIN_15 #define LCD_D4 GPIO_PIN_3 #define LCD_D5 GPIO_PIN_2 #define LCD_D6 GPIO_PIN_1 #define LCD_D7 GPIO_PIN_0 #define LCD_PORT GPIOC #define LCD_D_ALL (GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3) alterar para: #define LCD_RS GPIO_PIN_7… Leia mais »

William Furlaneto
William Furlaneto
02/10/2018 16:35

Para mim o programa esta travando bem nessa parte:
HAL_GPIO_WritePin(LCD_PORT, LCD_EN, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LCD_PORT, LCD_D_ALL, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LCD_PORT, LCD_RS, GPIO_PIN_RESET);
while(LCD_ReadByte() & 0x80);

dentro da rotina do SendByte.
Simplesmente não sai desta condição LCD_ReadByte()

Fabio_Souza_Embarcados
Fabio_Souza_Embarcados
26/05/2017 08:13

Eder, excelente artigo! Parabéns. Obrigado por compartilhar.

Eder Andrade
Eder
Reply to  Fabio_Souza_Embarcados
26/05/2017 08:15

Obrigado Fabio!

WEBINAR

Visão Computacional para a redução de erros em processos manuais

DATA: 23/09 ÀS 17:00 H