По роду своей работы часто приходится проектировать различные виды управляющих и измерительных систем. Разумеется на базе микроконтроллеров. Сначала использовали AVR, потом следующее семейство ATxMega, в конце концов остановились на семействе STM32. Несмотря на разные функционал проектируемых устройств, масса функций остается неизменной: интерфейс с пользователем и внешними устройствами, сохранение данных, часы реального времени и т. п. Поэтому появилась идея сделать универсальную плату контроллера содержащую основные узлы, а дополнительные подключаемые платы будут расширять функционал до необходимого. Сначала это был контроллер на STM32F103, потом на 207, потом на 429. И вот на 746 кристалле.

Но главная новинка на этой плате — это видеовыход. До этого, как правило, использовался графический дисплей (монохром, 320 х 240). Но у этого подхода есть свои недостатки:

1. При переходе на цветной дисплей приличного размера > 5" с встроенным контроллером цена становится достаточной большой.
2. Использовать приходиться только один тип дисплея, так как интерфейсы, как правило несовместимы.

Но тут пришла мысль использовать стандартные автомобильные мониторы, цена которых, достаточно демократична, существует большое количество производителей и есть разные размеры.

Для этого пришлось реализовать видео выход.





После поисков на просторах Интернета был обнаружен графический контроллер S1D13746F01, который имеет встроенную память 321 кБ и композитный видеовыход.Конечно есть и S-Video, но он не планировался использоваться. Так же был обнаружен и даташит на Evaluation Board с подробной схемой подключения, правда на корпус, который имеет 100 выводов.

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

Для организации видеобуфера потребуется 320 * 240 = 76800 байт. Количество цветов при этом будет равным 256. Такой формат кодирования цвета обозначен в документации на видеоконтроллер, как RGB 3:3:2. То есть 3 бита на красный, 3 бита на зеленый и 2 бита на синий цвет. Итого 8 красных цветов различного уровня, 8 зеленых и 4 синих.

Запись в видеочип осуществляется программным способом через порт. Вот программка на Си.

void refresh_display(void)
{
  unsigned long   h, s;
  unsigned short  out_port; 
  
  for (s = 0; s < Height_window; s++) //строки
  {
    for (h= 0; h < Width_window; h++) //столбцы
    {
      out_port = gLCD_port->ODR;
      out_port &= 0xFF00;
      out_port |= video_buffer[h] [s];  //данные 
      gLCD_port->ODR = out_port;

      gLCD_color_WE_low; //запись
      gLCD_color_WE_high;
    }
  }
}


Время записи всего видеобуфера составляет примерно 20мсек. При желании можно выводить видео 50 кадров / сек, но контроллер будет заниматься только выводом. :) В реальных задачах необходимо осуществлять перезапись экрана от 3 до 10 раз в секунду.

И вот картинка на подключенном автомобильном мониторе, купленном в ближайшем магазине. Размер монитора — 7".



Это управление высоковольтным тестирующим устройством. Кроме видеовыхода на плате контроллера остался разъем для подключения монохромного дисплея Winstar WG320240C0.

Краткая характеристика основных узлов на плате контроллера:

  • 6 разъемов с комплементарными ШИМ выходами для управления полумостами
  • USB Host реализован на микросхеме VNC1L, в основном используется для записи информации на флешки.
  • USB Device — микросхема FT232RL, используется для программирования микроконтроллера с компьютера через USB
  • изолированный RS485 для связи с устройствами по MODBUS
  • Wi-Fi на базе модуля ESP8266
  • RTC — DS1307 с литиевой батарейкой, подключен по I2C
  • 2 микросхемы флеш памяти, одна используется для хранения конфигурации устройства, другая для архивных данных
  • ИОН на базе REF192
  • 2 разъема расширения на 20 пин каждый, один для аналоговых сигналов, другой для цифровых.

Вот такой контроллер получился.

