но я не уверен, что такая погоня за универсальностью (и удобством для человека) будет более оптимальным решением.
Поверьте, компилятор лучше программиста знает как по массиву ходить. Впрочем, это легко проверяется. Ссылка на Compiler Explorer. Пишем алгоритм обхода массива двумя способами. Спойлер
но я не уверен, что такая погоня за универсальностью (и удобством для человека) будет более оптимальным решением.
Поверьте, компилятор лучше программиста знает как по массиву ходить. Впрочем, это легко проверяется.
Это хорошо, что x86/x64 компилеры последние 25 лет не стояли на месте. Но что там под РУКУ? Топик же не про x86/x64. Что там с тулчейнами под РУКУ?
_________________ Репозиторий STM32: https://cloud.mail.ru/public/2i19/Y4w8kKEiZ Актуальность репозитория: 6 декабря 2025 года Если чего-то не хватает с сайта st.com - пишите, докачаю.
Добрый день! Это больше похоже на плюсы, сейчас попробую разобратся, совсем сложно пока для меня, но я стараюсь) У меня все работает, кроме цветов. Вот фон один и тот же сзади 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 режимы дисплея плюс перестановка битов при отправке дают нужные цвета
TEPEM, не знаю надо ли это для вашего индикатора, но если нужно переставить местами два байта в uint16_t, то в Cortecx-M4 можно вот так сделать.
Код:
SPI1->DR = __REV16(dat);
Это одна ассемблерная команда.
Это несколько ассемблерных команд. Следует уточнять, что это именно своп байтов в каждом полуслове REV16 - одна атомарная команда. /душнила: офф
_________________ Репозиторий STM32: https://cloud.mail.ru/public/2i19/Y4w8kKEiZ Актуальность репозитория: 6 декабря 2025 года Если чего-то не хватает с сайта st.com - пишите, докачаю.
Следует уточнять, что это именно своп байтов в каждом полуслове REV16 - одна атомарная команда.
Применительно к записи в SPI->DR это не имеет значения, он 16-битный. Поэтому, одной ассемблерной командой достигается задача перестановки двух байт, которая, похоже, нужна для правильного задания цвета.
Следует уточнять, что это именно своп байтов в каждом полуслове REV16 - одна атомарная команда.
Применительно к записи в SPI->DR это не имеет значения, он 16-битный. Поэтому, одной ассемблерной командой достигается задача перестановки двух байт, которая, похоже, нужна для правильного задания цвета.
Ну написано следующее:
Код:
SPI1->DR = __REV16(dat);
И написано буквально "это одна команда". Поэтому я и задушнил, чтобы новичку было понятно: одна команда это та самая __REV16(), которая свопает 2 байта в слове. Ну и касаемо темы - предположение может быть верным, что endianess у LCD другая. Либо человек не разобрался с букварём на LCD, где описаны режимы и форматы упаковки данных в изображении.
Ещё раз: я не спорю про команду, я просто оставил уточняющую ремарку.
_________________ Репозиторий STM32: https://cloud.mail.ru/public/2i19/Y4w8kKEiZ Актуальность репозитория: 6 декабря 2025 года Если чего-то не хватает с сайта st.com - пишите, докачаю.
Добрый вечер господа. Я очень пытаюсь разобрать код предложенный уважаемым Владиславом) Можно я по порядку поспрашиваю где с гуглом у меня ее получается понять. Вот цикл фор с таким условием
Код:
for(auto &x : InitAtray)
Авто это просто слсоб взять указатель без создания перемнной? А InitArray это что? А какое условие у цикла этого? Какую роль тут выполняет двоеточие? Это точно си?)
Авто это просто слсоб взять указатель без создания перемнной?
Нет, auto это указание компилятору самому определить тип переменной x. У него для этого есть вся информация - тип элемента массива InitArray. Единственное, я ему подсказал с помощью &, что пусть лучше x будет ссылкой. Ссылка и указатель, если что, это разное.
Тут нет явного условия. Этот цикл на русском языке звучит так "Взять сcылку последовательно на все элементы массива". В теле цикла описано что с каждым элементом через эту ссылку сделать.
Это точно не С Но, насколько я помню, вы в IAR лабаете, а там С++ по умолчанию включен. Можно всё то же самое на обычном С написать, но блин, это будет так пошло с макросами, фу...
Это 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, ах да, ты-ж уже объяснил. Ну может будет не лишним.
Доброго дня. Изменяю глобальную переменную в прерывании. Но основной код ее не видит, пока не сделаю printf. Но к сожалению, этот способ слишком медленный. Как грамотно менять глобальные переменные в прерывании? Cube IDE 1.12
Заголовок сообщения: Re: Микроконтроллеры STM32 - тонкости работы, отладочные пла
Добавлено: Вт апр 22, 2025 16:25:17
Опытный кот
Зарегистрирован: Вс мар 23, 2025 14:56:55 Сообщений: 700
Рейтинг сообщения:0
Непонятно совершенно. Что значит, не видит? выдаёт ошибку? или в отладчике исчезает? как объявлена переменная, где? Приведите код, не прогнозируйте варианты ошибки самостоятельно, тем самым выбирая, какую информацию предоставлять, и не рассчитывайте на телепатию: не всем очевидно, что и как Вы сделали.
Linuxoid91, объявляйте переменную как volatile, и всё обязано нормально работать.
_________________ Платы для HLDI - установки лазерной засветки фоторезиста. ФоторезистыOrdyl Alpha 350 и AM 140. Жидкое олово для лужения плат (видео) - самое лучшее и только у меня. Паяльная маска XV501T-4 и KSM-S6189 (5 цветов). Заказ печатных плат - pcbsmac@gmail.com
Пишу код для воспроизведения файла с SD карты. МК STM32F411. Формат wav, 8 bit, 24 kHz, mono. Переменные: СпойлерVolatile возле Empflug установил по совету нейросети. Но это не помогло. Программа содержит два буфера, один из которых пишется, а другой воспроизводится.
Код:
uint8_t wavbuf0[512]; uint8_t wavbuf1[512]; uint16_t NmbrByte; //Number of byte to Audio Play uint8_t Numbuf; //Number of played buffer volatile uint8_t Empflug; //Flug is Empry Buffer uint32_t sizefile; uint16_t i,j,k,n,tag;
Программа прерывания по таймеру. Находится в файле main.c. Изначально был в файле stm32f4xx_it.c, но в попытках понять почему не работает, в том числе произвел миграцию кода в файл main.c.: СпойлерС частотой 24 кГц выплевывает очередной байт из буферов на ШИМ. По окончанию буфера меняет переменные Empflug и Numbuf, требуемые для корректного чтения. Команда printf - искомый костыль, чтоб переменные были видны в функции main. А вообще, он у меня перенаправлен в UART, чтоб выводить отладочную информацию. До этого, к слову, printf был в функции int main, однако там он давал лютые тормоза. Помещение их в прерывание убрало тормоза.
Ну и собственно, код int main. Занимается монтированием, чтением, и этим вот всем. Куча отладочного вывода, ибо путь был долог и тернист. В отдельную функцию пока не вывел. СпойлерНа незначительные вещи вроде отсеивания метаданных и какой-то обработки неполного буфера в конце файла решил забить. Благо, не аудиофильский аппарат собираю, а всего лишь светозвуковые устройства для наполнения страйкбольной игры.
} } HAL_TIM_Base_Stop_IT(&htim2); f_close(&file); printf("End the file\n"); } else {
printf("Error Open File Code: %d\n", fres); }
В целом, успех достигнут. Но главный вопрос с переменными остался - изменяются в прерываниях - основной код не видит. Но printf помогает. Остались мелкие фризы. Возможно, из-за длинных проводов от МК до SD карты. Используется 1-битный режим SDHC. Битрейт воспроизводимых файлов 192 кбит/с. В качестве переходника используется мертвый DFPlayer. Он тоже работал по 1-битному интерфейсу. По неизвестным причинам, несмотря на одинаковое количество используемых компонентов и текстолита, SDHC модули стоят в 5..7 раз дороже SPI
Изменять в обработчиках прерывания НЕvolatile переменные - двойное зло. Неудивительно, что возникли проблемы.
И отдельное зло - ожидая помощи, не отвечать на вопросы:
Уош писал(а):
Что значит, не видит? выдаёт ошибку? или в отладчике исчезает?
_________________ Платы для HLDI - установки лазерной засветки фоторезиста. ФоторезистыOrdyl Alpha 350 и AM 140. Жидкое олово для лужения плат (видео) - самое лучшее и только у меня. Паяльная маска XV501T-4 и KSM-S6189 (5 цветов). Заказ печатных плат - pcbsmac@gmail.com
Вы не знаете про else или всё настолько сложно, что за время выполнения первого __HAL_TIM_SET_COMPARE Numbuf может измениться? Я промолчу про сравнение с 1 и 0, но... может, стоит изучить программирование на чём-то более простом? Как бы это я написал, после прочтения "Си за 21 день":
__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1, Numbuf?wavbuf1[NmbrByte]:wavbuf0[NmbrByte]); // а здесь комментарий бы написал
Через год избавился бы от сравнения вообще...
К чему я это всё: надо писать комментарии, чтобы не только мы могли понять, что Вы делаете, но и Вы сами через неделю, это раз, а два, нельзя браться за какую-либо работу, не прочитав ни одной книжки.
На вопрос ответить не могу, мне больно видеть такие условия, они путают, отвлекают и компилятор даже с отключенной оптимизацией всё нафиг поудаляет, он ведь всё-таки тоже любит, когда всё хорошо.
Добавлено after 17 minutes 43 seconds: Re: Микроконтроллеры STM32 - тонкости работы, отладочные платы
На незначительные вещи вроде отсеивания метаданных и какой-то обработки неполного буфера в конце файла решил забить. Благо, не аудиофильский аппарат собираю, а всего лишь светозвуковые устройства для наполнения страйкбольной игры.
Бедные страйкболисты! Остаётся только посочувствовать тем, кому придётся пользоваться этим г*нокодом.
Изменять в обработчиках прерывания НЕvolatile переменные - двойное зло. Неудивительно, что возникли проблемы.
И отдельное зло - ожидая помощи, не отвечать на вопросы:
Уош писал(а):
Что значит, не видит? выдаёт ошибку? или в отладчике исчезает?
Основная проблема - переменная, измененная в прерывании, всегда будет ноль, когда к ней обращается основная программа. Но если после изменения сделать printf с ее участием, программа увидит корректное значение.
С Volatile вчера не помогло. Но может сегодня поможет? Бывает у Cube IDE такой загон, иногда он bin файл не перезаписывает или собирает по предыдущему коду, а я этого не заметил, приговорил Volatile, и продолжил отлаживать костыль printf... Да, так и вышло - Cube настолько "умный", что пока не внесешь значительные изменения в код, он может не пересобраться. Не раз с утра такое замечал - куб запустил, код собрал, а бинарник остался вчерашний Сегодня я обе нужные переменные пометил как volatile, и закомментил printf, и внезапно, переменная стала корректно запрашиваться основным кодом. Может, есть специальная кнопка, которая гарантированно при компиляции кода его заново перечитает? Я собираю с помощью молотка, на котором написано "Build"
Нейросетью удобно решать мелкие глупые вопросы, которые просто так не гуглятся, а спрашивать у народа - только народ пугать
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения