Перейти к содержанию
    

вопрос совсем начинающего STM32F4 + Keil + настройки порта

Изучаю STM32F4Discovery (STM32F429ZTI). К этой плате подключаю символьный монитор вот по этой методичке http://cxem.net/mc/mc263.php. Но в отличии от методички порты сконфигурировал вот так (потому что проще распаиваться). Кнопочка (по умолчанию Button1) + лампочка(по умолчанию LED) + символьный монитор (EN, PB0...PB7,RS,RW).

image.thumb.png.28a3690cac9a1bcaf06abd612b1a003c.png

 

Но я немогу пройти вот этот шаг. Я непонимаю как мне правильно написать вот эти три строчки из методички. И для чего они нужны.

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;
 
//---Функция задержки---//

 

....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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. Но если вы приведёте чуть больше кода, то может быть получится сообразить, что нужно поправить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 часа назад, serega_sh____ сказал:

вот по этой методичке http://cxem.net/mc/mc263.php.

LCM_OUT |= (ByteToSend & 0xF0);

LCM_OUT |= ((ByteToSend & 0x0F) << 4);

эти две строки в методичке предполагают что шина данных индикатора подключена к битам порта с 4 по 7 и никак иначе.

Хорошие, добротные грабли.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

48 minutes ago, SSerge said:

Хорошие, добротные грабли.

В общем тут просто так трудно поправить. Если только одноразово.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не читал, но осуждаю.

 

Цитата из исходной "методички":

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 (система команд там весьма примитивная) и сделать самому. Строить свои собственные велосипеды - это хорошо, если делается для обучения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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, и по-хорошему, её надо перенести именно туда.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 minute ago, esaulenka said:

Занятное название для символа.

Где-то давным давно прочитал, не сам придумал)

1 minute ago, esaulenka said:

.е. это корректно:

Этого не знал, век живи...)

2 minutes ago, esaulenka said:

встречающаяся у ардуинщиков

Им простительно - они любители!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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))

Или вот по этому примеру попробовать сконфигурировать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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();
}
Инициализацию сделайте, пожалуйста, самостоятельно :-)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 3/8/2019 at 8:38 PM, serega_sh____ said:

#define -  дериктивой создаём строку подстановки

Правильно. Возьмите любую книжку по языку С/С++ прочитайте главу про препроцессор.

On 3/8/2019 at 8:38 PM, serega_sh____ said:

Как скомпоновать разные порты в моём случае А,В, С в одну команду? 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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.

Я так понял, вы осваиваете новую для себя область... наверно самым правильным будет действительно, как и сказали коллеги выше, поизучать язык Си. Даже лучше сначала на компе. Слишком много нюансов нужно объяснить. И дело даже не в моей, например, лени, а просто это довольно тяжело сделать. Вам всё это срочно нужно, или вы для себя развлекаетесь?)))) Сорри за слово, без обид)))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, haker_fox said:

Я так понял, вы осваиваете новую для себя область... наверно самым правильным будет действительно, как и сказали коллеги выше, поизучать язык Си. Даже лучше сначала на компе. Слишком много нюансов нужно объяснить. И дело даже не в моей, например, лени, а просто это довольно тяжело сделать. Вам всё это срочно нужно, или вы для себя развлекаетесь?)))) Сорри за слово, без обид)))

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

56 minutes ago, serega_sh____ said:

Самое сложное понять где, что искать.

Самое правильное, сперва, ИМХО, хотя бы пробежаться по языку си. С помощью замечательной книги Ричи и Кернигана "Язык Си", 3-е издание. Без этого дальше будет просто очень трудно, если не невозможно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 3/10/2019 at 5:30 PM, esaulenka said:
...

спасибо всем ответившим. Буду изучать. самое главное есть понял куда двигаться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Прочитайте ещё эту статью по работе с портами. Там про AVR, но все принципы работы с портами одинаковы для любой архитектуры МК. Меняются лишь набор и имена регистров. После главы 3 остановитесь. Для новичка этого будет достаточно. С++ для вас пока будет излишним. Попробуйте применить полученные знания для адаптации примера к изменившейся схеме.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...