Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Re: Микроконтроллеры STM32 - тонкости работы, отладочные пла

Сб мар 09, 2024 12:46:50

но я не уверен, что такая погоня за универсальностью (и удобством для человека) будет более оптимальным решением.
Поверьте, компилятор лучше программиста знает как по массиву ходить. Впрочем, это легко проверяется. Ссылка на Compiler Explorer.
Пишем алгоритм обхода массива двумя способами.

И видим, что начхал компилятор на счётчик цикла и сгенерировал одинаковый бит в бит код для обоих вариантов.

Re: Микроконтроллеры STM32 - тонкости работы, отладочные пла

Сб мар 09, 2024 13:45:34

но я не уверен, что такая погоня за универсальностью (и удобством для человека) будет более оптимальным решением.
Поверьте, компилятор лучше программиста знает как по массиву ходить. Впрочем, это легко проверяется.

Это хорошо, что x86/x64 компилеры последние 25 лет не стояли на месте. Но что там под РУКУ? Топик же не про x86/x64. Что там с тулчейнами под РУКУ?

Re: Микроконтроллеры STM32 - тонкости работы, отладочные пла

Сб мар 09, 2024 13:58:46

x86 выбран только чтобы показать результат выполнения кода в Compiler Explorer. Для ARM компиляторы ни разу не отстают.

Re: Микроконтроллеры STM32 - тонкости работы, отладочные пла

Сб мар 09, 2024 15:14:39

