Обвязка stm32 описание и инструкция по программированию. Подключение микроконтроллера. Ликбез. комментариев на « Подключение COG LCD дисплея на ST7565R контроллере»

Дисплей имеет разрешение 128х64 точки, но, как и большинство монохромных дисплеев, имеет постраничную организацию.

Экран разбит на 8 страниц высотой по 8 точек (строк), которые образуют байт. Прямое обращение к произвольной точке невозможно, обращение производиться постранично.

То есть для того, что бы закрасить один пиксель по координате X=1 Y=5, нам будет нужно записать первый столбец нулевой страницы целиком X=1 Y=0-7. Для этого нужно или хранить видео буфер в контроллере; или перед записью считать блок, затем его модифицировать и только потом записать его; или хорошо представлять структуру экрана и учитывать её при выводе надписей, графиков, рисунков… В самом простом — текстовом — варианте работы с такими дисплеями, достаточно использовать шрифт кратный по высоте 8 точкам (1 странице) и выводить его кратно 8 точкам: 0,7,15…

Прошивка/библиотека

Библиотека для работы с дисплеями на контроллере ST7565R по параллельному интерфейсу 8080 в текстовом режиме была написана на основе даташита и исходника идущего с подобным дисплеем от другого производителя. Команды и были взяты и адаптированы из ранних моих проектов по дисплеям от и . Библиотека подходит для дисплеев на основе контроллера ST7565R. При её использование нужно учитывать особенности каждого отдельно взятого дисплея, например, то, какие линии управления у дисплея инвертированы, а какие нет. Так же она написана под
семейство контроллеров stm32f1xx, при использовании её на других контроллерах нужно изменить функцию инициализации выводов и define’ы отвечающие за управления выводами.

Библиотека содержит следующий функции:

lcd_init_pins (); Инициализация выводов дисплея
lcd_delay (unsigned long p ); Задержка
lcd_write_data (unsigned char dat ); отправка данных на дисплей
lcd_write_cmd (unsigned char cmd ); Отправка команд
lcd_Initial_Dispay_Line (unsigned char line ); Адрес первой строки дисплея
lcd_Set_Page_Address (unsigned char add ); Установка строки (заменена lcd_gotoxy)
lcd_Set_Column_Address (unsigned char add ); Установка столбца (заменена lcd_gotoxy)
lcd_Power_Control (unsigned char vol ); Управление питанием
lcd_Regulor_Resistor_Select (unsigned char r );
lcd_Set_Contrast_Control_Register (unsigned char mod ); Установка контрастности дисплея
lcd_init (void); Инициализация дисплея
lcd_clear (void); Очистка дисплея
lcd_gotoxy (unsigned char x ,unsigned char y ); Установка текстового курсора
x — столбец, y — строка (страница)
unsigned char lcd_symbol_decode (unsigned char c ); Декодирование сжатой ASCII таблицы
c — код символа в ASCII
lcd_putch (unsigned char c ); Вывод символа на дисплей
c — символ
lcd_putch_inv (unsigned char c ); Вывод инвертированного (закраска) символа
c — символ
lcd_puts (char *s ); Вывод строки
s — строка
lcd_puts_inv (char *s ); Вывод инвертированной строки
s — строка
void lcd_test (void); Тестовое заполнение дисплея подряд идущим символами
lcd_putch_big_prototype (unsigned char col ,unsigned char row ,char c , unsigned char inv ); Вывод символов х2 х4 х8 размера
col — ширина
row — высота
c — символ
inv — инверсия 0 — выкл, 1 -вкл
lcd_putch_big (char c ); Вывод символа размера х2
c — символ
lcd_puts_big (char *s ); Вывод строки х2
s — строка
lcd_puts_int2 (unsigned char v ); Вывод числа из двух цифр (простая функция)
v — число от 0 до 99
lcd_puts_int (int v ); Вывод числа.
v — число от -32768 до 32767
lcd_puts_long (unsigned long v ); Вывод длинного 4 Байтового числа (внимание! функция занимает много памяти)
v — число от -2147483648 до 2147483647

Инициализация выводов дисплея производиться путём настройки следующих define’ов в файле ST7565R.h , для stm32f1xx контроллеров.

#define INVERT_MODE 1 // перевернуть дисплей #define lcd_port_data GPIOB // порт линий данных #define lcd_port_data_rcc RCC_APB2Periph_GPIOB // тактирование порта линий данных #define lcd_port_data_offest 0 // смещение, если начальный вывод не 0 #define lcd_pins_data GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; // линии данных, должны идти подряд по возрастающей #define lcd_port_control GPIOB // порт линий команд #define lcd_port_control_rcc RCC_APB2Periph_GPIOB // тактирование порта линий команд #define lcd_pin_RS GPIO_Pin_14 // линия выбора команды/данные #define lcd_pin_RW_WR GPIO_Pin_13 // линия чтение/запись #define lcd_pin_E_RD GPIO_Pin_12 // линия enable, разрешения #define lcd_pin_CS1 GPIO_Pin_11 // линия выбора кристала/дисплея #define lcd_pin_RST GPIO_Pin_15 // линия сброса

Если семейства контроллера отличается, то нужно будет подправить настройку выводов МК функция в файле ST7565R.c: lcd_init_pins, функции вывода данных и команд — lcd_write_data, lcd_write_cmd , а так же define управляющих линий в ST7565R.h .

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

Init(); // инициализация контроллера GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_SET); // включить светодиод delay_ms(100); // задержка 100 мс lcd_init_pins(); // инициализация выводв LCD delay_ms(100); lcd_init(); // инициализация LCD delay_ms(100); GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_RESET); // выключить светодиод lcd_clear(); // очистка дисплея lcd_gotoxy(0,0); // установить курсора по координатам x=0 , y=0 lcd_puts("COG"); // вывод строки lcd_gotoxy(3,0); // установить курсора по координатам x=3 , y=0 lcd_puts_big("LCD128x64"); // вывод строки шрифтом x2 lcd_gotoxy(0,2); // установить курсора по координатам x=0 , y=2 lcd_puts("GS-GG1286456FFWJ-A-R"); lcd_gotoxy(0,3); lcd_puts("controller ST7565R on"); lcd_gotoxy(0,4); lcd_puts("mc stm32f103c8t6"); lcd_gotoxy(0,5); lcd_puts_big("Alex_EXE"); lcd_gotoxy(10,7); lcd_puts("сайт");

Думаю, нечего дополнительно комментировать не нужно, в коде комментарии достаточны.

Статья обновлена 23.04.2016

