Перейти к содержимому

#6. Подключение дисплея 1602 (HD44780) (HAL)

Сначала немного о дисплее:

LCD дисплей размерности 1602 (по 16 символов в 2 строки), на базе контроллера HD44780.

Выводы дисплея:

На дисплее имеется 16pin разъем для подключения. Выводы промаркированы на лицевой стороне платы.

1 (VSS) — Питание контроллера (-)
2 (VDD) — Питание контроллера (+)
3 (VO) — Вывод управления контрастом
4 (RS) — Выбор регистра 
5 (R/W) — Чтение/запись ( режим записи при соединении с землей)
6 (E) — Еnable (строб по спаду) 
7-10 (DB0-DB3) — Младшие биты 8-битного интерфейса
11-14 (DB4-DB7) — Старшие биты интерфейса
15 (A) — Анод (+) питания подсветки
16 (K) — Катод (-) питания подсветки

В зависимости от модели бывает два типа питания дисплея: 3,3В и .

В нашем случае мы будем использовать дисплей с питанием 3,3В.

Подключать будем дисплей по следующей схеме:

Схема в Diptrace

Используем следующие пины (в принципе кому какие удобно): A9, А10, А11, А12, А15, В3. Пины для наглядности можно посмотреть на рисунке №1 в разделе «Схемы«.

С помощью резистора R9 регулируем контрастность.

Теперь необходимо собрать проект в CubeMX — > Новый проект — > Выбираем наш контроллер — > Настраиваем выгрузку проекта для IDE Workbench

Настройка пинов для LCD

Итак по настройке:

  1. Подключаем внешний кварц — > RCC — > Crystal/Ceramic Resonator
  2. Отладка — > SYS — > Serial Wire
  3. Настраиваем пины в режиме GPIO Output, меняем User Label на пинах для удобства восприятия

Во вкладке Clock Configuration оставляем тактирование HSE:

Во вкладке Configuration — > GPIO проверяем настройки:

По конфигурации:

  1. GPIO output level — Low — состояние пина — «высокое» или «низкое»
  2. GPIO mode — Output Push Pull — двухтактный выход
  3. GPIO Pull-up/Pull-down — No pull-up and no pull-down — без внутренней подтяжки пина через резистор к Vdd или Vss
  4. Maximum output speed — High — скорость
  5. User Label — LCD_xx — название или метка пина

GPIO Pull-up/Pull-down

Подробнее можно посмотреть в STM32F103C8T6 Reference manual на странице «Документы«.

Выгружаем наш проект в среду Workbench. Раскрываем слева дерево проекта LCD -> Src и открываем main.c

Теперь необходимо подключить библиотеку для нашего дисплея, ее можно скачать со страницы «Загрузки». Скачиваем, распаковываем, видим две папки src и inc. Содержимое этих папок нам необходимо скопировать в одноименные папки нашего проекта. Файлы в проекте подтянутся автоматически либо сделать Refresh (F5).

Подключаем библиотеку в файле main.c:

/* USER CODE BEGIN Includes */
#include "hd44780.h"
/* USER CODE END Includes */

Так как используем библиотеку HAL подключаем ее либо проверяем наличие строки в начале файла main:

#include "stm32f1xx.h"

Да, немаловажным будет познакомиться с функциями нашей библиотеки:

  • lcdInit — функция начальной инициализации дисплея;
  • lcdClrScr — функция очистки дисплея, курсор в исходное положение;
  • lcdReturn — функция возврата курсора в исходное положение;
  • lcdSetMode — функция установления режимов: дисплей вкл / выкл, курсор мигает вкл / выкл, курсор вкл / выкл;
  • lcdGoto — функция устанавливает курсор в определенное место: строка, столбец;
  • lcdPuts — функция вывода текстовой строки;
  • lcdPutc — функция вывода отдельного символа типа char;
  • lcdLoadChar  — функция загрузки в память дисплея пользовательского символа;
  • lcdDrawChar — функция рисования на экране пользовательского символа;
  • lcdBackSpace — функция смещения курсора на один символ влево и его уничтожение;
  • lcdScroll — функция смещения всего текста на один столбец в нужном направлении (слева или справа)
  • cursorShift — функция смещения курсора на позицию справа или слева без уничтожения символа, уже изображен. Предназначена для редактирования / исправления текста;
  • lcdItos — функция вывода на экран числа типа integer;
  • lcdFtos — функция вывода на экран числа типа float;
  • lcdNtos — функция вывода на экран числа типа integer с определенным числом разрядов. Лишние разряды отсекаются. Разряды, которых не хватает заполняются нулями. Для фиксированного расположения на экране;
  • lcdDrawBar — функция рисования индикатора выполнения;
  • lcdClrBar — функция очистки индикатору выполнения.

