Старт ARM. Работа с графическим экраном SAM3N-EK. Часть 1-ая.

Всем привет!) Продолжаем серию уроков по программированию атмеловских АRМов. Сегодня речь пойдет о программирование и использовании графического экрана на борту отладочной платы sam3n-ek. На нашем evolution kitе стоит TFT экран TM020GDZ18 176×220 пикселей с интегрированным драйвером ILI9225B.

Как всегда создаем новый проект с поддержкой ASF, ASF это фреймворк атмел для работы с микроконтроллерами, большое количество библиотек (p.s. совсем не джедайский путь).

Работа с экраном осуществляться по SPI протоколу, информации по спиай протоколу много в интернете, поэтому описывать в этом уроке теоретические сведения не буду, опишу только в уроке посвященный SPI.

Принципиальная электрическая схема подключения LCD к SAM3N4C.
И так, для работы с графическим экраном нам понадобятся следующие библиотеки, открываем ASF Wizard (Alt + W) и добавляем их:

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

Подключаем необходимые заголовочные файлы

#include "asf.h"
#include "stdio_serial.h"
#include "conf_board.h"
#include "conf_clock.h"

Создаем структуру для работы с графическим экраном.

struct ili9225_opt_t g_ili9225_display_opt;

Создаем обработчик для SPI протокола.

void SPI_Handler(void)
{
	ili9225_spi_handler();
}

Создаем главную функцию и делаем всю инициализацию для работы с графическим экраном.

int main(void)
{
	sysclk_init();
	board_init();

	Инициализируем экран, передаем в структуру параметры экрана.
	g_ili9225_display_opt.ul_width = ILI9225_LCD_WIDTH;
	g_ili9225_display_opt.ul_height = ILI9225_LCD_HEIGHT;
	g_ili9225_display_opt.foreground_color = COLOR_BLACK;
	g_ili9225_display_opt.background_color = COLOR_WHITE;

	Выключаем backlight.
	aat31xx_disable_backlight();

	Инициализируем экран.
	ili9225_init(&g_ili9225_display_opt);

	Далее устанавливаем уровень backlight-а.
	aat31xx_set_backlight(AAT31XX_AVG_BACKLIGHT_LEVEL);

	
	Включаем дисплей.
	ili9225_display_on();

	Заполняем экран белым цветом.
	ili9225_set_foreground_color(COLOR_WHITE);
	ili9225_draw_filled_rectangle(0, 0, ILI9225_LCD_WIDTH, ILI9225_LCD_HEIGHT);

	Пишем текст на экране.
	ili9225_set_foreground_color(COLOR_BLACK);
	ili9225_draw_string(10, 20, (uint8_t *)"mcu.by");

	Рисуем круги красный, зеленый и синий.
	ili9225_set_foreground_color(COLOR_RED);
	ili9225_draw_circle(60, 80, 30);
	ili9225_set_foreground_color(COLOR_GREEN);
	ili9225_draw_circle(60, 120, 30);
	ili9225_set_foreground_color(COLOR_BLUE);
	ili9225_draw_circle(60, 160, 30);

	Рисуем линию.
	ili9225_draw_line(0, 0, 176, 220);
	
	И завершаем программу бесконечным циклом.
	while (1) {
	}
}

Собираем проект F7 и прошиваем его Ctrl+Shift+P.

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

#include "asf.h"
#include "stdio_serial.h"
#include "conf_board.h"
#include "conf_clock.h"

struct ili9225_opt_t g_ili9225_display_opt;

void SPI_Handler(void)
{
	ili9225_spi_handler();
}

void tank(int x, int y){
	ili9225_set_foreground_color(0x00FF00u);
	ili9225_draw_filled_rectangle(x+7,y+26, x+37, y+66);
	ili9225_set_foreground_color(0x333F00u);
	ili9225_draw_filled_rectangle(x+19,y+1, x+24, y+36);
	ili9225_draw_filled_circle(x+22, y+46, 10);
	ili9225_draw_filled_rectangle(x+18,y, x+25, y+3);
	ili9225_draw_filled_rectangle(x,y+26, x+7, y+66);
	ili9225_draw_filled_rectangle(x+37,y+26, x+44, y+66);
}

int main(void)
{
	sysclk_init();
	board_init();

	g_ili9225_display_opt.ul_width = ILI9225_LCD_WIDTH;
	g_ili9225_display_opt.ul_height = ILI9225_LCD_HEIGHT;
	g_ili9225_display_opt.foreground_color = COLOR_BLACK;
	g_ili9225_display_opt.background_color = COLOR_WHITE;

	aat31xx_disable_backlight();

	ili9225_init(&g_ili9225_display_opt);

	aat31xx_set_backlight(AAT31XX_AVG_BACKLIGHT_LEVEL);

	ili9225_display_on();

	ili9225_set_foreground_color(COLOR_WHITE);
	ili9225_draw_filled_rectangle(0, 0, ILI9225_LCD_WIDTH, ILI9225_LCD_HEIGHT);

	tank(80,100);

	while (1) {
		
		
	}
}

Управление танком с помощью кнопок реализуем во второй части, а сейчас всем пока.)