Jump to content

    

LAS9891

Участник
  • Content Count

    234
  • Joined

  • Last visited

Everything posted by LAS9891


  1. Учтем на будущее. Пока изображение устраивает. Важнее теперь это. Самодельный блок питания на импульсниках.
  2. Подаю снаружи. Если я заливаю дисплей одним цветом, то изображение однородно без полос. Это не оправдывает питание? При этом все равно питание может быть причиной полос на картинке?
  3. Здравствуйте! Имеется задача. С аналоговой камеры видеосигнал поступает в STM32 через встроенный АЦП. Необходимо вывести изображение на дисплей. В качестве видеобуфера используется RAM контроллера. Изображение размером 160x120, поэтому встроенной RAM достаточно. Изображение буду выводить через LTDC. Вот тут вычитал, что руководить этим должен LTDC. В смысле, если используется несколько видеобуферов, то LTDC должен формировать прерывание в конце кадра и в прерывании менять адреса видеобуфера. Запуск камеры, я так понимаю, тоже должен быть в этом прерывании. Но какими должны быть частоты работы камеры и вывода изображения на дисплей в этом случае? В смысле, кто быстрее должен работать? или нужно подобрать одинаковые частоты? Действительно ли требуется минимум 3 видеобуфера или при определенных соотношениях частот достаточно 2?
  4. Вроде заработало Только как-то странно. Почему фон разного оттенка? Вот надпись STM, слева от буквы S фон светлее чем фон ниже надписи.
  5. Нет. Дисплей не поддерживает такой формат. LTDC поддерживает. Я в буфере формирую картинку в соответствии с форматом L8. Я буду выводить черно-белую картинку на цветной дисплей. В буфере кадра храню картинку в формате L8 (каждый пиксель 8 бит). А чтобы дисплей показывал черно-белую картинку я три раза отправляю одно значение пикселя для каждого цвета (RGB).
  6. Можно сказать и так. Для этих целей вместо SPI я использую 80 series parallel interface. С этим проблем нет - все работает. Все верно. В используемом дисплее цвет одного пикселя определяется за три такта пиксельной частоты. За эти три такта на линии данных должны быть установлены данные для каждого из трех цветов (RGB). Подробнее в datasheet на дисплей. UG-6028GDEBF02_21.03.2013.pdf Такого режима работы у LTDC нет. Но можно для LTDC указать ширину строки не 160, а 160х3 = 480. Тогда LTDC будет формировать нужное количество тактов пиксельной частоты. Я подумал, что не стоит марать пост. Но раз уж Вы настаиваете...Source: Header: Объявление фрейм буфера и переключение адреса для вывода изображения:
  7. У меня работал этот АЦП через DMA нормально, и запускался столько раз сколько надо. Первоначально настраивал АЦП в Cube, затем настраивал регистрами то чего не хватало. Многие ошибки в настройке выяснил при отладке. В Вашем коде не нашел настройки Boost mode. Эта настройка "Must be used when ADC clock > 20 MHz". Еще помню, что после калибровки, некоторые регистры сбрасывались и приходилось делать инициализацию АЦП после калибровки, поэтому сначала делал минимальную настройку для проведения калибровки, затем калибровал, а потом всю инициализацию АЦП по полной. Проверяйте тактирование АЦП и контроллера DMA.
  8. Я пытаюсь выводить картинку на дисплей через LTDC. Контроллер STM32H743IIT6, дисплей UG-6028GDEBF02. Дисплей имеет разрешение 160x128. Цвет каждого пикселя определяется данными, которые поступают за три такта пиксельной частоты — по такту на цвет (R, G, B). Я хочу выводить Ч/Б изображение используя пиксельный формат L8. Для этого каждый пиксель буду определять тремя одинаковыми значениями по цветам (R=G=B). Раз каждый пиксель определяется тремя тактами пиксельной частоты, то в одной строке должно быть 160х3 = 480 тактов — или 480 пикселей. Таким образом для LTDC мое изображение преобразуется в 480х128. Дисплей можно настроить на режим работы 160х120 (с помощью встроенного в дисплей контроллера), что я и сделал. Попробовал вывести на дисплей изображение формата 160х120 с помощью встроенного в дисплей контроллера — все получилось как и должно быть.Теперь пытаюсь выводить на дисплей картинку по интерфейсу RGB используя LTDC. Настроил все на регистрах и по ДШ. Сформировал массив на 57600 пикселей (160х120х3). В массиве закрасил первый пиксель в первой строке (нулевой пиксель в нулевой строке), первый пиксель в третьей строке (нулевой пиксель во второй строке) и последний пиксель в кадре 57600 (57599). Вывожу на дисплей — вижу картинку как на картинке. Первый пиксель в первой строке горит не в начале дисплея, он смещен вправо, также как и первый пиксель в третьей строке. Последний горит слева от первого. Картинка отобразилась не до конца, почему то LTDC не отобразил весь буфер, а не дождавшись конца начал отображать первый пиксель, хотя адрес для нового кадра взял не первый в буфере, а тот с которого он прекратил отображать.Пробовал поиграться с настройками — проблему не победил. Не подскажите что-нибудь дельное? С какими регистрами поиграть и как? Возможно я косячу с параметрами синхронизации. Вот все что относится к RGB интерфейсу дисплея: Если я косячу с параметрами синхронизации, то что тут принять за них? Я принял следующие: #define HSYNC_WIDTH ((uint16_t)3) #define VSYNC_WIDTH ((uint16_t)1) #define HBP ((uint16_t)0) #define VBP ((uint16_t)0) #define ACTIVE_WIDTH ((uint16_t)480) #define ACTIVE_HEIGHT ((uint16_t)120) #define HFP ((uint16_t)0) #define VFP ((uint16_t)0) Полный код прилагаю: lar_ltdc.h lar_ltdc.c
  9. Здравствуйте. Я тоже разбираюсь с LTDC. Я пытаюсь выводить картинку на дисплей через LTDC.Контроллер STM32H743IIT6, дисплей UG-6028GDEBF02. Дисплей имеет разрешение 160x128. Цвет каждого пикселя определяется данными, которые поступают за три такта пиксельной частоты — по такту на цвет (R, G, B). Я хочу выводить Ч/Б изображение используя пиксельный формат L8. Для этого каждый пиксель буду определять тремя одинаковыми значениями по цветам (R=G=B). Раз каждый пиксель определяется тремя тактами пиксельной частоты, то в одной строке должно быть 160х3 = 480 тактов — или 480 пикселей. Таким образом для LTDC мое изображение преобразуется в 480х128. Дисплей можно настроить на режим работы 160х120 (с помощью встроенного в дисплей контроллера), что я и сделал. Попробовал вывести на дисплей изображение формата 160х120 с помощью встроенного в дисплей контроллера — все получилось как и должно быть.Теперь пытаюсь выводить на дисплей картинку по интерфейсу RGB используя LTDC. Настроил все на регистрах и по ДШ. Сформировал массив на 57600 пикселей (160х120х3). В массиве закрасил первый пиксель в первой строке (нулевой пиксель в нулевой строке), первый пиксель в третьей строке (нулевой пиксель во второй строке) и последний пиксель в кадре 57600 (57599). Вывожу на дисплей — вижу картинку как на картинке. Первый пиксель в первой строке горит не в начале дисплея, он смещен вправо, также как и первый пиксель в третьей строке. Последний горит слева от первого. Картинка отобразилась не до конца, почему то LTDC не отобразил весь буфер, а не дождавшись конца начал отображать первый пиксель, хотя адрес для нового кадра взял не первый в буфере, а тот с которого он прекратил отображать.Пробовал поиграться с настройками — проблему не победил. Не подскажите что-нибудь дельное? С какими регистрами поиграть и как? LTDC настраиваю православными регистрами. Вся настройка в функции LTDC_Init(). Надеюсь на помощь. lar_ltdc.c lar_ltdc.h
  10. Учтемс. Хотя эту часть кода генерит STM32CubeMX и эту область предполагается не менять.
  11. Я в курсе. Меня интересует именно работа прерываний, останавливать таймеры или нет - детали. Правильные callback функции я выбрал? Правильно разрешил прерывания? Если - да, то почему работает не как как хотелось? То о чем вы говорите устанавливается настройкой Output compare preload в значение Disable. При этом как только таймер получил новое значение для сравнения то сразу будет учитывать его. Кстати работоспособность этого можно увидеть на первой осциллограмме - переполнение ещё не наступило, новое значение для сравнение записано, и после прерывания видим импульс с измененным заполнением.
  12. CPU clock 400 MHz APB2 Timer Clocks 200 MHz Сейчас бы выяснить где косяк в прерываниях
  13. Уточнение: Первое прерывание возникает по TIM2 по совпадению регистра CNT со значением Pulse в STM32CubeMX. Pulse = 12-1 = 11. На осциллограммах видно что два первоначальных импульса формируются за 12 тактов, после чего формируется прерывание. Второе прерывание должно формироваться по переполнению TIM2. Для TIM2 Counter Period = 18-1 = 17.
  14. Пробую написать программу на STM32 используя HAL библиотеки. В программе инициализируются три таймера номер 3 (TIM3) , номер 5 (TIM5), номер 2 (TIM2). TIM3 тактируется от внутреннего источника (от шины), работает в режиме ШИМ и формирует на выходе меандр с частотой 1,2 МГц. TIM5 тактируется от TIM3, работает в режиме ШИМ. TIM2 тактируется от TIM3, работает в режиме сравнения. Как хотелось бы чтобы работало: Таймеры запускаются одновременно. Разрешается прерывание по TIM2 по значению Pulse в STM32CubeMX. TIM2 отсчитывает интервал времени в течение которого TIM5 сформирует на выходе два импульса ШИМ с заданной частотой и заполнением. Когда TIM2 досчитывает до конца временного интервала (значение Pulse в STM32CubeMX), формируется прерывание. В обработчике прерывания меняется заполнение импульсов, которые формирует TIM5. Запрещается прерывание TIM2 по значению Pulse и разрешается прерывание TIM2 по переполнению. Далее таймеры продолжают считать. TIM5 формирует один импульс с измененным заполнением и возникает переполнение по переполнению TIM2. В обработчике прерывания меняется заполнение импульсов, которые формирует TIM5, на изначальное значение. Запрещается прерывание TIM2 по переполнению, разрешается прерывание TIM2 по значению Pulse. И так по кругу... TIM5 на выходе должен формировать последовательность импульсов: два с одинаковым заполнением, один с меньшим, опять два с одинаковым, опять один с меньшим и т.д. Написал такой код main.c: MX_GPIO_Init(); MX_TIM3_Init(); MX_TIM2_Init(); MX_TIM5_Init(); HAL_TIM_PWM_Start (&htim2, TIM_CHANNEL_1); HAL_TIM_PWM_Start (&htim2, TIM_CHANNEL_2); HAL_TIM_OC_Start_IT(&htim2, TIM_CHANNEL_3); HAL_TIM_PWM_Start (&htim5, TIM_CHANNEL_1); HAL_TIM_PWM_Start (&htim3, TIM_CHANNEL_1); while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } Обработка прерываний такая: void HAL_TIM_OC_DelayElapsedCallback (TIM_HandleTypeDef *htim) { if (htim->Instance == TIM2) { if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_3) // Необходимо сформировать последний в кадре импульс INT. { HAL_TIM_PWM_Stop (&htim3, TIM_CHANNEL_1); HAL_TIM_PWM_Stop (&htim2, TIM_CHANNEL_1); // Выключение таймера. Таймер работал в режиме работы с формированием прерывания. HAL_TIM_PWM_Stop (&htim2, TIM_CHANNEL_2); // Выключение таймера. Таймер работал в режиме работы с формированием прерывания. HAL_TIM_OC_Stop_IT (&htim2, TIM_CHANNEL_3); // Выключение таймера. Таймер работал в режиме работы с формированием прерывания. HAL_TIM_PWM_Stop (&htim5, TIM_CHANNEL_1); // Выключение таймера. Таймер работал в режиме работы без формированием прерывания. TIM5->CCR1 = 4; __HAL_TIM_ENABLE_IT(&htim2, TIM_IT_UPDATE); HAL_TIM_PWM_Start (&htim2, TIM_CHANNEL_1); HAL_TIM_PWM_Start (&htim2, TIM_CHANNEL_2); HAL_TIM_OC_Start (&htim2, TIM_CHANNEL_3); HAL_TIM_PWM_Start (&htim5, TIM_CHANNEL_1); HAL_TIM_PWM_Start (&htim3, TIM_CHANNEL_1); } else return; } } //---Прерывание по переполнению счетчика-------------------------------------------------------------------------------------------- void HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef *htim) { if(htim->Instance == TIM2) { HAL_TIM_PWM_Stop (&htim3, TIM_CHANNEL_1); HAL_TIM_PWM_Stop (&htim2, TIM_CHANNEL_1); // Выключение таймера. Таймер работал в режиме работы с формированием прерывания. HAL_TIM_PWM_Stop (&htim2, TIM_CHANNEL_2); // Выключение таймера. Таймер работал в режиме работы с формированием прерывания. HAL_TIM_OC_Stop (&htim2, TIM_CHANNEL_3); // Выключение таймера. Таймер работал в режиме работы с формированием прерывания. HAL_TIM_PWM_Stop (&htim5, TIM_CHANNEL_1); // Выключение таймера. Таймер работал в режиме работы без формированием прерывания. __HAL_TIM_DISABLE_IT (&htim2, TIM_IT_UPDATE ); TIM5->CCR1 = 3; HAL_TIM_PWM_Start (&htim2, TIM_CHANNEL_1); HAL_TIM_PWM_Start (&htim2, TIM_CHANNEL_2); HAL_TIM_OC_Start_IT(&htim2, TIM_CHANNEL_3); HAL_TIM_PWM_Start (&htim5, TIM_CHANNEL_1); HAL_TIM_PWM_Start (&htim3, TIM_CHANNEL_1); } else return; } Начинаю отлаживать. Пробую сначала работу без второго обработчика прерывания. Вижу следующую картину Верхний сигнал это сигналы TIM3, нижний - сигналы TIM5. Видно два первых импульса, прерывание - когда все таймеры остановлены, и последующие импульсы с меньшим заполнением. Все как хотел. Дальше проверяю с двумя обработчиками прерываний. Устанавливаю точку остановки (break) во втором обработчике прерываний на строчке TIM5->CCR1 = 3. Ожидаю увидеть два первых импульса, прерывание и один импульс с меньшим заполнением. Вижу следующее: Два первых импульса есть, прерывание есть и тишина. Где один импульс с меньшим заполнением? Ниже картина от начала времен без остановки: Виден странный перепад на линии TIM3 и импульсы с изначальным заполнением. Далее картина не лучше: Предположение такое - по какой-то причине второе прерывание возникает сразу после выхода из первого, и короткий импульс не успевает сформироваться. Подскажите в чем проблема?
  15. Разрабатываю проект в STM32Cube для Keil. В проекте имеется два таймера: TIM5 и TIM3. TIM3 настраиваю как Master. TIM3 тактируется от Internal clock. В меню Trigger Event Selection TRGO выбрано формирование импульса по совпадению - значение Event. TIM2 настраиваю как Slave. TIM5 тактируется от External Clock Mode 1, в качестве Trigger Source выбран ITR2 - что соответствует TIM3. Подобнее настройки TIM5 на картинке: Таким образом TIM3 работает на частоте шины, а TIM5 работает на частоте TIM3. На осциллографе наблюдаю следующие сигналы: На осциллограмме верхний сигнал - выход TIM3 сразу после сброса контроллера; нижний сигнал - выход TIM5 сразу после сброса контроллера. На второй осциллограмме те же сигналы позднее - второй и последующие периоды TIM5. Видно, что при старте длительность лог. 0 на выходе TIM5 больше чем в последующих периодах. Кроме того, первый срез на выходах происходит неодновременно. Хотелось бы чтобы первый импульс на выходе TIM5 был аналогичен последующим. Пробовал различные настройки в Cube - не помогло. Как сделать первоначальные срезы синхронными и выровнять длительность первого импульса на TIM2 с остальными?
  16. Вот человек столкнулся с аналогичной проблемой в 18 версии: https://forum.live.altium-ru.com/#posts/231484/719166
  17. После установки Altium Designer 19.1.8 (Build 144) пробую создать новый файл схемы Sheet1.SchDoc. Окно программы выглядит так: Все устраивает, все на месте. Затем пробую создать новый файл платы PCB1.PcbDoc. Окно программы выглядит так: Явное отличие - в редакторе плат отсутствует панель главного меню (File Edit View и т.д.). Кроме того не работают все hotkeys.Как вернуть панель на место и включить hotkeys?
  18. Поподробнее пожалуйста.
  19. У меня нет этой области, поэтому не могу сделать я этот клик. Как включить эту область?
  20. После установки Altium Designer 19.1.8 (Build 144) пробую создать новый файл схемы Sheet1.SchDoc. Окно программы выглядит так: Все устраивает, все на месте. Затем пробую создать новый файл платы PCB1.PcbDoc. Окно программы выглядит так: Явное отличие - в редакторе плат отсутствует панель главного меню (File Edit View и т.д.). Кроме того не работают все hotkeys. Как вернуть панель на место и включить hotkeys?
  21. Имеется плата, которая подключается к компьютере посредством интерфейса RS-485 с использованием MOXA UPort 1130. При подключении всего перечисленного ничего не работает. На MOXA горит постоянно светодиод "Active" и в момент передачи светится "TxD". На осциллографе видны импульсы на выводе 3 Data+(B). Как проверить работоспособность MOXA без подключения платы, чтобы убедиться в её невиновности?
  22. Неважно. Мне лень убеждать и расписывать зачем мне это. Вопрос стоит так: "Как сформировать проекцию по step-модели в Altium? Возможно ли это?"
  23. Мне нужно. Необходимо установить на плату здоровенную железяку, а вокруг нее ещё нужно расположить кучу элементов электрической схемы. Так вот я вставляю STEP-модель, и на виде 2-D железяка отображается в виде заштрихованного прямоугольника сформированного по крайним точкам модели, хотя реальный контур железки занимает меньшую площадь и на свободное место я могу разместить схему. Поэтому чтобы видеть реальный контур железки мне приходится делать проекцию железки в AutoCAD а потом экспортировать её в Altium. И каждый раз нужно повторять эту процедуру если железка чуть изменилась.