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

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Родился
Сообщения: 7
Зарегистрирован: Сб ноя 29, 2025 16:13:12

Сообщение satman555 »

Здравствуйте всем,
У меня вопрос такой имеется плата stm32f407zgt6 и дисплей ili9488 без тача. Не могу подружить.
Использую софт
1. Стм32кубеМХ
2. Touchgfx
3. Stm32cubeIDE

Никто не подскажет попроще путь? Я только начинаю разбираться с этим со всем)

Спасибо большое.

Сейчас смотрю видео, бубнит что то монотоно. Может кто знает по делу?
https://www.youtube.com/watch?v=g1siKaPox88
Реклама
Открыл глаза
Сообщения: 57
Зарегистрирован: Пн янв 13, 2014 16:01:21

Сообщение lubitel5 »

[uquote="veso74",url="/forum/viewtopic.php?p=4769556#p4769556"]lubitel5, меняете содержимое глобальной переменной count_print в прерывании. Добавьте volatile (если не)?[/uquote]
В данном случае она ж и меняется в прерывании.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Тогда лучше всего её внутри функции объявить как static.
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Помогите люди добрые :facepalm:
Работают в Keil, отладка/прошивка через ST-LINK V2. В какой-то момент, прошивать стало всю флешь, от начала и до конца, а не только то, что использовано в программе. После чего так стало не помню, точно менял .sct чтобы распихать стек и мелкие переменные в CCRAM, а большой массив в остальную RAM. Каждый раз при прошивке перетирать всю память тоскливо, сама программа пока чуть больше 4кБ из 500. Не пойму куда копать, то ли в sct, то ли в настройках самого ST-LINK, то ли в компилятор (чтобы он в конце HEX-файла нули не писал)...
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Реклама
Эиком - электронные компоненты и радиодетали
Вымогатель припоя
Сообщения: 619
Зарегистрирован: Вт окт 01, 2024 15:22:33

Сообщение Adrift »

Engineer_Keen, RAM сколько? Может во флеше теперь хранятся данные чтобы инитить ваш большой массив, даже если это одни нули.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Массив 120к, я заметил что вроде после его добавления такое стало, сейчас попробовал убрать +ZI из scatter файла, но это не повлияло, да и пишет во флешку явно больше 120к, там прямо до конца идет. И в Target поставил галки Noinit, не влияет.
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Смотрите map-файл что по каким адресам легло.
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Легло вроде все верно, но смущает что регионы RW_IRAM в скаттере как бы включены в LR_IROM1 судя по скобкам, и в map файле такая строчка получилась: " Load Region LR_IROM1 (Base: 0x08000000, Size: 0x0001f05c, Max: 0x00080000, ABSOLUTE)", т.е. там и код и все переменные и массив 120к. И в конце в итоге:
Total RO Size (Code + RO Data) 4720 ( 4.61kB)
Total RW Size (RW Data + ZI Data) 122348 ( 119.48kB)
Total ROM Size (Code + RO Data + RW Data) 127068 ( 124.09kB)
т.е. получается весь образ 127к, углядел адрес в момент конца загрузки, похоже на правду +-
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Поставщик валерьянки для Кота
Сообщения: 1963
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария

Сообщение veso74 »

[uquote="Engineer_Keen",url="/forum/viewtopic.php?p=4769649#p4769649"]... Каждый раз при прошивке перетирать всю память тосклив ...[/uquote]
Keil, STM32G. Tо же самое произошло, когда ввел одну константу в эмулированной флэш как EEPROM (в данном случае: double).

Код: Выделить всё

#define EEPROM_BASE_ADDR              0x0801F800  // start address of the last FLASH page (page 63)
#define EEPROM_FREQ_CALIB_COEFF_ADDR  0x00
const double EEPROM_FREQ_CALIBR_COEFF_DOUBLE __attribute__((section(".ARM.__at_0x0801F800"))) = 0.0;
и

Код: Выделить всё

Program Size: Code=6090 RO-data=522 RW-data=416 ZI-data=1648  
Из-за медленной записи МК по всей памяти (и невозможности найти быстрого решения) зaменил метод: (проверка пуста ли ячейка, если да, то запись по умолчанию, если нет: прочитать содержимое). Но сама причина интересная.
Последний раз редактировалось veso74 Ср дек 03, 2025 15:28:05, всего редактировалось 1 раз.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

#define EEPROM_BASE_ADDR 0x0801F800 // start address of the last FLASH page (page 63)
Тут я бы понял, даже если программа мелкая и кончается адресом 0x08000100, то программатор наверно прошьет все от 0х80000000 до 0x0801F800, хоть там и нули с 100го адреса, но в 0x0801F800 - ячейка EEPROM, т.е. та же флешь.
Но у меня-то кода 4к а дальше только чистый RAM, я даже в скаттере его вынул из LR_IROM1, теперь в map файле строчка поменялась на: Load Region LR_IROM1 (Base: 0x08000000, Size: 0x00001270, Max: 0x00080000, ABSOLUTE), но все равно есть вторая:
Load Region ER_IRAM (Base: 0x20000000, Size: 0x0001ddec, Max: 0x00020000, ABSOLUTE) и в итоге весь образ опять 127к, надо как-то указать что этот кусок в образ ROM не входит, но я никак не могу найти где и как это делается.

Пока ехал домой, подумал, может косяк в том что я память под переменные резервирую через space?
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Открыл глаза
Сообщения: 57
Зарегистрирован: Пн янв 13, 2014 16:01:21

Сообщение lubitel5 »