18 комментариев на « Подключение COG LCD дисплея на ST7565R контроллере»

    Добрый день!
    Периодически посещаю ваш сайт и слежу за новыми обновлениями, т.к. сам начинал с pic-ов и в данный момент работаю с stm32.
    Очередная хорошая статья! Жаль, что чуть раньше не вышла)
    Пару месяцев назад тоже пришлось разбираться с контроллером ST7565 на экране w012864C2-TFH от WINSTAR и писать свою библиотеку под русские шрифты разной величины и стиля (подключение по spi).
    Очень помогла вот эта статья:
    http://edeca.net/wp/electronics/the-st7565-display-controller/
    и программа для генерации шрифтов на странице автора.
    Возможно вам тоже будет интересно.

    Удачи и успеха во всем.

    К сожалению, что-то написание этой статьи у меня затянулось, начал её ещё в декабре прошлого года.
    Хотел всё её написать более развёрнутой (программную часть), а в итоге вчера дописал до необходимого минимума и выложил. Может быть ближайшее время немного дополню её.
    С данными дисплеями с удовольствием работаю уже более 2-х лет.

    В своих статьях Вы выкладываете только основу кода, для запуска и понимания работы модуля. Интересно, как у Вас организован вывод русских символов 🙂
    Данный вопрос возник еще при использовании библиотеки на 1602 дисплей, брал ее за образец для своего проекта.
    Я пользуюсь Keil и для меня в обоих случаях сложность была связана с соотнесением кода русской буквы в таблице дисплея с кодом в отладчике)
    Интересно, какой средой разработки Вы пользуетесь и какое решение использовали =)

    С Уважением, Юрий

    Сейчас использую CooCox, у него проблем с кириллицей не наблюдается. В Keil по началу библиотеку работы с дисплеем и все сообщения на русском писал в notepad++. Потом как то случайно, файл перевёлся, кажется, в юникод, из под него с кириллицей в Keil стало возможно работать. Точнее объяснить не смогу, т.к. уже забыл, по моему, на этот вопрос не раз давал ответ в комментариях к ранее описанным символьным дисплеям под stm32.
    Когда закончил изучение и перешел к проекту, над которым до сих пор работаю, то сразу оценил, что выйду за ограничение в 32КБ и перешел на другую IDE.

    Статью слегка дополнил.

    Владимир пишет 20.10.2016 в 20:15

    А нет ли у вас случайно конвертера изображений 128*64,чтобы на выходе получить массив,как в вашей программе Image generator 84*48 дисплея от нокиа.

    Как промню, у меня на сайте есть 2 программы image generator. Первая генерирует для нокии т.е. 84х48, это первая версия программы и та статья иметь пометку устарела. Вторая версия генерирует до 320х240.

    вряд ли есть что-то из паябельного дешевле дисплея от nokia 1202
    по цене 70! р.

    Статья не об этом. Читайте внимательно предисловие.
    Если в своих конструкциях хотите использовать — то используйте дисплеи от сотовых, сам когда то так делал, кстати по дисплеям от нокии у меня есть несколько статей. Я же данный дисплей применяю в серийном устройстве, ну и в своих конструкциях перешел на него то же.

    Алексей пишет 19.02.2017 в 00:40 Обвязка у подобных дисплеев примерно одинакова, но выводы могут располагаться по другому, название выводов одинаковы. Схема включения может немного различаться.
    Поэтому на выбранный дисплей в любом случае нужен даташит. Схемы включения всех дисплеев брал из официальной документации именно на конкретные марки.
    В статье видны 4 разные дисплея, у 3-х (на зеленой платке) схема включения и распиновка оказалась одинаковой и она отличается от GG1286456FFWJ-A-R.

    спасибо! очень помог

    Александр Д пишет 25.02.2018 в 18:34

    Добрый день!
    В моем устройстве был использован довольно редкий дисплейный модуль COG с матрицей 132×64 на контроллере Solomon SSD1815BZ. К сожалению ничего похожего в сети сейчас не обнаруживается. Максимально близкое это 132×64 на контроллере ST7567, где-то прочитал что у них система команд одинаковая. Однако по распиновке не у всех контактов есть прямое соответствие. Можете ли как-то помочь по данному вопросу? Т.е. имеется ли возможность один заменить другим? И что будет если установить дисплей на контроллере SSD1815BZ но с матрицей 128×64 — будет ли работать вообще?

    Данные дисплеи бывают с разными интерфейсами SPI, i2c, 8080. Некоторые поддерживают несколько, выбор производится соответствующими выводами.
    Для дисплеев с интересом 8080: идут 8 линий данных и 5 линий управления, у которых в разных источниках разные названия, даже у меня на сайте на принципиальной схеме название одно, а на pcb, которая была разработана много ранее, другое (использовались разные даташиты на разные дисплеи, а управление одинаковое); порядок у меня совпадает, ищите аналогию использую эти две картинки.
    CS — выбор кристалла
    Reset (RST) — сброс
    RS — выбор команд/данных
    E (A0) — разрешение
    RW/RD — запись/чтение
    При подключении подобных дисплеев так же нужно обратить внимание на линии подключения конденсаторного умножителя: CAP+- V1… Вот здесь нужен даташит. Но можно попробовать подобрать по аналогии, некоторая зависимость по названиям просматривается, но у таких дисплеев бывает несколько схем включения умножительных конденсаторов.
    По разрешению:
    отличие разрешения и смещение — не страшно, его можно настроить или во время инициализации (если есть соответствующие команды) или компенсировать при выводе данных на дисплей.
    В инициализации так же есть свои нюансы:
    Выбор напряжения умножителя и схемы включения конденсаторов умножителя, контрастность, начало вывода (угол), ориентация горизонтальная/вертикальная, развертка (чересстрочная, последовательная…)… Это уже будет зависеть от типа дисплея. Здесь критические могут быть только первые пункты, остальные можно будет без документации подобрать уже во время работы.

    Александр Д пишет 27.02.2018 в 18:54

    Спасибо за ответ!
    Вообще ситуация такова, что сильно ограничены в возможности внесения каких-либо программных изменений кода. Условно имеем «черный ящик» с 18-пиновым выходом и анод/катод для подсветки. В этот разъем был включен дисплей, который надо заменить. Даташиты, распиновка есть. На рынке нет ничего похожего… Максимально подходящий дисплей из доступных на ST6757 практически с аналогичной распиновкой (порядок пинов тот же, но обратный). Бустера (умножителя) на новом дисплее нет. Вопросы по соответствию контактов 1..5 SSD1815BZ и 10..12 ST6757 соответственно. Можно ли просто тупо включить другой дисплей в разъем через переходник и что подавать на контакты 10-12? Если у вас есть время и возможность помочь советом, напишите на email…

    Дисплей на SSD1815BZ
    1.V6 (This pin is the most negative LCD driving voltage)
    2.V5
    3.V4
    4.V3
    5.V2 (V2-V5 — These are the LCD driving voltage levels)
    6.C2P
    7.C2N
    8.C1N
    9.C1P
    10.C3N
    11.VEE
    12.VSS
    13.VDD
    14.SDA
    15.SCK
    16.D/C
    17./RES
    18./CS
    K
    A

    Дисплей на ST6757
    1.A
    2.K
    3./CS
    4./RES
    5. A0 (D/S)
    6.SCK
    7.SDA
    8.VDD
    9.VSS
    10.V0 (Positive LCD driver supply voltage)
    11.XV0 (Negative LCD driver supply voltage)
    12.VG (LCD driving voltage for segments)