Список некоторых параметров библиотеки

В файле «lcd_cfg.h«:

// ------------------------------- 
// DEFAULT CONFIGURATIONS 
// ----------- -------------------- 
#define DEFAULT_DISPLAY_CONFIG DISPLAY_CONFIG_4bit_2L_5x8 
#define DEFAULT_ENTRY_MODE ENTRY_MODE_INC_NO_SHIFT 
#define DEFAULT_VIEW_MODE VIEW_MODE_DispOn_BlkOff_CrsOff 
#define USE_BUSY_FLAG 0u / * 1 (true) or 0 (false) * /
  • дисплей подключен в 4-х битном режиме, на 2 или 4 строки, с шрифтом 5х8 пикселей;
  • слева направо, без смещения видимой части DDR RAM памяти;
  • дисплей включен, мигание выключено, курсор выключен;
  • или используется сигнал дисплея R / W, в нашем случае — нет, потому 0.
#define MCU_FREQ_VALUE SystemCoreClock / 1000000 / * MHz. Minimal value = 1 MHz * /

В переменной SystemCoreClock сохраняется частота MCU в Герцах, делим на миллион, получаем в мегагерцах. Для правильных таймингов дисплея:

// ------------------------------- 
// SET FORMATTED OUTPUT OPTIONS 
// --------- ---------------------- 
#define USE_FORMATTED_OUTPUT 1u / * 1 (true) or 0 (false) * /
#define TAB_SPACE 4u / * 1 .. 255 * /
  • использовать символы форматирования / t, / n, / r в строках с текстом — 1, не использовать — 0;
  • длина табуляции — 4.
// ------------------------------- 
// PROGRESS BAR OPTIONS 
// ---------- --------------------- 
#define USE_PROGRESS_BAR 0u     / * 1 (true) or 0 (false) * /
#define USE_REGRESS_BAR 1u     / * 1 (true) or 0 (false) * /
#define PROGRESS_BAR_LINE LCD_2nd_LINE / * Select lcd line: 1, 2, 3, 4 ... * /
#define PROGRESS_BAR_HEIGHT 5u      / * in pixel: 1 (min), 2, 3, 4, 5, 6, 7, 8 (max) * /
#define PROGRESS_BAR_WIDTH 10u     / * Number of chars in lcd line: 1, 2, .., 8, 16, 20 * /
  • использовать индикатор выполнения, прогрессирующее — 1, нет — 0;
  • использовать индикатор выполнения, что регрессирует — 1, нет -0;
  • индикатор выполнения будет во второй строке индикатора;
  • высота индикатора выполнения в пикселях;
  • ширина индикатора в знакомест.

Перейдем к тестовой программе:

В начале программы в файле «main.c», в функции «main» объявляем прототип функции для имитации печати текста с клавиатуры. Саму функцию расположим уже после главной функции «main»:

/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/
void imitationPrinting(char *ptr);
/* USER CODE END PFP */

Далее в теле функции «main» к началу бесконечного цикла в блоке 1 — объявляем все переменные которые понадобятся для демонстрации:

/* USER CODE BEGIN 1 */
	uint32_t SystemFreq = HAL_RCC_GetHCLKFreq();
	 char str[17] = {};
	 float pi = 3.14;
	 int t = 123;
	 unsigned char men1[FONT_HEIGHT] = {0x0e,0x0e,0x04,0x1f,0x04,0x1a,0x01,0x00};
	 unsigned char men2[FONT_HEIGHT] = {0x07,0x07,0x0a,0x07,0x02,0x05,0x09,0x00};
/* USER CODE END 1 */

Инициализируем наш дисплей в области обозначенную как «USER CODE BEGIN 2»:

/* USER CODE BEGIN 2 */
  lcdInit(); //инициализация дисплея
/* USER CODE END 2 */

В бесконечном цикле пишем демонстрационную программу:

/* USER CODE BEGIN WHILE */
  while (1)
   {
    // очищенне дисплея
    lcdClrScr();
    // установление позиции курсора
    lcdGoto(LCD_1st_LINE,1);
    // печатаем текстовую строку с переносом на другую строку
    lcdPuts("Workbench STM32\nFreq MCU ");
    // печатаем частоту микроконтроллера в Mhz
    lcdItos(SystemFreq/1000000);
    lcdPuts(" Mhz");
    // ждем 3 секунды
    HAL_Delay(3000);
    /*
     * В цикле смещаем все что на экране на 16 позиций вправо
     */
    for (int i = 0; i < 16; ++i)
    {
     lcdScroll(RIGHT);
     HAL_Delay(250);
    }
    // очищаем дисплей
    lcdClrScr();
    // в буфер str отправляем текст
    sprintf(str,"STM32F103C8 and");
    // функция имитации печати текста
    imitationPrinting(str);
    // в буфер str отправляем текст
    sprintf(str,"LCD WH1602A Demo");
    // установления позиции курсора
    lcdGoto(LCD_2nd_LINE,0);
    // функция имитации печати текста
    imitationPrinting(str);
    // ждем 3 секунды
    HAL_Delay(3000);
    /*
     * В цикле смещаем все что на экране на 16 позиций слева
     */
    for (int i = 0; i < 16; ++i)
    {
     lcdScroll(LEFT);
     HAL_Delay(250);
    }
    // ждем секунду
    HAL_Delay(1000);
    /*
     * В цикле смещаем все что на экране на 16 позиций вправо
     */
    for (int i = 0; i < 16; ++i)
    {
     lcdScroll(RIGHT);
     HAL_Delay(250);
    }
    // ждем 2 секунды
    HAL_Delay(2000);
    // очищаем дисплей
    lcdClrScr();
    // выводим текст на экран
    lcdPuts("Float = ");
    // выводим на экран число типа float с двумя знаками после запятой
    lcdFtos(pi,2);
    // устанавливаем позицию курсора
    lcdGoto(LCD_2nd_LINE,0);
    // выводим текст на экран
    lcdPuts("Integer = ");
    // выводим на экран число типа integer
    lcdItos(t);
    // ждем 3 секунды
    HAL_Delay(3000);
    // включаем режим: дисплей включен, мигание курсора отключен, курсор включен
    lcdSetMode(VIEW_MODE_DispOn_BlkOff_CrsOn);
    // устанавливаем позицию курсора
    lcdGoto(LCD_2nd_LINE,16);
    // в цикле удаляем всю строку backspace'ом
    for (int i = 0; i < 16; ++i)
    {
     lcdBackSpace();
     HAL_Delay(100);
    }
    // устанавливаем позицию курсора
    lcdGoto(LCD_1st_LINE,16);
    // в цикле удаляем всю строку backspace'ом
    for (int i = 0; i < 16; ++i)
    {
     lcdBackSpace();
     HAL_Delay(100);
    }
    // устанавливаем режим: дисплей включен, мигание отключен, курсор выключен
    lcdSetMode(VIEW_MODE_DispOn_BlkOff_CrsOff);
    // возвращаем курсор в дом
    lcdReturn();
    // печатаем текст с табуляцией
    lcdPuts("\tLoading...");
    // устанавливаем позицию курсора
    lcdGoto(PROGRESS_BAR_LINE, PROGRESS_BAR_WIDTH);
    // печатаем текст
    lcdPuts("[   %]");
    // в цикле показываем индикатор выполнения
    for(uint8_t i = 0; i <= PROGRESS_BAR_MAX_LOAD; ++i)
    {
     // устанавливаем позицию курсора
     lcdGoto(PROGRESS_BAR_LINE, PROGRESS_BAR_WIDTH + 1);
     // печать процентов выполнения в четко заданной позиции на три разряда
     lcdNtos((i*100)/PROGRESS_BAR_MAX_LOAD, 3 );
     // показываем текущее состояние индикатора выполнения
     lcdDrawBar(i);
     // ждем 1/10 секунды
     HAL_Delay(100);
    }
    // ждем 3 секунды
    HAL_Delay(3000);
    // очищаем дисплей
    lcdClrScr();
    /*
     * Загружаем символ пользователя к ячейке памяти 6 и 7 в дисплей
     * ячейки памяти от 0 по 5 заняты индикатором выполнения
     * если вы не используете индикатор выполнения, то можно загружать
     * с 0 ячейки памяти дисплея
     */
    lcdLoadChar(men1,6);
    lcdLoadChar(men2,7);
    // печатаем текст с табуляцией и переходом на новую строку
    lcdPuts("\tRunning men\n");
    // в цикле показываем бегущего человека :)))
    for(uint8_t i = 0; i < 8; i++)
    {
     lcdPutc(6);
     HAL_Delay(250);
     cursorShift(LEFT);
     lcdPutc(' ');
     lcdPutc(7);
     HAL_Delay(250);
     cursorShift(LEFT);
     lcdPutc(' ');
    }
/* USER CODE END WHILE */

Не забываем о функции, которую написали для демонстрационной программы и объявили ее прототип в начале программы. Функцию пишем после главной функции «main» в главном файле «main.c» в пользовательском блоке 4, который определил CubeMX:

/* USER CODE BEGIN 4 */
	// функция имитации печати текста с клавиатуры
void imitationPrinting(char *ptr)
{
	// устанавливаем режим с включенным курсором
 lcdSetMode(VIEW_MODE_DispOn_BlkOff_CrsOn);
 	// пока не конец строке
 while(*ptr != 0)
 {
	// печатаем текущий символ
  lcdPutc(*ptr++);
    // ждем 1/10 секунды
  HAL_Delay(100);
 }
   // устанавливаем режим с выключенным курсором
 lcdSetMode(VIEW_MODE_DispOn_BlkOff_CrsOff);
}
/* USER CODE END 4 */

Но не забываем что в демонстрационной программе используем индикатор выполнения «progress bar», а для этого в файле lcd_cfg.h константу  USE_PROGRESS_BAR устанавливаем в 1u. «#define USE_PROGRESS_BAR 1u».

Полный код программы в файле main.c:

/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  ** This notice applies to any and all portions of this file
  * that are not between comment pairs USER CODE BEGIN and
  * USER CODE END. Other portions of this file, whether 
  * inserted by the user or by software development tools
  * are owned by their respective copyright owners.
  *
  * COPYRIGHT(c) 2018 STMicroelectronics
  *
  * Redistribution and use in source and binary forms, with or without modification,
  * are permitted provided that the following conditions are met:
  *   1. Redistributions of source code must retain the above copyright notice,
  *      this list of conditions and the following disclaimer.
  *   2. Redistributions in binary form must reproduce the above copyright notice,
  *      this list of conditions and the following disclaimer in the documentation
  *      and/or other materials provided with the distribution.
  *   3. Neither the name of STMicroelectronics nor the names of its contributors
  *      may be used to endorse or promote products derived from this software
  *      without specific prior written permission.
  *
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  ******************************************************************************
  */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32f1xx_hal.h"
#include "tim.h"
#include "gpio.h"

/* USER CODE BEGIN Includes */
#include "hd44780.h"
/* USER CODE END Includes */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);

