2 курс. 1 семестр / СС и ПОД / лаб5. Голубцов Максим
.docxМИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ
федеральное государственное автономное образовательное учреждение высшего образования
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ»
ИНСТИТУТ НЕПРЕРЫВНОГО И ДИСТАНЦИОННОГО ОБРАЗОВАНИЯ
КАФЕДРА 43
|
ОЦЕНКА
ПРЕПОДАВАТЕЛЬ
|
|
|
|
|
должность, уч. степень, звание |
|
подпись, дата |
|
инициалы, фамилия |
ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ
|
Взаимодействие с LCD дисплей посредством протокола i80
|
по дисциплине: (наименование дисциплины) |
РАБОТУ ВЫПОЛНИЛ
СТУДЕНТ ГР. № |
|
|
|
|
|
|
номер группы |
|
подпись, дата |
|
инициалы, фамилия |
Студенческий билет № |
|
|
|
|
Санкт-Петербург 2020
Цель работы
Изучить базовое устройство LCD дисплея на базе чипа ILI9325 и его взаимодействие с микроконтроллером. Поучить базовые навыки по выводу информации на дисплей с контроллера.
Задание
Реализовать программу вывода заданного изображения или анимации на LCD дисплей
Листинг программы:
main.c
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file : main.c
* @brief : Main program body
******************************************************************************
* @attention
*
* <h2><center>© Copyright (c) 2020 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under BSD 3-Clause license,
* the "License"; You may not use this file except in compliance with the
* License. You may obtain a copy of the License at:
* opensource.org/licenses/BSD-3-Clause
*
******************************************************************************
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "usart.h"
#include "gpio.h"
#include "lcd_ili93xx_driver.h"
#include "open32f3_lcd_utils.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
//Предварительное объявление функций и функции обратного вызова
void test_init(void);
int my_delay(void*, int);
int my_reset(void*);
int my_write_reg(void *, uint16_t, uint16_t);
int my_read_reg(void*, uint16_t, uint16_t*);
int my_write_words(void*, uint16_t, uint16_t*, size_t);
void callback_init(lcd_ili93xx_driver_t *lcd_driver);
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
//test_init();
/* 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_USART2_UART_Init();
/* USER CODE BEGIN 2 */
//Создание драйверов
lcd_ili93xx_driver_t lcd_driver;
lcd_ili93xx_init_clear(&lcd_driver);
// Инициализация коллбеков
callback_init(&lcd_driver);
int res = lcd_ili93xx_init(&lcd_driver);
if (!res)
{
// Driver initialization error.
// Show error somehow and stop application // ...
void Error_Handler();
}
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
//Отрисовка прямоугольника 200 Х 300 зеленого цвета
lcd_ili93xx_fill_rect_color(&lcd_driver, 0, 0, 200, 300, LCD_ILI93XX_COLOR_GREEN);
//Отрисовка прямоугольника 240 Х 320 красного цвета
lcd_ili93xx_fill_rect_color(&lcd_driver, 0, 0, 240, 320, LCD_ILI93XX_COLOR_RED);
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
/**
* @brief System Clock Configuration
* @retval None
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
/** Initializes the CPU, AHB and APB busses clocks
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS;
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL6;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
/** 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_1) != HAL_OK)
{
Error_Handler();
}
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2;
PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
{
Error_Handler();
}
}
/* USER CODE BEGIN 4 */
void callback_init(lcd_ili93xx_driver_t *lcd_driver)
{
lcd_driver->user_data = NULL;
lcd_driver->delay = &my_delay;
lcd_driver->reset = &my_reset;
lcd_driver->write_reg = &my_write_reg;
lcd_driver->read_reg = &my_read_reg;
lcd_driver->write_words = &my_write_words;
}
int my_delay(void* data, int ms)
{
return 0;
}
int my_reset(void* data)
{
return 0;
}
//Реализация коллбека для записи в регистр
int my_write_reg(void* data, uint16_t address, uint16_t value)
{
OPEN32F3_LCD_CLEAR_CS();
OPEN32F3_LCD_CLEAR_RS();
OPEN32F3_LCD_DATA_WRITE(address);
OPEN32F3_LCD_CLEAR_WR();
OPEN32F3_LCD_SET_WR();
OPEN32F3_LCD_SET_RS();
OPEN32F3_LCD_DATA_WRITE(value);
OPEN32F3_LCD_CLEAR_WR();
OPEN32F3_LCD_SET_WR();
OPEN32F3_LCD_SET_CS();
return 0;
}
//Реализация коллбека для чтения из регистра
int my_read_reg(void* data, uint16_t address, uint16_t* value)
{
OPEN32F3_LCD_CLEAR_CS();
OPEN32F3_LCD_CLEAR_RS();
OPEN32F3_LCD_DATA_WRITE(address);
OPEN32F3_LCD_CLEAR_WR();
OPEN32F3_LCD_SET_WR();
OPEN32F3_LCD_SET_RS();
OPEN32F3_LCD_DATA_SET_INPUT_MODE();
OPEN32F3_LCD_CLEAR_RD();
*value = OPEN32F3_LCD_DATA_READ();
OPEN32F3_LCD_SET_RD();
OPEN32F3_LCD_DATA_SET_OUTPUT_MODE();
OPEN32F3_LCD_SET_CS();
return 0;
}
//Реализация коллбека для записи слова
int my_write_words(void* data, uint16_t address, uint16_t* data_buf, size_t size)
{
OPEN32F3_LCD_CLEAR_CS();
OPEN32F3_LCD_CLEAR_RS();
OPEN32F3_LCD_DATA_WRITE(address);
OPEN32F3_LCD_CLEAR_WR();
OPEN32F3_LCD_SET_WR();
OPEN32F3_LCD_SET_RS();
for (size_t i = 0; i < size; i++)
{
OPEN32F3_LCD_DATA_WRITE(data_buf[i]);
OPEN32F3_LCD_CLEAR_WR();
OPEN32F3_LCD_SET_WR();
}
OPEN32F3_LCD_SET_CS();
return 0;
}
/* USER CODE END 4 */
/**
* @brief This function is executed in case of error occurrence.
* @retval None
*/
void Error_Handler(void)
{
/* USER CODE BEGIN Error_Handler_Debug */
/* User can add his own implementation to report the HAL error return state */
HAL_GPIO_WritePin(GPIOE, 0xFF00, GPIO_PIN_RESET);
while (1) {
HAL_Delay(500);
HAL_GPIO_TogglePin(GPIOE, 0x0200);
}
/* 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(char *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****/
Вывод: Реализованы 3 функции обратного вызова для записи в регистр, для чтения из регистра, для записи слова. Изучено базовое устройство LCD дисплея на базе чипа ILI9325 и его взаимодействие с микроконтроллером. Поучены базовые навыки по выводу информации на дисплей с контроллера.