Добрый день! Это больше похоже на плюсы, сейчас попробую разобратся, совсем сложно пока для меня, но я стараюсь)
У меня все работает, кроме цветов. Вот фон один и тот же сзади 411 на дисплей выводит доски а с переди 476 кляксы вывел какие то. И что интересно вообще не понятно почему так может быть. Дисплеи одного класса(((Изображение

У меня белый это черный, черный это белый а красный синий ппц(((

В дисплее включал инверсию - не то(
Скорее всего дело в передаче выходит
Код:
void Send_DAT16(uint16_t dat){
        CS_LOY;  //ChipSelect loy
   DC_H;  //DC H      
   SPI1->CR1 |= SPI_CR1_CRCL;
   while (!(SPI1->SR & SPI_SR_TXE)){};
   SPI1->DR = dat;
   while (!(SPI1->SR & SPI_SR_TXE)){};
   while ((SPI1->SR & SPI_SR_BSY)){};
         CS_H;//ChipSelect Up
}


Я попробовал по анологии но не помогло)
Код:
*((__IO uint16_t *)&SPI1->DR) = dat;

а так похожи цвета, но все равно где то близко
Код:
void Send_DAT16(uint16_t dat){
 uint8_t  bytes[2];
bytes[0] = dat >> 8;     // high byte (0x12)
bytes[1] = dat & 0x00FF; // low byte (0x34)
Send_DAT(bytes[0]);
Send_DAT(bytes[1]);
}


Пробовал цвет разбирать на ргб и менять местами, лажа какая то(((


Методом научного тыка добилсяя того что INVON + BGR режимы дисплея плюс перестановка битов при отправке дают нужные цвета

Re: Микроконтроллеры STM32 - тонкости работы, отладочные пла

Сб мар 09, 2024 18:00:57

TEPEM, не знаю надо ли это для вашего индикатора, но если нужно переставить местами два байта в uint16_t, то в Cortecx-M4 можно вот так сделать.
Код:
SPI1->DR = __REV16(dat);
Это одна ассемблерная команда.

Re: Микроконтроллеры STM32 - тонкости работы, отладочные пла

Сб мар 09, 2024 19:02:31

TEPEM, не знаю надо ли это для вашего индикатора, но если нужно переставить местами два байта в uint16_t, то в Cortecx-M4 можно вот так сделать.
Код:
SPI1->DR = __REV16(dat);
Это одна ассемблерная команда.

Это несколько ассемблерных команд. Следует уточнять, что это именно своп байтов в каждом полуслове REV16 - одна атомарная команда. /душнила: офф

Re: Микроконтроллеры STM32 - тонкости работы, отладочные пла

Сб мар 09, 2024 19:13:17

Это несколько ассемблерных команд.
Это одна команда, меняющая местами байты.
Изображение
изображение_2024-03-09_191108502.png
(13.56 KiB) Скачиваний: 215

Следует уточнять, что это именно своп байтов в каждом полуслове REV16 - одна атомарная команда.
Применительно к записи в SPI->DR это не имеет значения, он 16-битный. Поэтому, одной ассемблерной командой достигается задача перестановки двух байт, которая, похоже, нужна для правильного задания цвета.

Re: Микроконтроллеры STM32 - тонкости работы, отладочные пла

Сб мар 09, 2024 20:07:14

Это несколько ассемблерных команд.
Это одна команда, меняющая местами байты.
Изображение
изображение_2024-03-09_191108502.png

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

Следует уточнять, что это именно своп байтов в каждом полуслове REV16 - одна атомарная команда.
Применительно к записи в SPI->DR это не имеет значения, он 16-битный. Поэтому, одной ассемблерной командой достигается задача перестановки двух байт, которая, похоже, нужна для правильного задания цвета.

Ну написано следующее:
Код:
SPI1->DR = __REV16(dat);

И написано буквально "это одна команда". Поэтому я и задушнил, чтобы новичку было понятно: одна команда это та самая __REV16(), которая свопает 2 байта в слове. Ну и касаемо темы - предположение может быть верным, что endianess у LCD другая. Либо человек не разобрался с букварём на LCD, где описаны режимы и форматы упаковки данных в изображении.

Ещё раз: я не спорю про команду, я просто оставил уточняющую ремарку.

Re: Микроконтроллеры STM32 - тонкости работы, отладочные пла

Вс мар 10, 2024 19:56:16

Добрый вечер господа.
Я очень пытаюсь разобрать код предложенный уважаемым Владиславом)
Можно я по порядку поспрашиваю где с гуглом у меня ее получается понять.
Вот цикл фор с таким условием
Код:
for(auto &x : InitAtray)

Авто это просто слсоб взять указатель без создания перемнной? А InitArray это что? А какое условие у цикла этого? Какую роль тут выполняет двоеточие? Это точно си?)

Re: Микроконтроллеры STM32 - тонкости работы, отладочные пла

Вс мар 10, 2024 20:38:28

Вот цикл фор с таким условием

Вот в этом сообщении этот цикл написан на обычном С.

Авто это просто слсоб взять указатель без создания перемнной?
Нет, auto это указание компилятору самому определить тип переменной x. У него для этого есть вся информация - тип элемента массива InitArray. Единственное, я ему подсказал с помощью &, что пусть лучше x будет ссылкой. Ссылка и указатель, если что, это разное.

А InitArray это что?
Это массив из структур TInitRec. Он определён в самом конце и содержит последовательность команд индикатору.

А какое условие у цикла этого?
Тут нет явного условия. Этот цикл на русском языке звучит так "Взять сcылку последовательно на все элементы массива". В теле цикла описано что с каждым элементом через эту ссылку сделать.

Какую роль тут выполняет двоеточие?
Это синтаксис оператора цикла такой.

Это точно си?)
Это точно не С :) Но, насколько я помню, вы в IAR лабаете, а там С++ по умолчанию включен. Можно всё то же самое на обычном С написать, но блин, это будет так пошло с макросами, фу...

Re: Микроконтроллеры STM32 - тонкости работы, отладочные пла

Пт мар 22, 2024 21:36:29

Это C++ стандарта x11 и младше. Там есть такие формы циклов и много другого, чего нужно серьёзно изучать. InitAtray - это экземпляр контейнера (std::initializer_list, std::vector, std::list или вообще самописный), от которого можно взять итератор по методу begin() или вовсе какой-либо массив. Двоеточие - просто синтаксис. Здесь цикл последовательно шагает по каждому элементу контейнера от begin() до end() и берёт на каждом шаге его ссылку в x, которая существует только в теле цикла. auto - автоматический вывод типа элемента. Этот цикл эквивалентен С++98 коду, например, так:
Код:
CONTAINER::iterator it = InitAtray.begin();
while (it != InitAtray.end()) {
  TYPE &x = *(it++);

  /*
   cделать что-то с x
  */
}


VladislavS, ах да, ты-ж уже объяснил. Ну может будет не лишним. :)

Re: Микроконтроллеры STM32 - тонкости работы, отладочные пла

Пт мар 22, 2024 23:19:58

Только InitAtray это обычный массив.
Ответить