Программатор

Для заливки прошивки в память микроконтроллера и отладки программы используется интерфейс SWD, который требует вывода 4 линий:

  • GND - нужно объединить земли устройства и программатора;
  • SWDIO - линия, по которой передается побитово прошивка и осуществляется отладка;
  • SWSCK - синхронизирующий сигнал, необходим для отправки прошивки;
  • RESET - необходимо перезагрузить МК после заливки прошивки.

Ножки данных линий вы также можете найти в в соответствующем разделе.

Причиной перезагрузки МК могут служить следующие причины:

  • сброс;
  • низкий уровень NRST;
  • не хватка напряжения питания.

Обычно для внешней цепи сброса требуется подтягивающий резистор, однако МК STM32F1xx не нуждается во внешнем подтягивающем резисторе для сброса (ножка NRST). Рекомендуемая величина времязадающего конденсатора - 100 нФ.

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

Решил написать книгу …
… про реальную разработку устройств на stm32. Поэтому думаю обновления если и будут, то нерегулярным и в основном в виде кусочков из книги.
Что бы не было скучно, вот вам малюсенький кусочек, можно сказать бета-версия про кварцевые резонаторы и вообще частоты.

Сами по себе микроконтроллеры работать не умеют. Им нужны всякие сопутствующие элементы. Вот к примеру, STM32L05 умеет работать с USB без всяких внешних кварцевых резонаторов, а STM32L152 - нет. Если мы планируем использовать более-менее точное время в наших проектах, то нам жизненно необходим внешний часовой кварцевый резонатор. Без него уход времени на 5-10 минут в сутки станет совершенно нормальным. И более того, он будет не постоянным и зависеть от температуры, напряжения питания и кучи других вещей.

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

Клоки, тайминги и шины

Одна из самых распространенных причин неработоспособности чего-либо - неправильная конфигурация частот и всего, что с этим связано. Наступило время раскрытия еще одной вкладки в кубе - Clock configuration. Я открыл новый проект, взял выбранный микроконтроллер, и включил rtc, usb и пару uart. Просто для примера. Открываем вкладку и видим примерно следующее

Слева «источники» тактовых сигналов, а справа - их «получатели». Пока сигнал дойдет с одного края до другого, он может пройти через умножители и делители, а может и напрямую. Для удобства красным подсвечивается то, что куб считает неправильным. Нет, вы можете нажать кнопку «сгенерировать код», скомпилировать полученное и залить (программист всегда прав!), но контроллер работать не будет.

Давайте начнем слева. У stm32 могут быть источники тактовых сигналов высокой (HS) и низкой (LS) частоты. Они могут быть внутренними (I) или внешними (E). Те, что сейчас в работе - подсвечиваются синим. Например, сейчас используется два источника - на 37 килогерц и на 16 мегагерц.

Теперь ваша задача пройти лабиринт, выставив все в нужных положениях. Задача осложняется тем, что можно выставить все в § «зеленое», но потом обнаружить, что частоту uart нельзя будет поднять больше 300бод. В общем, у программистов ST получилась этакая игрушка для взрослых. А теперь представьте, что раньше все это надо было рассчитывать руками, после неоднократного чтения документации и выяснить, будет ли это работать можно было только экспериментально.

В нашем случае все просто: изменив пару параметров в PLL (программируемый множитель), я легко добился исчезновения «красного». Почти.

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

