Tuesday, December 25, 2012

Portable console on STM32F407. Part 1. Introduction









Началось все с того, что приобрел ЖК дисплей разрешением 320x480 (ILI9481) и резистивный сенсорный экран с контроллером ADS7846. Дисплей подключал по FSMC. Контроллер сенсорного экрана по SPI.
В начале работы выполняется инициализация RTC (Read Time Clock), а так же параметры для перехода в режим сна (STANDBY Mode, потребление около 2мкА).

Были разработаны следующие драйвера:
  • Драйвер управления дисплеем:
    • Инициализация и настройка FSMC
    • Инициализация и настройка контроллера дисплея
    • Заливка экрана
    • Заливка пикселя
    • Рисования текста (используя таблицу шрифтов, в данном проекте это шрифт размерами 5x8)
    • Рисование основных геометрических примитивов (линии, эллипсы, прямоугольники)
    • Рисование изображений с внутренней (flash) памяти
    • Рисование изображений с карты памяти
    • Аппаратная прокрутка содержимого дисплея
  • Драйвер управления сенсорным экраном:
    • Инициализация и настройка SPI
    • Инициализация и настройка контроллера сенсорного экрана
    • Сохранение калибровочных данных на карту памяти
    • Загрузка калибровочных данных с карты памяти
    • Считывание значения текущего напряжения батареи (в ADS7843 такой функции нет)
  • Драйвер управления картой памяти:
    • Настройка транспорта SDIO
    • Реализация технологии файловой системы (FatFs)
Драйвер для управления дисплеем разделяется на два файла. В первом по шаблону записаны основные функции, такие как: настройка транспорта, инициализация, вывод пикселя, и получение разрешения дисплея. (эти файлы носят названия с конкретным названием дисплея, по сути они являются низкоуровневыми драйверами, имея множество таких файлов заполненных по одному шаблону, можно менять устройство вывода без каких либо затруднений). А так же файлы низкоуровневого управления (текст, фигуры, графика). 
Разобравшись с работой USART в STM32, я реализовал систему общения, буферизации принятых данных, и вывода принятых данных на дисплей. При полном заполнении экрана текстом, выполняется аппаратная прокрутка со смещением содержимого рабочей области терминала на одну строку.
Размер буфера можно изменять по мере необходимости (изначально был установлен в 50 000 символов, чего вполне хватало для умеренной работы). Для моргания курсора специально завел таймер, при срабатывании которого изменяется состояние курсора, и на каждое 100 срабатывание выполняется обновление значений и прорисовка часов и батареи. 
Также ввел поддержку esc-последовательностей (которые начинаются с \e и зависят от двух параметров), которые часто используются в терминалах для выделения участков теста цветом. Функции перевода строки, перевода каретки и табуляция так же поддерживаются. 
В процессе работы, вся полученная информацию из USART записывается на карту памяти в файле LOG.txt. Все настройки сохраняются в SETTINGS.txt
Реализована система обработки пользовательских элементов (кнопки, формы) при срабатывании сенсорного экрана. 
Встроенная пользовательская клавиатура для набора текста. Имеет русскую и английскую раскладку, а так же почти все символьные знаки что и на классической клавиатуре. При открытии и закрытии изменятся высота рабочей зоны терминала и зоны аппаратной прокрутки содержимого.
На панели задач отображается текущий номер страницы и клавиши переключения страниц (неактивны при развёрнутой клавиатуре). Индикатор батареи, который может быть раскрашен 3 цветами в зависимости от уровня заряда (зелёный, жёлтый, красный). Внутри индикатора отображается текущее время в формате часы : минуты. А так же кнопки открытия меню и изменения состояния клавиатуры.
В меню выполняется настройка скорости порта (BaudRate), и текущего времени. Там же можно перейти в режим сна (для выхода из режима сна необходимо нажать боковую кнопку на устройстве, при нажатии которой происходит перелистывание страниц вверх).
Ведется обслуживание USB Host для HID устройств. Мышку обслуживает здорово, правда иногда не с первого раза подхватывает. Клавиатуру классическую (больших размеров) тоже нормально обслуживает, но тоже порой не с первого раза подхватывает, и при нажатии на Caps Lock/Num Lock/Scroll Lock не зажигаются светодиоды на клавиатуре. А вот с клавиатурой небольших размеров (так же беспроводными) ничего не выходит - при нажатии клавиш ничего не приходит. (Может кто имел дело с этим?)
Так же на данном устройстве в последствии будет установлен Bluetooth модуль, с помощью которого можно будет общаться с устройствами без проводов. 

