Но главная новинка на этой плате — это видеовыход. До этого, как правило, использовался графический дисплей (монохром, 320 х 240). Но у этого подхода есть свои недостатки:
1. При переходе на цветной дисплей приличного размера > 5" с встроенным контроллером цена становится достаточной большой.
2. Использовать приходиться только один тип дисплея, так как интерфейсы, как правило несовместимы.
Но тут пришла мысль использовать стандартные автомобильные мониторы, цена которых, достаточно демократична, существует большое количество производителей и есть разные размеры.
Для этого пришлось реализовать видео выход.
![](https://habrastorage.org/files/321/f77/cd4/321f77cd48ce4154be9f57e146f85abf.jpg)
![](https://habrastorage.org/files/c0f/6aa/f66/c0f6aaf666a642c69eae10a05f71815d.jpg)
После поисков на просторах Интернета был обнаружен графический контроллер 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".
![](https://habrastorage.org/files/738/577/3c1/7385773c150341aa848a91fb1cc93d9d.jpg)
Это управление высоковольтным тестирующим устройством. Кроме видеовыхода на плате контроллера остался разъем для подключения монохромного дисплея Winstar WG320240C0.
Краткая характеристика основных узлов на плате контроллера:
- 6 разъемов с комплементарными ШИМ выходами для управления полумостами
- USB Host реализован на микросхеме VNC1L, в основном используется для записи информации на флешки.
- USB Device — микросхема FT232RL, используется для программирования микроконтроллера с компьютера через USB
- изолированный RS485 для связи с устройствами по MODBUS
- Wi-Fi на базе модуля ESP8266
- RTC — DS1307 с литиевой батарейкой, подключен по I2C
- 2 микросхемы флеш памяти, одна используется для хранения конфигурации устройства, другая для архивных данных
- ИОН на базе REF192
- 2 разъема расширения на 20 пин каждый, один для аналоговых сигналов, другой для цифровых.
Вот такой контроллер получился.
Комментарии (41)
SGordon123
12.04.2016 17:32-1А в результате получили мегапланшет?
sanders1967
13.04.2016 07:12Получилась система, которая позволяет использовать в качестве средства отображения любой видеомонитор.
mmMike
12.04.2016 18:15Забавно… с формированием и видеосигнала для телевизора из части основной адресной памяти проца вполне справлялся древний «Спектрум» на Z80. Там телевизор как монитор — был штатным решением.
Ну да… специализированная микросхема со своим буфером (заливаемым через порт… однако) вместо варианта как в «Спектрум»… это конечно круто.
А чем смысл статьи то? В том что нашли специализированную микросхему?beeruser
12.04.2016 21:09+1В Спектруме Z80 не занимался формированием видеосигнала. 1 такт Z80 это 2 пикселя.
А вот мелкие AVR-ки вполне справляются.
http://www.linusakesson.net/scene/craft/index.phpAlex_Eller
13.04.2016 07:08До вас пытаются донести мысль, что разработка 35-ти летней давности. Стоимость которой дешевле любого чипа, в этом «хайтеке». Даёт примерно схожий функционал)
И кстати автор по вашей ссылке не только не оригинален но и вообще, сильно отстал от жизни)
www.youtube.com/watch?v=y_d2hWXyykI
sanders1967
13.04.2016 07:13В том, что с этой платой в качестве устройства отображения можно использовать видеомонитор любого производителя и размера.
segment
12.04.2016 18:34+1С какими трудностями столкнулись при разработке? Как исправляли ошибки или сложные моменты из документации? В чем посыл статьи то? Ну платка как платка, стандартные микросхемы и решения.
sanders1967
13.04.2016 07:14Вы правы, решения стандартны. Особых проблем не было. Все заработало практически сразу.
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 вместо специализированной микросхемы и запихивания в нее данных из буфера.
.sanders1967
13.04.2016 07:18Приведенная статья описывает получение RGB сигнала, а не композитного видео. RGB вход есть далего не на всех мониторах.
mmMike
13.04.2016 07:32Ну если идет речь именно от таком ограничении… монитор только с S входом…
тогда да. одними резисторами и простым ЦАП не обойтись.
Хотя, если не требуется цветность и достаточно ЧБ изображения, то композитного выхода делается все просто.sanders1967
13.04.2016 07:34Вы правы. В свое время делал ЧБ видеогенератор на рассыпухе для 580ИК80А :)
Dark_Purple
12.04.2016 19:31Странный дизайн PCB…
SAnton2000
13.04.2016 07:08Похоже на схему метро
sanders1967
13.04.2016 07:34+1А в чем странность? Интересен взгляд со стороны.
Dark_Purple
13.04.2016 17:17Либо плата в 6 слоёв, либо 4 слоя и дороги во внутренних слоях когда внешние пустые, и то и другое странно.
sanders1967
14.04.2016 08:44Плата в 4 слоя, сигнальные проводники только на 1 и 4, один внутрений слой полностью залит полигоном GND, на втором внутреннем расположены только проводники питания — 5В, 3,3В и 1,5В и соответственно все свободное место залито полигоном GND. Сигнальных проводников на внутренних слоях нет.
Dark_Purple
14.04.2016 09:18Лучше сделать внутри плейн для GND и комбинированный плейн для питания без земли. На этой плате я бы все компоненты поставил с одной стороны — технологичнее.
sanders1967
14.04.2016 09:24Полностью с Вами согласен, но у микросхемы видеоконтроллера, половина цепей аналоговые, требуют своей аналоговой земли и довольно большого количества конденсаторов. Поэтому пришлось часть фильтрующих конденсаторов переносить на другую сторону. И если делать питание полигонами пришлось бы вводить еще 2 слоя, что я посчитал избыточным. И, в принципе, моя стандартная практика, фильтрующие кондесаторы по питанию, размещать на противоположной стороне, максимально близко от вывода.
32bit_me
12.04.2016 20:49А вы внутренние слои не сплошной заливкой делаете?
sanders1967
13.04.2016 07:20На приведенной картинке заливка выключена, иначе все было бы одного цвета. :) Все слои залиты полигоном GND.
lart
13.04.2016 07:08А почему не использовали встроенный в STM32F7 RTC? Сам делаю устройство на STM32F0 и планировал использовать встроенный, но может есть какие подводные камни?
sanders1967
13.04.2016 07:22Просто старое и обкатанное решение, переходит по инерции из проекта в проект. :) Может стоит и попробовать в новых проектах. Пока RTC процессора не использовал, про подводные камни не скажу.
x893
13.04.2016 07:08Конечно можно было бы использовать DMA, или на крайний случай BSRR. Но видимо это не нужно было.
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
x893
13.04.2016 16:21Посмотрел DS — по описанию всё должно работать через FSMC и с чтением и без. Интересный кодер — только ждать долго. Тоже сделаю себе на нем раскладной дисплей — 1 х 2 или 2 x 2. Мониторы действительно сильно дешевле с аналоговым входом.
Спасибо за наводку на чип!sanders1967
13.04.2016 16:26Если по срокам доставки — составила 2 недели. :) На здоровье, рад, что помог :)
sim-dev
Я пока что на ARM не перешел, но в курсе, что в них есть DMA — почему обновлением видеобуфера не занимается DMA?
mmMike
Потому что авторы даже FSMC поленились/не получилось/не подходит прикрутить.
И стробируют запись программным дерганьем ножки порта, как ардуинисты…
В таком варианте DMA «не работает».
Хотя казалось… пишут что раньше использовали дисплеи… неужели так же через порт!?
Хотя может зря наговариваю и FSMC уже у них используется а мультиплексор ставить лень/некуда.
nothern_wind
В этом контроллере [STM32F746] имеется целый интерфейс для подключения LCD и всяких разных дисплеев и микросхем типа VGA, DVI, LVDS и любых других совместимых с интерфейсами 8080/6800 и RGB. правда для этого интерфейса очень было бы здорово иметь дополнительный внешний SDRAM.
sanders1967
Вы, абсолютно правы, но видеосигнал с проца не получить. А именно аналоговый видеосигнал и был целью.
SGordon123
Тут же на хабре была статейка про это решение http://hackaday.com/2016/01/31/tv-transmitter-uses-esp8266/
mmMike
Я знаю.
Но я в данном случае критиковал еще большие частность — посылку данных через порт с программным стробом :)
ElectricFromUfa
Странно, что Вы не задались этим вопросом перед разводкой платы.
Дисплеи и раньше использовали с DMA через FSMC (ныне FMC).
FMC для того и создан, чтобы работать с внешними микросхемами через параллельную шину. Аппаратная выдача строба в нём должна быть обязательно.
grossws
Несколько некорректное утверждение. Существует и то, и то. Но на младших контроллерах нет поддержки DRAM (собственно Flexible Static Memory Controller), а на старших уже полноценный FMC с поддержкой DRAM.
sanders1967
Согласен с замечанием, в следующей версии платы и планирую использовать FMC & DMA
sanders1967
В следующей версии платы планирую переразвести под FMC и использовать DMA.