Ок, идем на первую вкладку и около RCC видим такую картину

Disable - это понятно, выключено. Bypass - это прием тактового сигнала с внешнего источника. Ведь с stm можно сделать так, что бы куча микроконтроллеров работала в одном ритме, ибо это очень сильно облегчает вопросы взаимодействия чипов между собой. Например, так сделано на всех discovery платах, что я видел. Там в «программаторской» части стоит кварцевый резонатор, который «питает» чип программатора, а тот в свою очередь отдает тактовый сигнал чипу на плате. И ну последний пункт - это свой, так сказать, персональный кварцевый резонатор.

Так как у нас тестовый проект «на побаловаться», включаем оба на «резонатор» и смотрим, что получилось.

Как видно, частоту «часового» резонатора нам менять не дают, а вот частоту «быстрого» - сколько влезет. Опять придется идти в магазин и смотреть, какие есть, почем дают и подойдут ли нам.

Открываем даташит (я его на всякий случай положил в 02_switch) и ищем требования к кварцам. У кварцевых резонаторов, кроме частоты, есть еще два параметра – емкость и частота увода. Емкость в pF, нужна для расчета «запускающих» конденсаторов, а с ppm немного сложнее

Аббревиатура ppm означает parts per million или количество миллионных частей от основной частоты. Говоря иначе, погрешность 100 ppm для 100 МГц означает уход частоты на 100/1000000 часть от 100 МГц. Таким образом, частота может уйти на 100000000 * 100 / 1000000 = 10000 Гц (10 кГц, или 0.01 МГц), то есть финальная частота может быть любой в диапазоне 99.99 ... 100.01 МГц. Или говоря другими словами чем меньше ppm, тем лучше. Итак, смотрим в даташит и находим следующую табличку

Согласно ей у нас «высокоскоростной» кварц может быть от 0 до 32 мегагерц. Куб считает, что только до 24 можно (да и в других местах тоже идет речь про максимальную частоту в 24 мегагерца). Но я искренне рекомендую использовать параметры из Typ(ical) или «типичного» столбца. Как показывает моя практика, это наиболее беспроблемные цифры.

Говоря же про кварцы, то можно поиграться «соседними» по степени двойки частотами. То есть посмотреть на 2, 4, 8 и 16 мегагерц. Поиск осуществляем по уже описанной методике: дешевле, лучше и можно запаять руками.

Нашли? А теперь смотрим уже в даташит на кварцевый резонатор и ищем там параметр нагрузочная емкость. А потом снова в даташит, но уже процессора.

Как видно, там нужны с нагрузочной емкостью 20pF. А вот мне попадались либо 16, либо 32. Чего делать? Как обычно, читать даташит и смотреть на строчку «AN2867 "Oscillator design guide for ST microcontrollers"» (можно взять там же, где и остальные дополнительные файлы к книге).

Если кратко, то там есть следующая схема

и вот такая вот сложная формула

Воспользовавшись знаниями математики за 5 класс среднеобразовательной школы (хотя могу и ошибаться), решим это сложнейшее уравнение:
16 = (Х*X)/(X+X)+3
16-3=X*X/2*X
13=X/2
X=26
Итак, ответ ответ – конденсаторы CL1/2 должны быть 26pf. Таких в природе нет, зато есть 27pF, что нам более чем подходит.
Теперь надо подсчитать, запустится ли генератор. Там чуть дальше есть формула

Считаем
G=4*60*(2*3.14*(8*(10^6))^2*((7+16)*10^(-12))^2)
Возведение в степень я обозначил как ^, её же использует и excel.
Запутаться очень легко, поэтому я сделал простую считалку в excel (файл называется resonator)

Туда подставляем найденные значения и смотрим на значение в ячейке Gain. Согласно документации, оно должно быть больше 5. И чем больше, тем лучше. У меня вот получилось. Хотя если брать резонатор с нагрузочной в 32pF, то будет меньше. Аналогичную процедуру надо будет проделать и с «часовым» кварцем. Возвращаемся к кубу и выставляем значения, попутно щелкая переключателями, что бы нигде красного не было.

Как видим, везде все стало хорошо и микроконтроллер будет работать на максимальной для него частоте - 32 мегагерца.

А проверить?

Но вот гложет меня, правильно ли я подсчитал все. Надо провериться. Достаю описание на stm32l-discovery и открываю там схему. Нахожу часть с резонатором