7 comments :

  1. Судя по печатной плате и монтажу конструкция радиолюбительская. Выполнена отлично. Компактно, аккуратно. Всякая конструкция выполняется для каких то целей. С трудом представляю себе область применения данной, и как связано применение с названием. Это- отображение.... управление... обслуживание... промежуточное звено....? Неплохо бы увидеть схему, рисунок печатной платы не вполне информативен. Ну а если бы еще и текст исходника.... Возможно я бы смог почерпнуть для себя немало полезного. Да и не только я.

    ReplyDelete
  2. Здравствуйте Gric,
    Спасибо за то, что оставили отзыв.
    Это первый комментарий, который был оставлен в моем блоге.
    Название устройства нелепо, просто как то сразу было задумано сделать портативный "гипер-терминал". Постепенно все глубже изучаю stm32, процессор сам по себе мощный и возможностей у него не мало. Сейчас работаю над тем, что бы превратить это в универсальную платформу, с собственным ядром, в котором будут функции управления установленной на борту периферии.
    Для меня данное устройство, своего рода конструктор - программный "трансформер". Есть в планах сделать из него пульт управления для робота "Johny". Возможно, сделаю погодную станцию, осциллограф, лог. анализатор...
    Схема и печатная плата пока что существует в набросках с множеством недочетов и ошибок, как только все упорядочу, обязательно выложу.
    По поводу исходников. Проект большой. Напишите, что конкретно Вас интересует. Выложу, либо вышлю интересующие Вас модули. В принципе, самое основное собрано в ядре (LCD, GUI, TouchPanel, SDIO, FatFs, работа с флешь МК, пользовательские элементы управления и т.д.)

    ReplyDelete
  3. Здравствуйте Иван!
    Поздравляю с достигнутым уровнем в железе и в софте, так держать!!
    Меня заинтриговали слова "Возможно, сделаю ... осциллограф, лог. анализатор..."
    Вопрос: а сколько тактов занимает чтение порта и запись его в память с авто_инк/декрементом.
    с Уважением Арпад

    ReplyDelete
  4. Я полагаю, что если использовать DMA, то около 1 такта. Выделяется память под буфер, и DMA без участия контроллера будет его заполнять. При его полном заполнении производить обработку полученных данных и выводить на дисплей.

    ReplyDelete
    Replies
    1. Здравствуйте Иван!
      Хотелось-бы посмотреть на меандр полученным через DMA.
      А сможете-ли сделать такое? загонять меандр с DMA.
      1) с РА8(МСО1) получаете 4/8/16 МГц перемычкой подаете на РЕ4
      2) запоминаете в буфере меандр 320/(480) значений
      3) отображаете на экране меандр 320/(480) значений
      4) цикл новые данные на запоминание - отображение и так непрерывно до 20-30 кадров в секунду
      5) выставляете коротенькое видео на 10-15 секунд.
      P.S.Сам играюсь на дисплее LS020_(CX65)

      Delete
  5. Здравствуйте Иван.
    Не могли бы Вы мне скинуть исходники схемы и разводки?
    Я наладил свое составное usb устройство на stm32f4discovery, и мне надо перейти на свою плату с минимальным набором элементов.
    С уважением Стафеев Павел.
    pavel.stafeev@mail.ru

    ReplyDelete
  6. This comment has been removed by the author.

    ReplyDelete