Комментарии (41)


  1. sim-dev
    12.04.2016 16:17

    Я пока что на ARM не перешел, но в курсе, что в них есть DMA — почему обновлением видеобуфера не занимается DMA?


    1. mmMike
      12.04.2016 18:25
      +3

      Потому что авторы даже FSMC поленились/не получилось/не подходит прикрутить.
      И стробируют запись программным дерганьем ножки порта, как ардуинисты…

      В таком варианте DMA «не работает».

      Хотя казалось… пишут что раньше использовали дисплеи… неужели так же через порт!?
      Хотя может зря наговариваю и FSMC уже у них используется а мультиплексор ставить лень/некуда.


      1. nothern_wind
        13.04.2016 07:08

        В этом контроллере [STM32F746] имеется целый интерфейс для подключения LCD и всяких разных дисплеев и микросхем типа VGA, DVI, LVDS и любых других совместимых с интерфейсами 8080/6800 и RGB. правда для этого интерфейса очень было бы здорово иметь дополнительный внешний SDRAM.


        1. sanders1967
          13.04.2016 07:10

          Вы, абсолютно правы, но видеосигнал с проца не получить. А именно аналоговый видеосигнал и был целью.


          1. SGordon123
            13.04.2016 11:31

            Тут же на хабре была статейка про это решение http://hackaday.com/2016/01/31/tv-transmitter-uses-esp8266/


        1. mmMike
          13.04.2016 07:19
          +1

          Я знаю.
          Но я в данном случае критиковал еще большие частность — посылку данных через порт с программным стробом :)


      1. ElectricFromUfa
        13.04.2016 07:08

        Странно, что Вы не задались этим вопросом перед разводкой платы.

        Дисплеи и раньше использовали с DMA через FSMC (ныне FMC).

        FMC для того и создан, чтобы работать с внешними микросхемами через параллельную шину. Аппаратная выдача строба в нём должна быть обязательно.


        1. grossws
          19.04.2016 00:56

          FSMC (ныне FMC).

          Несколько некорректное утверждение. Существует и то, и то. Но на младших контроллерах нет поддержки DRAM (собственно Flexible Static Memory Controller), а на старших уже полноценный FMC с поддержкой DRAM.


      1. sanders1967
        13.04.2016 07:11

        Согласен с замечанием, в следующей версии платы и планирую использовать FMC & DMA


      1. sanders1967
        13.04.2016 07:27

        В следующей версии платы планирую переразвести под FMC и использовать DMA.


  1. SGordon123
    12.04.2016 17:32
    -1

    А в результате получили мегапланшет?


    1. sanders1967
      13.04.2016 07:12

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


  1. mmMike
    12.04.2016 18:15

    Забавно… с формированием и видеосигнала для телевизора из части основной адресной памяти проца вполне справлялся древний «Спектрум» на Z80. Там телевизор как монитор — был штатным решением.
    Ну да… специализированная микросхема со своим буфером (заливаемым через порт… однако) вместо варианта как в «Спектрум»… это конечно круто.

    А чем смысл статьи то? В том что нашли специализированную микросхему?


    1. beeruser
      12.04.2016 21:09
      +1

      В Спектруме Z80 не занимался формированием видеосигнала. 1 такт Z80 это 2 пикселя.

      А вот мелкие AVR-ки вполне справляются.
      http://www.linusakesson.net/scene/craft/index.php


      1. mmMike
        13.04.2016 06:09

        А я где то написал что это делалось программно? Я сказал в «Спектруме». А «спектрум» это не только Z80, а еще горсть микросхем.


        1. beeruser
          13.04.2016 08:40

          Да я невнимательно прочитал ваш коммент =)


      1. Alex_Eller
        13.04.2016 07:08

        До вас пытаются донести мысль, что разработка 35-ти летней давности. Стоимость которой дешевле любого чипа, в этом «хайтеке». Даёт примерно схожий функционал)

        И кстати автор по вашей ссылке не только не оригинален но и вообще, сильно отстал от жизни)
        www.youtube.com/watch?v=y_d2hWXyykI


        1. sanders1967
          13.04.2016 07:32

          Смотрел я на эту микросхему, которая AD725. В ней нет видео буфера.


    1. sanders1967
      13.04.2016 07:13

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


  1. segment
    12.04.2016 18:34
    +1

    С какими трудностями столкнулись при разработке? Как исправляли ошибки или сложные моменты из документации? В чем посыл статьи то? Ну платка как платка, стандартные микросхемы и решения.


    1. sanders1967
      13.04.2016 07:14

      Вы правы, решения стандартны. Особых проблем не было. Все заработало практически сразу.


  1. mmMike
    12.04.2016 18:44
    +1

    Вдогонку…

    Время записи всего видеобуфера составляет примерно 20мсек. При желании можно выводить видео 50 кадров / сек, но контроллер будет заниматься только выводом. :) В реальных задачах необходимо осуществлять перезапись экрана от 3 до 10 раз в секунду.


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

    Google: «формирование видеосигнала stm32»

    сразу нахожу…

    http://we.easyelectronics.ru/STM32/generator-video-na-stm32f407-recept-bystrogo-prigotovleniya.html

    8 выводов порта + 11 резисторов + использование DMA вместо специализированной микросхемы и запихивания в нее данных из буфера.
    .


    1. sanders1967
      13.04.2016 07:18

      Приведенная статья описывает получение RGB сигнала, а не композитного видео. RGB вход есть далего не на всех мониторах.


      1. mmMike
        13.04.2016 07:32

        Ну если идет речь именно от таком ограничении… монитор только с S входом…
        тогда да. одними резисторами и простым ЦАП не обойтись.

        Хотя, если не требуется цветность и достаточно ЧБ изображения, то композитного выхода делается все просто.


        1. sanders1967
          13.04.2016 07:34

          Вы правы. В свое время делал ЧБ видеогенератор на рассыпухе для 580ИК80А :)


  1. Dark_Purple
    12.04.2016 19:31

    Странный дизайн PCB…


    1. SAnton2000
      13.04.2016 07:08

      Похоже на схему метро


      1. sanders1967
        13.04.2016 07:34
        +1

        А в чем странность? Интересен взгляд со стороны.


        1. Dark_Purple
          13.04.2016 17:17

          Либо плата в 6 слоёв, либо 4 слоя и дороги во внутренних слоях когда внешние пустые, и то и другое странно.


          1. sanders1967
            14.04.2016 08:44

            Плата в 4 слоя, сигнальные проводники только на 1 и 4, один внутрений слой полностью залит полигоном GND, на втором внутреннем расположены только проводники питания — 5В, 3,3В и 1,5В и соответственно все свободное место залито полигоном GND. Сигнальных проводников на внутренних слоях нет.


            1. Dark_Purple
              14.04.2016 09:18

              Лучше сделать внутри плейн для GND и комбинированный плейн для питания без земли. На этой плате я бы все компоненты поставил с одной стороны — технологичнее.


              1. sanders1967
                14.04.2016 09:24

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


      1. sanders1967
        13.04.2016 13:35

        Моя жена, глядя на платы, сравнивает с планом города :)


  1. 32bit_me
    12.04.2016 20:49

    А вы внутренние слои не сплошной заливкой делаете?


    1. sanders1967
      13.04.2016 07:20

      На приведенной картинке заливка выключена, иначе все было бы одного цвета. :) Все слои залиты полигоном GND.


  1. lart
    13.04.2016 07:08

    А почему не использовали встроенный в STM32F7 RTC? Сам делаю устройство на STM32F0 и планировал использовать встроенный, но может есть какие подводные камни?


    1. sanders1967
      13.04.2016 07:22

      Просто старое и обкатанное решение, переходит по инерции из проекта в проект. :) Может стоит и попробовать в новых проектах. Пока RTC процессора не использовал, про подводные камни не скажу.


  1. x893
    13.04.2016 07:08

    Конечно можно было бы использовать DMA, или на крайний случай BSRR. Но видимо это не нужно было.


    1. sanders1967
      13.04.2016 07:25

      Для формирования строба используется именно BSRR.

      gLCD_color_WE_low; //запись
      gLCD_color_WE_high;

      #define gLCD_color_WE_high GPIOI->BSRR = GPIO_BSRR_BS_3; //Port I Set bit 3
      #define gLCD_color_WE_low GPIOI->BSRR = GPIO_BSRR_BR_3; //Port I Reset bit 3


  1. x893
    13.04.2016 16:21

    Посмотрел DS — по описанию всё должно работать через FSMC и с чтением и без. Интересный кодер — только ждать долго. Тоже сделаю себе на нем раскладной дисплей — 1 х 2 или 2 x 2. Мониторы действительно сильно дешевле с аналоговым входом.
    Спасибо за наводку на чип!


    1. sanders1967
      13.04.2016 16:26

      Если по срокам доставки — составила 2 недели. :) На здоровье, рад, что помог :)