Что может быть не так? АЦП-ДМА после завершения передачи зависает в прерывании, это я так понял. По переводу-"получено неожиданное прерывание", но так и не понял что это значит. В описаниях режимов у F407 и F103 для моего случая не нашел. Но 407-й работает, а 103-й виснет.
Вложения
Код.png
(152.39 КБ) 214 скачиваний
Ошибка.png
(84.83 КБ) 215 скачиваний
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

А где собственно обработчик прерываний DMA? И зачем вообще прерывания?
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

надо как-то указать что этот кусок в образ ROM не входит, но я никак не могу найти где и как это делается.
Блин, нашел, просто в директиву AREA надо было NOINIT вписать :facepalm:
Вопросов не возникало пока я большой массив не задействовал, раньше переменные не сильно объема добавляли и я не замечал что прошивка долго идет...
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Открыл глаза
Сообщения: 57
Зарегистрирован: Пн янв 13, 2014 16:01:21

Сообщение lubitel5 »

В прерывании я изменял переменную и использовал в обработке данных. Но проблема для меня в том, почему виснет при разрешении прерывания. И не важно пустая функция или нет.
Вложения
ДМА.png
(12.59 КБ) 202 скачивания
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Посмотрите отладчиком таблицу векторов прерываний - правильно ли установлен вектор.
Встал на лапы
Аватара пользователя
Сообщения: 121
Зарегистрирован: Вт фев 28, 2017 08:13:31
Откуда: Свердловская обл.

Сообщение Zikon »

Зависает - это уходит на обработчик по умолчанию (DefaultHandler)
который есть бесконечный цикл

и да, скорее всего нет адреса обработчика в таблице векторов прерываний
PY32F002A+, N32G430, CW32L010
Открыл глаза
Сообщения: 57
Зарегистрирован: Пн янв 13, 2014 16:01:21

Сообщение lubitel5 »

DMA1_Channel1_IRQ n Handler: так и не понял откуда взялась эта лишняя буква, название переносил копированием. Правильно DMA1_Channel1_IRQHandler.
Вымогатель припоя
Аватара пользователя
Сообщения: 555
Зарегистрирован: Ср июн 29, 2022 16:25:45

Сообщение Just_Fluffy »

satman555, а что уже сделано для крепкой дружбы дисплея и МК?
Белая и Пушистая
Я не ИИ, поэтому могу ошибаться.
Нашел транзистор. Понюхал.
Сообщения: 154
Зарегистрирован: Пт май 20, 2022 22:19:02
Откуда: Ижевск

Сообщение Ифторик »

Здравствуйте, микроконтроллер stm32H743, мучаю я его кодированием джипегов, а так же мучаю ИИ в поисковике Гугл, он помог мне как то запустить, но дальше несет ересь, слишком сложно для него... или для меня, смотря с какой стороны посмотреть.
Получается идеально вывести картинку за один проход, разрешение которой кратно 16, на сколько памяти оперативной хватает, но никак не могу понять как закольцевать чтоб считывалось частями, чтобы открывать большие изображения, а не 100x100 максимум.
Программа объемная, с кучей ошибок, по этому выписал тезисами, в программе рассчитывается разрешение на кратность 8 или 16, лишнее обрезается если есть, количество пикселей исходя от раскодированного объема данных, я это всё вырезал (я сам писал это из головы, по этому оно скорее всего не работает). DMA или прерывания пока не использую, один раз залез туда, перекрестился и забыл про эту идею, на stm32f0 или stm32f4 еще можно в это вникнуть, но не на stm32h7, пока мне сама логика расчета джипега не понятна, скорость работы второстипенна. Я так понимаю, всё волшебство заключается в стандартной функции HAL_JPEG_DataReadyCallback, которая возвращает количество обработанных байтов когда буфер заполнился, с этим числом можно работать если картинка полностью влезла к буфер. А если не влезла? Хотелось бы знать количество рассчитанных блоков по 8 на 8 пикселей или 16 на 8, но количество байт не кратно количеству блоков. Создавать мини буфер, сращивать остаток со следующей партией?
Может кто то в курсе как оно должно происходить?
Спойлер

Код: Выделить всё

f_read(); //читаем джипег с флешки
HAL_JPEG_Decode(); //обрабатываем то что считалось с СД карты в формат YCbCr
	//---> при переполнении буфера для пикселей YCbCr вызывается HAL_JPEG_DataReadyCallback,
	//---> я глобально записываю сколько байт обработалось
HAL_JPEG_GetInfo(); //получаю информацию о картинке
//проверяю SUBSAMPLING - 420, 422 или 444,  если отличается, запускаю HAL_DMA2D_ConfigLayer(&hdma2d, DMA2DLAYER);
// тут много кода пропустил с расчетами //
OUTPUT_LCD: //метка для возврата назад
SCB_CleanDCache_by_Addr(); // очищаем буфер с пикселями YCbCr, иначе много артефактов, очищается больше, чем сам D-кеш - 32кб, хз как, но оно работает
HAL_DMA2D_Start(); //кодируем YCbCr в RGB565
LCD_JPEG(); //выводим на дисплей кусок картинки
//конец
//проверяем прочитан ли файл с флешки полностью
f_read();
HAL_JPEG_Decode();
goto OUTPUT_LCD;
//конец
Опытный кот
Сообщения: 751
Зарегистрирован: Пн фев 16, 2026 17:30:02

Сообщение Rapra »

Вкурсе, но вам оное зачем? Сидели бы спокойно, занимались чемнить простым типа елочной гирлянды с пикалкой
Ответить

Вернуться в «ARM»