Да и вообще, рассматривание схем чужих, гарантированно рабочих и предназначенных для огромных тиражей плат способно сильно продвинуть в решении вопросов «как это сделано».

Продолжение следует...

Данная статья, которая является еще одним "быстрым стартом" в освоении ARM-контроллеров, возможно поможет сделать первые шаги в освоении 32-битных контроллеров ARM на базе ядра Cortex-M3 - STM32F1xxx серии. Возможно данная статья (которых на эту тему появляется как грибов после дождя) станет для кого-то полезной.

Введение

Почему ARM?
1. Есть из чего выбрать (разными производителями сегодня выпускается более 240 ARM-контроллеров)
2. Низкая цена (например за 1$ можно получить 37хI / O, 16K Flash, 4K RAM, 2xUART, 10x12bitADC, 6x16bitPWM).

А начнем нашу работу с контроллеров фирмы ST Microelectronics. Контроллеры на основе ядра ARM Cortex-M3 характеризуются широким набором периферии, высоким уровнем рабочих характеристик, низкой цене
P.S. В самом начале создается впечатление, что ARM"ы это какие-то страшные (в пайке, разводке, программировании) существа. Но это только на первый взгляд:) и вы в этом сами убедитесь.

Итак, изучать ARMы будем на примере контроллеров STM32F1. Одновременно эта серия имеет несколько линеек:

  • Value line STM32F100 - 24 МГц CPU, motor control, CEC.
  • Access line STM32F101 - 36 МГц CPU, до 1 Mб Flash
  • USB access line STM32F102 - 48 МГц CPU with USB FS
  • Performance line STM32F103 - 72 МГц, до 1 Mб Flash, motor control, USB, CAN
  • Connectivity line STM32F105/107 - 72 МГц CPU, Ethernet MAC, CAN, USB 2.0 OTG

Также существует следующая классификация:

Контроллеры STM32 можно заставить загружаться с 3-х областей памяти (в зависимости от состояния ножек BOOT0 и BOOT1 при старте контроллера или после его сброса). Записать программу в память контроллера можно следующими способами:

1 способ:
Используя загрузчик (он уже записан в системную память) и USART1 (USART2 remaped): использует внутренний тактовый сигнал 8 МГц. Чтобы запустить встроенный загрузчик, зашитый в контроллер производителем, достаточно просто бросить на лапки контроллера TX1, RX1 сигнал с преобразователя RS232-3.3В (например на базе FT232RL) и выставить перед этим BOOT0 = 1 и BOOT1 = 0 жмем RESET и можем шить программу в контроллер. А зашивается она в программе Flash Loader Demonstartor от STM (для Windows).

PS. Если вы сидите под LINUX и не имеете отладочной платы типа дискавери, можно заливать прошивку в контроллер через всеми любимый rs-232 (собственно - через преобразователь rs-232-3,3В). Для этого нужно использовать python-скрипт (Ivan A-R) (для LINUX или MACOSX).
Для начала у вас должен быть установлен Python 2.6 версии и библиотека для работы с последовательным портом - PySerial library.
Теперь, чтобы запустить скрипт stmloader.py (из терминала, разумеется) нужно его немного подправить под свой компьютер: откроем его в текстовом редакторе.
Набираем в командной строке
~$ dmesg | grep tty
чтобы увидеть все последовательные порты ПК.
и после набора...
~$ setserial -g /dev/ttyS
мы узнаем путь к нашему 232-му порту. Если система ругается на setserial, установим его
~$ sudo apt-get install setserial
мы узнаем путь к нашему физическому порту (например, у меня - /dev/ttyS0). Теперь нужно записать этот путь в файл скрипта stm32loader.py вместо дефолтного «/dev/tty.usbserial-...». Набираем в терминале
~$ python stm32loader.py -h
...для вызова справки и заливаем прошивку в наш контроллер.

2 способ:
Через USB OTG, используя DFU-режим, требует внешнего кварца на 8 МГц, 14.7456 МГц или 25 МГц (этот загрузчик есть не у всех контроллерах с USB OTG надо внимательно смотреть на маркировку вашего контроллера)

3 способ:
JTAG/SWD. Ну и для тех, кто имеет демоплату типа Discovery или самопальный JTAG/SWD программатор, можно заливать код и уже отлаживать свой микроконтроллер этим способом. Для JTAG в микроконтроллере отведено 6 лапок (TRST, TDI, TMS, TCK, TDO, RST) + 2 на питание. SWD использует 4 сигнала (SWDIO, SWCLK SWO, RESET) и 2 на питание.