/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/
void imitationPrinting(char *ptr);
/* USER CODE END PFP */

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  *
  * @retval None
  */
int main(void)
{
  /* USER CODE BEGIN 1 */
	uint32_t SystemFreq = HAL_RCC_GetHCLKFreq();
	 char str[17] = {};
	 float pi = 3.14;
	 int t = 123;
	 unsigned char men1[FONT_HEIGHT] = {0x0e,0x0e,0x04,0x1f,0x04,0x1a,0x01,0x00};
	 unsigned char men2[FONT_HEIGHT] = {0x07,0x07,0x0a,0x07,0x02,0x05,0x09,0x00};
  /* USER CODE END 1 */

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM2_Init();
  /* USER CODE BEGIN 2 */
  lcdInit(); //инициализация дисплея
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
   {
    // очищенне дисплея
    lcdClrScr();
    // установление позиции курсора
    lcdGoto(LCD_1st_LINE,1);
    // печатаем текстовую строку с переносом на другую строку
    lcdPuts("Workbench STM32\nFreq MCU ");
    // печатаем частоту микроконтроллера в Mhz
    lcdItos(SystemFreq/1000000);
    lcdPuts(" Mhz");
    // ждем 3 секунды
    HAL_Delay(3000);
    /*
     * В цикле смещаем все что на экране на 16 позиций вправо
     */
    for (int i = 0; i < 16; ++i)
    {
     lcdScroll(RIGHT);
     HAL_Delay(250);
    }
    // очищаем дисплей
    lcdClrScr();
    // в буфер str отправляем текст
    sprintf(str,"STM32F103C8 and");
    // функция имитации печати текста
    imitationPrinting(str);
    // в буфер str отправляем текст
    sprintf(str,"LCD WH1602A Demo");
    // установления позиции курсора
    lcdGoto(LCD_2nd_LINE,0);
    // функция имитации печати текста
    imitationPrinting(str);
    // ждем 3 секунды
    HAL_Delay(3000);
    /*
     * В цикле смещаем все что на экране на 16 позиций слева
     */
    for (int i = 0; i < 16; ++i)
    {
     lcdScroll(LEFT);
     HAL_Delay(250);
    }
    // ждем секунду
    HAL_Delay(1000);
    /*
     * В цикле смещаем все что на экране на 16 позиций вправо
     */
    for (int i = 0; i < 16; ++i)
    {
     lcdScroll(RIGHT);
     HAL_Delay(250);
    }
    // ждем 2 секунды
    HAL_Delay(2000);
    // очищаем дисплей
    lcdClrScr();
    // выводим текст на экран
    lcdPuts("Float = ");
    // выводим на экран число типа float с двумя знаками после запятой
    lcdFtos(pi,2);
    // устанавливаем позицию курсора
    lcdGoto(LCD_2nd_LINE,0);
    // выводим текст на экран
    lcdPuts("Integer = ");
    // выводим на экран число типа integer
    lcdItos(t);
    // ждем 3 секунды
    HAL_Delay(3000);
    // включаем режим: дисплей включен, мигание курсора отключен, курсор включен
    lcdSetMode(VIEW_MODE_DispOn_BlkOff_CrsOn);
    // устанавливаем позицию курсора
    lcdGoto(LCD_2nd_LINE,16);
    // в цикле удаляем всю строку backspace'ом
    for (int i = 0; i < 16; ++i)
    {
     lcdBackSpace();
     HAL_Delay(100);
    }
    // устанавливаем позицию курсора
    lcdGoto(LCD_1st_LINE,16);
    // в цикле удаляем всю строку backspace'ом
    for (int i = 0; i < 16; ++i)
    {
     lcdBackSpace();
     HAL_Delay(100);
    }
    // устанавливаем режим: дисплей включен, мигание отключен, курсор выключен
    lcdSetMode(VIEW_MODE_DispOn_BlkOff_CrsOff);
    // возвращаем курсор в дом
    lcdReturn();
    // печатаем текст с табуляцией
    lcdPuts("\tLoading...");
    // устанавливаем позицию курсора
    lcdGoto(PROGRESS_BAR_LINE, PROGRESS_BAR_WIDTH);
    // печатаем текст
    lcdPuts("[   %]");
    // в цикле показываем индикатор выполнения
    for(uint8_t i = 0; i <= PROGRESS_BAR_MAX_LOAD; ++i)
    {
     // устанавливаем позицию курсора
     lcdGoto(PROGRESS_BAR_LINE, PROGRESS_BAR_WIDTH + 1);
     // печать процентов выполнения в четко заданной позиции на три разряда
     lcdNtos((i*100)/PROGRESS_BAR_MAX_LOAD, 3 );
     // показываем текущее состояние индикатора выполнения
     lcdDrawBar(i);
     // ждем 1/10 секунды
     HAL_Delay(100);
    }
    // ждем 3 секунды
    HAL_Delay(3000);
    // очищаем дисплей
    lcdClrScr();
    /*
     * Загружаем символ пользователя к ячейке памяти 6 и 7 в дисплей
     * ячейки памяти от 0 по 5 заняты индикатором выполнения
     * если вы не используете индикатор выполнения, то можно загружать
     * с 0 ячейки памяти дисплея
     */
    lcdLoadChar(men1,6);
    lcdLoadChar(men2,7);
    // печатаем текст с табуляцией и переходом на новую строку
    lcdPuts("\tRunning men\n");
    // в цикле показываем бегущего человека :)))
    for(uint8_t i = 0; i < 8; i++)
    {
     lcdPutc(6);
     HAL_Delay(250);
     cursorShift(LEFT);
     lcdPutc(' ');
     lcdPutc(7);
     HAL_Delay(250);
     cursorShift(LEFT);
     lcdPutc(' ');
    }
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */

}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{

  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;

    /**Initializes the CPU, AHB and APB busses clocks 
    */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = 16;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL2;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Initializes the CPU, AHB and APB busses clocks 
    */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Configure the Systick interrupt time 
    */
  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

    /**Configure the Systick 
    */
  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

  /* SysTick_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}

/* USER CODE BEGIN 4 */
	// функция имитации печати текста с клавиатуры
void imitationPrinting(char *ptr)
{
	// устанавливаем режим с включенным курсором
 lcdSetMode(VIEW_MODE_DispOn_BlkOff_CrsOn);
 	// пока не конец строке
 while(*ptr != 0)
 {
	// печатаем текущий символ
  lcdPutc(*ptr++);
    // ждем 1/10 секунды
  HAL_Delay(100);
 }
   // устанавливаем режим с выключенным курсором
 lcdSetMode(VIEW_MODE_DispOn_BlkOff_CrsOff);
}
/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @param  file: The file name as string.
  * @param  line: The line in file as a number.
  * @retval None
  */
void _Error_Handler(char *file, int line)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  while(1)
  {
  }
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t* file, uint32_t line)
{ 
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

/**
  * @}
  */

/**
  * @}
  */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x