serega_sh____ 2 8 марта, 2019 Опубликовано 8 марта, 2019 · Жалоба Изучаю STM32F4Discovery (STM32F429ZTI). К этой плате подключаю символьный монитор вот по этой методичке http://cxem.net/mc/mc263.php. Но в отличии от методички порты сконфигурировал вот так (потому что проще распаиваться). Кнопочка (по умолчанию Button1) + лампочка(по умолчанию LED) + символьный монитор (EN, PB0...PB7,RS,RW). Но я немогу пройти вот этот шаг. Я непонимаю как мне правильно написать вот эти три строчки из методички. И для чего они нужны. Quote .... //---Переопределяем порты для подключения дисплея, для удобства---// #define LCM_OUT GPIOB->ODR ..... #define LCM_PIN_MASK ((LCM_PIN_RS | LCM_PIN_EN | LCM_PIN_D7 | LCM_PIN_D6 | LCM_PIN_D5 | LCM_PIN_D4)) GPIO_InitTypeDef GPIO_InitStructure; //---Функция задержки---// .... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 8 марта, 2019 Опубликовано 8 марта, 2019 · Жалоба 3 hours ago, serega_sh____ said: #define LCM_OUT GPIOB->ODR Эта строка создаёт псеводинм для определения порта вывода. Т.е. в своей программе вместо GPIOB->ODR вы можете писать LCM_OUT. Это делается для удобства. Вы так можете переопределять и другие порты, написав, например #define LED_OUT GPIOK->ODR 3 hours ago, serega_sh____ said: #define LCM_PIN_MASK ((LCM_PIN_RS | LCM_PIN_EN | LCM_PIN_D7 | LCM_PIN_D6 | LCM_PIN_D5 | LCM_PIN_D4)) По-сути тоже самое, вместо длиннющей змеи из скобок, вы можете в коде писать коротенькое LCM_PIN_MASK. Другое дело, что все макросы, разделённые в скобах "трубой" должны быть определены выше в программе, и переопределены конкретно для вашей программы. В них определены биты порта, к которым подключены линии дисплея. Кстати, надеюсь, вы дисплей подключили к одному порту, а не так, что часть линий висит на одном, часть на другом. Тогда тут всё по-сложнее переделывать нужно. 3 hours ago, serega_sh____ said: GPIO_InitTypeDef GPIO_InitStructure; Здесь, к сожалению, не подскажу. Т.к. не работаю с драйверами, поставляемыми STM. Но если вы приведёте чуть больше кода, то может быть получится сообразить, что нужно поправить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 6 8 марта, 2019 Опубликовано 8 марта, 2019 · Жалоба 4 часа назад, serega_sh____ сказал: вот по этой методичке http://cxem.net/mc/mc263.php. LCM_OUT |= (ByteToSend & 0xF0); LCM_OUT |= ((ByteToSend & 0x0F) << 4); эти две строки в методичке предполагают что шина данных индикатора подключена к битам порта с 4 по 7 и никак иначе. Хорошие, добротные грабли. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 8 марта, 2019 Опубликовано 8 марта, 2019 · Жалоба 48 minutes ago, SSerge said: Хорошие, добротные грабли. В общем тут просто так трудно поправить. Если только одноразово. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 8 марта, 2019 Опубликовано 8 марта, 2019 · Жалоба Не читал, но осуждаю. Цитата из исходной "методички": Quote Если же хотите вывести числовую переменную, то подключаете библиотеку stdio.h и конвертируете число в строку:int i=123; char *t; snprintf(t, 255, "%d", i); PrintStr(t); Ещё одна Quote //---Функция задержки---// void delay(int a) { int i = 0; int f = 0; while(f < a) { while(i<60) {i++;} f++; } } В общем, как мне кажется, это плохая, негодная статья. Варианты действий: (возможно, быстрый) сделать именно так, как в оригинале. Может быть, оно таки заработает. (альтернативный) поискать какую-нибудь другую статью. Статей "СТМ32 для начинающих" я видел штук 5 от разных авторов. Возможно, там не будет таких ляпов. (правильный) научиться управлять GPIO на примерах "кнопка + диодик", прочитать описание на HD44780 (система команд там весьма примитивная) и сделать самому. Строить свои собственные велосипеды - это хорошо, если делается для обучения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 8 марта, 2019 Опубликовано 8 марта, 2019 · Жалоба 4 hours ago, haker_fox said: что все макросы, разделённые в скобах "трубой" должны быть определены выше в программе ;-) Занятное название для символа. Это оттого, что он высокий и вертикальный, или от слова pipe ? И, кстати, если быть точным, используемые макросы должны быть определены не выше текущего define'а, а выше того места, где они реально подставляются. Т.е. это корректно: #define A B #define B 10 int c = A; Но, это, кажется, уже не "вопросы совсем начинающего" :-) 4 hours ago, haker_fox said: надеюсь, вы дисплей подключили к одному порту, а не так, что часть линий висит на одном, часть на другом. Тогда тут всё по-сложнее переделывать нужно. Судя по скриншоту куба, дисплей подключен как получилось. Так что да, переделывать эту "библиотеку" придётся почти полностью. 4 hours ago, haker_fox said: то может быть получится сообразить, что нужно поправить. Это какая-то странная особенность, встречающаяся у ардуинщиков. Все переменные они стремятся делать глобальными. Зачем это делать, если переменная используется только в одном месте один раз - загадка... Эта структурка в примере используется в функции настройки GPIO, и по-хорошему, её надо перенести именно туда. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 8 марта, 2019 Опубликовано 8 марта, 2019 · Жалоба 1 minute ago, esaulenka said: Занятное название для символа. Где-то давным давно прочитал, не сам придумал) 1 minute ago, esaulenka said: .е. это корректно: Этого не знал, век живи...) 2 minutes ago, esaulenka said: встречающаяся у ардуинщиков Им простительно - они любители! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
serega_sh____ 2 8 марта, 2019 Опубликовано 8 марта, 2019 · Жалоба 6 hours ago, haker_fox said: В них определены биты порта, к которым подключены линии дисплея. Кстати, надеюсь, вы дисплей подключили к одному порту, а не так, что часть линий висит на одном, часть на другом. Тогда тут всё по-сложнее переделывать нужно. Вот именно в этом и загвоздка. Наверное есть какое то обьяснение, почему один порт в контроллерах STM32 расположен по разным углам корпуса (и отладочной платы). Но для данного примера это немного неудобно. Запаял на свободные ноги. Это моя третья самостоятельная работа по обучению программированию и STM. Первая работа была - лампочкой поморгать. Вторая кнопкой понажимать. И третья - эта, чтоб получить удобную обратную связь: человек - машина. ----------------------------------------------------- Я правильно понимаю? разбираю строчку по порядку #define LCM_OUT GPIOB->ODR #define - дериктивой создаём строку подстановки LCM_OUT - новое название, которое будем использовать в данной библиотеке (файле) при отправлении GPIOB->ODR - обращение к порту B. По этой команде установить в регистр портаВ значения... Но!!! Как скомпоновать разные порты в моём случае А,В, С в одну команду? Quote #define LCM_PIN_MASK ((LCM_PIN_RS | LCM_PIN_EN | LCM_PIN_D7 | LCM_PIN_D6 | LCM_PIN_D5 | LCM_PIN_D4)) Или вот по этому примеру попробовать сконфигурировать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 10 марта, 2019 Опубликовано 10 марта, 2019 · Жалоба On 3/8/2019 at 8:38 PM, serega_sh____ said: Наверное есть какое то обьяснение, почему один порт в контроллерах STM32 расположен по разным углам корпуса (и отладочной платы). У ST'шников различная периферия по каким-то историческим причинам жёстко привязана к определённым портам. А поскольку набор периферии везде разный, порты тоже весьма вразнобой получаются. И если с GPIO ещё как-то можно жить, то какая-нибудь шина памяти у них ну ооочень неудобно разводится... On 3/8/2019 at 8:38 PM, serega_sh____ said: Как скомпоновать разные порты в моём случае А,В, С в одну команду? Никак. Автор этой "методички" даже не пробовал задуматься, что можно подключить как-то иначе (и не написал это БОЛЬШИМИ БУКВАМИ в самом начале). Вам нужно переписать инициализацию и использование этих ног (т.е. функцию SendByte() ). Ещё раз рекомендую прочитать reference на предмет работы с GPIO, там несложно. Ну или статейку от более адекватного автора. Как-то так: сначала пишем вспомогательные функции вывода одного бита: // display D7 -> PB2 void LCM_D7_set() { GPIOB->BSRR = 1<<2; } void LCM_D7_clr() { GPIOB->BRR = 1<<2; } // аналогично - D6..D4, RS, EN. Потом меняем void PulseLCD() { LCM_EN_Clr(); delay(220); LCM_EN_Set(); delay(220); LCM_EN_Clr(); delay(220); } тут обязательно перепроверить осциллографом, как "попугаи" delay'я соотносятся с микросекундами из даташита индикатора. void SendByte(char Data, int IsData) { // старшие пол-байта if (Data & 0x80) LCM_D7_Set(); else LCM_D7_Clr(); if (Data & 0x40) LCM_D6_Set(); else LCM_D6_Clr(); if (Data & 0x20) LCM_D5_Set(); else LCM_D5_Clr(); if (Data & 0x10) LCM_D4_Set(); else LCM_D4_Clr(); if (IsData) LCM_RS_Set(); else LCM_RS_Clr(); PulseLCD(); // младшие пол-байта if (Data & 0x08) LCM_D7_Set(); else LCM_D7_Clr(); if (Data & 0x04) LCM_D6_Set(); else LCM_D6_Clr(); if (Data & 0x02) LCM_D5_Set(); else LCM_D5_Clr(); if (Data & 0x01) LCM_D4_Set(); else LCM_D4_Clr(); if (IsData) LCM_RS_Set(); else LCM_RS_Clr(); PulseLCD(); } Инициализацию сделайте, пожалуйста, самостоятельно :-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Darth Vader 0 10 марта, 2019 Опубликовано 10 марта, 2019 · Жалоба On 3/8/2019 at 8:38 PM, serega_sh____ said: #define - дериктивой создаём строку подстановки Правильно. Возьмите любую книжку по языку С/С++ прочитайте главу про препроцессор. On 3/8/2019 at 8:38 PM, serega_sh____ said: Как скомпоновать разные порты в моём случае А,В, С в одну команду? Никак. Это невозможно. Разные порты - разные структуры/регистры/адреса. Одной командой можно установить новое значение только одного регистра, а не нескольких сразу. В одной команде маска накладывается только на один регистр. Новое значение присваивается только одному регистру. Вам надо сделать виртуальное устройство - ваш дисплей, и написать для него драйверы - семейство функций для работы с ним. Некоторые из них вам уже расписали. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 10 марта, 2019 Опубликовано 10 марта, 2019 · Жалоба On 3/9/2019 at 1:38 AM, serega_sh____ said: Наверное есть какое то обьяснение, почему один порт в контроллерах STM32 Честно говоря, я больше с LPC работаю. Но даже у них не обращал внимание на распиновку корпуса. поэтому тут мало что скажу. On 3/9/2019 at 1:38 AM, serega_sh____ said: Это моя третья самостоятельная работа по обучению программированию и STM. Я так понял, вы осваиваете новую для себя область... наверно самым правильным будет действительно, как и сказали коллеги выше, поизучать язык Си. Даже лучше сначала на компе. Слишком много нюансов нужно объяснить. И дело даже не в моей, например, лени, а просто это довольно тяжело сделать. Вам всё это срочно нужно, или вы для себя развлекаетесь?)))) Сорри за слово, без обид))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
serega_sh____ 2 10 марта, 2019 Опубликовано 10 марта, 2019 · Жалоба 1 hour ago, haker_fox said: Я так понял, вы осваиваете новую для себя область... наверно самым правильным будет действительно, как и сказали коллеги выше, поизучать язык Си. Даже лучше сначала на компе. Слишком много нюансов нужно объяснить. И дело даже не в моей, например, лени, а просто это довольно тяжело сделать. Вам всё это срочно нужно, или вы для себя развлекаетесь?)))) Сорри за слово, без обид))) Да я занимаюсь изучением. никаких обид. Первые шаги всегда очень сложны и непонятны. Самое сложное понять где, что искать. Выстроить модель решения. Я поэтому и написал "совсем начинающего". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 10 марта, 2019 Опубликовано 10 марта, 2019 · Жалоба 56 minutes ago, serega_sh____ said: Самое сложное понять где, что искать. Самое правильное, сперва, ИМХО, хотя бы пробежаться по языку си. С помощью замечательной книги Ричи и Кернигана "Язык Си", 3-е издание. Без этого дальше будет просто очень трудно, если не невозможно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
serega_sh____ 2 11 марта, 2019 Опубликовано 11 марта, 2019 · Жалоба On 3/10/2019 at 5:30 PM, esaulenka said: ... спасибо всем ответившим. Буду изучать. самое главное есть понял куда двигаться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Darth Vader 0 11 марта, 2019 Опубликовано 11 марта, 2019 · Жалоба Прочитайте ещё эту статью по работе с портами. Там про AVR, но все принципы работы с портами одинаковы для любой архитектуры МК. Меняются лишь набор и имена регистров. После главы 3 остановитесь. Для новичка этого будет достаточно. С++ для вас пока будет излишним. Попробуйте применить полученные знания для адаптации примера к изменившейся схеме. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться