STM Урок 151. LL. I2C. Переходник для LCD 16×2



Продолжаем работу с библиотекой LL, а также с шиной I2C. В прошлом занятии мы уже достаточно глубоко познакомились с аппаратной организацией данной шины, а также подтвердили очень неплохо свои полученные знания на практике, подключив к контроллеру STM32F103 микросхему памяти EEPROM AT24C32 и произведя чтение и запись по шине I2C. Но, думаю, что для более глубокого понимания работы данной шины и её программирования при помощи средств библиотеки LL одного урока будет недостаточно. Поэтому на данном уроке мы попробуем также подключить к данной шине контроллера символьный дисплей на контроллере HD44780 разрешением 16 x 2 символа.

С таким дисплеем мы уже много работали, также много работали и с переходником, а также постоянно продолжаем работать, поэтому рассказывать о дисплее, а также о переходнике и как они работают, не требуется.

Поэтому предлагаю сразу же перейти к практической части, чтобы не терять лишнее время.

Начнём со схемы подключения дисплея.

Контроллер остаётся тот же STM32F103, который расположен на очень недорогой отладочной плате, только большую макетную плату мы сегодня исключим, так как светодиодный многоразрядный индикатор вместе с транзисторами нам уже не нужен. Вся информация у нас будет теперь мониториться посредством нашего дисплея.

Для удобства подключения дисплея к контроллеру мы всё же поместим нашу плату в небольшую макетницу

 

 

Питаться наша плата будет от программатора, а вот дисплей мы будем питать отдельно, поэтому к контроллеру мы его переходник подключим без провода питания, только интерфейсные ножки и общий провод

 

 

Подведём к дисплею питание от отдельного 5-вольтового источника, общий провод (или минус) источника можно подключить и на макетную плату к контроллеру

 

 

Подключим также программатор к ПК и начнём заниматься нашим проектом.

Проект был сделан из проекта предыдущего занятия с именем LL_I2C_EEPROM и имя ему было присвоено LL_I2C_LCD1602.

Откроем наш проект в проектогенераторе Cube MX и для шины I2C1 выставим стандартную скорость обмена, так как спешить нам с символьным дисплеем некуда

 

 

 

Отключим таймер 2

 

 

Также отключим ножки портов, которые ранее были использованы для работы с динамической индикацией

 

Сгенерируем проект для Keil и откроем его там. Настроим программатор на автоперезагрузку и уберём оптимизацию до 0.

Пока собирать наш проект не будем, а займёмся библиотеками.

Из папок Src и Inc удалим соответственно файлы led.c и led.h.

А скопируем мы теперь в эти папки файлы lcd.c и lcd.h из проекта урока 113 с именем NRF24_RX_LCD.

Подключим файл lcd.c к дереву проекта, перейдём в файл main.c и исправим led на lcd в подключении библиотеки

 

#include "lcd.h"

 

Также подключим её библиотеку для работы со строками

 

 

Перейдём в файл lcd.h и в нём также исправим подключение библиотек.

Вместо этой

 

#include «stm32f4xx_hal.h»

 

подключим вот эти

 

 

 

Создадим ещё два файла для работы с шиной I2C с именами i2c_user.c и i2c_user.h и сохраним их соответственно в папки Src и Inc следующего содержания

 

 

 

Здесь у нас только одна функция — функция отправки байта в шину. В параметрах у нас указатель на шину, также значение байта и значение адреса устройства.

Алгоритм передачи байта у нас практически такой же, как и прошлом уроке.

Подключим нашу новую библиотеку в файле lcd.c

 

 

В этом же файле уберём структуру I2C

 

extern I2C_HandleTypeDef hi2c3;

 

Объявление вот этого буфера тоже удалим

 

uint8_t buf[1]={0};

 

В функции DelayMicro вместо пятёрки поставим девятку

 

micros *=(SystemCoreClock / 1000000) / 9;

 

В функции LCD_WriteByteI2CLCD удалим содержимое всего тело и добавим туда только вызов нашей новой функции

 

 

В тех местах, где встретится вызов функции HAL_Delay, заменим имя функции на LL_mDelay.

Перейдём в файл main.c и удалим там все глобальные макросы и переменные.

Удалим также функции AT24C_WriteBytes и AT24C_ReadBytes вместе с телами, а также вместе с телом и функцию TIM2_Callback.

В файле stm32f1xx_it.c удалим также прототип данной функции.

Вернёмся в main.c и удалим также весь пользовательский код в функции main() между комментариями USER CODE BEGIN 2 и USER CODE END 2.

В функции main() добавим локальный символьный массив

 

 

Теперь попробуем вывести две тестовые строки на дисплей

 

 

Соберём код, прошьём контроллер и у нас на дисплее должны будут появиться наши строки

 

 

Через 2 секунды очистим надпись на нижней строке

 

 

И затем в бесконечном цикле будем циклически считать до 65535 и выводить число на дисплей в нижнюю строку

 

 

Соберём код, прошьём контроллер и, по прошествии 2 секунд во второй строке дисплея у нас начнёт считать счётчик

 

 

Итак, на данном занятии мы научились работать с символьным дисплеем, подключенным через переходник к шине I2C контроллера, посредством возможностей библиотеки LL.

Благодарю всех за внимание!

 

 

Предыдущий урок Программирование МК STM32 Следующий урок

 

Исходный код

 

 

Отладочную плату STM32F103C8T6 можно приобрести здесь STM32F103C8T6

Программатор недорогой можно купить здесь ST-Link V2

Дисплей LCD 16×2

Переходник I2C to LCD можно приобрести здесьI2C to LCD1602 2004

Логический анализатор 16 каналов можно приобрести здесь

 

 

Смотреть ВИДЕОУРОК (нажмите на картинку)

 

STM LL. I2C. Переходник для LCD 16x2

Один комментарий на “STM Урок 151. LL. I2C. Переходник для LCD 16×2
  1. Георгий:

    Подскажите как работать не с первым i2c а со вторым?
    Меняю в файле lcd.c функуию:
    void LCD_WriteByteI2CLCD(uint8_t bt)
    {
    I2C_SendByteByADDR(I2C2, bt,0x4E);
    }
    это не помогает, что еще надо поменять?

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*