PS. В среде EAGLE я набросал несколько схем-заготовок для 48-ми, 64-х и 100-ногих контроллеров (папка eagle), а stm32loader содержит скрипт stm32loader.py

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

Возможность автономной работы. Порой очень хочется взять какое-то устройство с собой «на прогулку» или работу, но к предыдущим платам было необходимо внешнее питание. Хотелось бы, чтобы питание было бы на самой плате.

Использовать достаточно мощный чип. Так как я длительное время использовал свою отладку на stm32f100, то по мере проектов я осознал, что хочу по максимуму использовать чипы. Так как возможностей последнего мне стало не хватать (мало ног и низкая частота 24МГц), то я решил пересесть на чуть больший чип: STM32F103 , на котором у меня уже была удачная отладка, но не получившая очень широкого применения.

Использовать аккумуляторы типоразмера 18650, которые мне так полюбились своим отношением ёмкость/цена.

Использовать встроенный контроллер питания от mini-usb на MCP73833 . Хотелось попробовать сделать заводскую плату с хорошим отведением тепла от микросхемы, и посмотреть на что получится разогнать данный контроллер заряда без внешнего радиатора.

Использовать так мною любимый TPS63000 для создания 3,3В линии. Это не очень эффективный контроллер питания с точки зрения тока холостого хода, но он работает как повышающий/понижающий преобразователь, что позволяет использовать весь заряд батареи при выходном высоком выходном токе(единицы ампер).

Сделать маркировку всех сигнальных выводов платы.

Ну и так по мелочи:

Кварцы 5032 (ни одного сбоя за всё время работы)

Smd0603+кондёры 0805 на самых маленьких футпринтах.

Разделение аналоговой и цифровой земель в устройстве

Разъёмы с шагом 2,54 тип мама(PBS20) для того, чтобы в моих макетках сделанных лутом уставлять имеющиеся у меня в большом количестве разъёмы тогоже типа, но папы(дешевле выходит).

Полностью одностороннюю пайку(за исключением разъёмов под аккумулятор).

Тестирование DC-DC преобразователя.

После этого я принялся за тестирование. Для этого специально купил резистор SQP5-4R7 чтобы протестировать контроллер DC-DC на ток ~1А. В результате тестов резистор прогревался до 110*С (узнавал по пирометру), что приводило к некоторой просадке сопротивления и росту тока до 1А.

В результате было установлено, что шумов дополнительных не появляется, а вся система работает как часы. При этом температура DC-DC преобразователя находится в диапазоне 35-40*С при температуре внешней среды +27*С. Конечно, я понимаю, что с ростом нагрузки будут рости и пульсации, но я думаю что когда будет от линии питания микроконтроллера работать и достаточная силовая нагрузка, то особая точность аналоговой части не потребуется.

Тестирование зарядного устройства.

Честно говоря это первый раз, когда я решил сделать промышленно изготовленную плату с MCP73833. В предыдущий раз я посмотрел то, что данный контроллер вообще заряжает и работать + ознакомился на практике с алгоритмом его работы. В данном случае, так как приближалась сдача диплома, а попробовать очень хотелось, я просто разобрал предыдущую плату и аккуратно перенёс все компоненты на новую. В результате, при заряде батарейки после предыдущего теста я зафиксировал, что при зарядном токе в 375мА температура контроллера заряда не достигает и 45*С. Это говорит о том, что можно смело перепаять резистор управляющий зарядом, чтобы увеличить зарядный ток. Я его подниму до 500мА, а вот дальше не пойду. Связано это не с теплом, которое будет выделятся на микросхеме, а с тем, что не все мои пяти вольтовые блоки питания для мобильников выдают более 500мА. Особых защит, в тех что я смотрел, нет, и это может привести к проблемам в электросети.

Недостатки разработанной платы.

Проведя эти тесты, а также представляя как я буду работать в дальнейшем с этой платой, выяснился ряд факторов, которые я не учёл в данном проекте:

У меня не хватило опыта в трассировке для того, чтобы установить в данной печатной плате выключатель on/off на батарейку. Конечно, я это отлично умею делать путём выдёргивания 18650 из разъёма или установкой специальной пластиковой пластины. Но это же костыль друзья мои. Хорошо бы было доделать выключатель.

Нет BMS у аккумулятора на плате, хотя он нужен. Чисто технически TPS63000 работает в диапазоне входных напряжений 1,8-6В. Это возможно при глубоком разряде аккумулятора будет приводить к его порче. Это проблема решается некоторой модификацией самой батарейки и установлением в неё дешёвого bms прямо на батарейку со впихиванием/подрезанием одного из контактов. Опять же не критично, но с костылями.

В разъёме USB по цифровым линиям ничего не подключено. В этом котроллере есть встроенный USB интерфейс, но я его не вывел на разъём. Связано это с тем, что в текущих проектах это не нужно и поставить нормальную обвязку usb интерфейса на плате(с защитными диодами и микросхемой согласования уровней мне как то не доводилось).

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

Недостаточная компактность платы. Текущие габариты платы 34х80 мм. Всегда хочется решение компактнее. Может и получится. Хотя с другой стороны, на обратной стороне печатной платы не так много и места.

Некоторым не очень удобный разъём для программирования и кнопка резет. Дотянутся до неё когда внутри плата сложно, но опять же можно отвёрткой (костыли).

Достаточно высокая цена устройства. Я делал прототипным производством в панели, по этому цена снижена, но один чёрт далека от китайской ардуинки/стмки за 200 руб.

Всем желающим такую штуку себе.

В настоящее время есть 2 таких платы, так что все желающие могу её приобрести за 1700 руб без доставки и аккумулятора 18650. Почему я не высылаю аккумулятор? – дело в почте России. Я был бы счастлив, если бы они пересылали аккумуляторы, хотя первому заказавшему я постараюсь отправить одну 18650 банку сразу с устройством бесплатно.

Связаться со мной можно по почте: [email protected]

С моей точки зрения о цене: сейчас за эти деньги можно купить оригинальное ардуино или дискавери с Китая. Но ни то, ни другое вы не сможете взять с собой на целый день без внешнего обвеса и аккумуляторов. А тут вы получается готовую штуку, в которую можно вставить свою плату и получить очень жёсткую конструкцию, которую можно спокойно носить с собой не переживая, что где-то отойдёт пайка или устройство испытает короткое замыкание.

Рисунок 1. Схема элементов STM32F103RC_board

Некоторая доработка. Версия 1.0.

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

С первого взгляда бросаются следующие вещи:

Нет «гребёнки» PBS-30 для вставки в печатную плату. К моему сожалению тут работает 2 фактора (они у меня закончились и заказчик попросил их не ставить.

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

Светодиоды немного другие. К моему сожалению я беру SMD-светодиоды из большой кучи, и не всегда сам знаю какого они цвета. В этот раз это два зелёных и один белый светодиод.

Но дьявол часто кроется в деталях, так оказывается и тут. На данной плате я пробовал разные резисторы в управлении зарядным током. В итоге было выявлено, что микросхема MCP73833 на данной плате нормально держит ток в 800мА и при заряде с 2,5В Li-Ion батареек прогревается до 65-70*С. Конечно, по даташиту она работает с токами до 2А, но я честно пока не представляю как их реализовать на корпусе msop-10. Может быть в следующем корпусе, в котором эта проблема решается лучше, получится вытянуть 2А.

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

Предосторожность.

Во время проведения полной диагностической проверки я спалил один STM32F103RCT6. Как я это сделал:

Я взял обычный мультиметр и ткнулся им в резистор обратной связи. Пр этом TPS63000 видит просадку напряжения на обратной связи и начинает быстро повышать напряжение на своём выходе. В итоге, по проведённому тесту с отпаянным контроллером: напряжение в импульсе вырастало до 7В. При этом контроллер испытывал перенапряжение и умирал.

Забавно происходило потом: по входу на 3,6В контроллер начинал потреблять 0,6А. Это связано с тем, что в TPS63000 встроена защита по току в 2А, Именно данный ток и протекал через убитый микроконтроллер. При этом работоспособность всей оставшейся схемы сохранялась.

Диагностировать данную проблему легко: достаточно подключить индивидуальный измерительный термометр (палец) к контроллеру, и если он начинает прогреваться, то значит он мёртв.

Упаковка отправленной платы

Отсылая данную плату моему коллеге , я решил её упаковать получше, чтобы Почта Р. не сломало всё. В итоге получилось так: