Jump to content

    

LAS9891

Участник
  • Content Count

    248
  • Joined

  • Last visited

Everything posted by LAS9891


  1. Нашел такую статью. Доходчиво и без воды, но хотелось бы ещё. Вот ещё что подходит: про ethernet
  2. Добрый день! До недавнего времени не было необходимости в изучении Ethernet, обходился RS232/RS485. Возникла необходимость изучить устройство/работу Ethernet. В дальнейшем хотелось бы использовать эту технологию совместно с STM32. Подскажите литературу/статьи по данной теме для новичка.
  3. Статьи шикарные. Особенно понравились подобные фразы: Но всё равно спасибо, поищу ещё подобные статьи.
  4. Здравствуйте! Возникло желание рассчитать LC-фильтр. Но начну сначала. Есть необходимость использовать НЧ-фильтр на входе импульсного стабилизатора напряжения. Решено, что это будет так называемый Г-образный LC-фильтр. Предполагается такая схема: Теперь к расчёту. Нашел такую статью, где предлагают свести расчёт элементов фильтра к расчёту обычного делителя напряжения при условии его работы на частоте среза фильтра. Принимаю исходные данные для расчёта: напряжение на входе Uin = 1 В; напряжение на выходе Uout = 0,7 В; частота среза fср = 1 кГц. Необходимо рассчитать индуктивность катушки и ёмкость конденсатора. Далее, в статье при расчёте Г-образного ФВЧ на конденсаторе и дросселе присутствует такой текст Значит для начала надо задать "значение входного или выходного сопротивления фильтра как делителя напряжения на частоте среза АЧХ". Правильно ли я понимаю эту фразу? Входное сопротивления фильтра - это сопротивление катушки индуктивности, а выходное сопротивления фильтра - это сопротивление конденсатора. Соответственно нужно определиться с одним из параметров, либо с сопротивлением катушки на частоте среза, либо с сопротивлением конденсатора на частоте среза. Ну, допустим, определимся с сопротивлением конденсатора на частоте среза. Затем по значению этого сопротивления можно будет рассчитать ёмкость. Далее зная соотношение сопротивлений на частоте среза, можно определить сопротивление индуктивности, а уже по нему значение индуктивности. Теперь вопросы: 1) Правильно ли я вообще рассуждаю? 2) Как определиться с одним из параметров, либо с сопротивлением катушки на частоте среза, либо с сопротивлением конденсатора на частоте среза? Вычитал ещё такое: "Так как сопротивление нагрузки, подключаемой к выходу делителя, влияет на выходное напряжение, то значение сопротивления R2 (в моём случае конденсатора) должно быть в 100 раз меньше входного сопротивления нагрузки. Это правило также справедливо и при расчетах фильтров." Если, к примеру, этот фильтр подключался бы к входу операционного усилителя (у которого в идеале бесконечно большое входное сопротивление), то я бы выбрал значение в 100 Ом для сопротивления конденсатора на частоте среза, и по нему рассчитал бы емкость и индуктивность элементов. Но у меня вход источника питания. Как быть в этом случае? P.S.: Хоровица и Хилла уже читаю.
  5. Спасибо. Прочитал - проблема решилась.
  6. В смысле не пишите не читаете? Я в Scatter-файле указываю область памяти SRAM1. При сборке проекта в этой области размещаются данные. Их не я сам принудительно размещаю. Вот например что расположилось в SRAM1 при сборке (.map-файл): Execution Region RW_SRAM1 (Exec base: 0x30000000, Load base: 0x08011968, Size: 0x00000910, Max: 0x00020000, ABSOLUTE) Exec Addr Load Addr Size Type Attr Idx E Section Name Object 0x30000000 0x08011968 0x0000002c Data RW 36 .data functions.o 0x3000002c 0x08011994 0x00000004 PAD 0x30000030 0x08011998 0x0000006e Data RW 442 .data calibration.o 0x3000009e 0x08011a06 0x00000002 PAD 0x300000a0 0x08011a08 0x00000008 Data RW 679 .data font12.o 0x300000a8 0x08011a10 0x00000008 Data RW 2489 .data system_stm32h7xx.o 0x300000b0 - 0x00000200 Zero RW 34 .bss functions.o 0x300002b0 - 0x00000060 Zero RW 2631 .bss c_w.l(libspace.o) 0x30000310 - 0x00000200 Zero RW 2 HEAP startup_stm32h743xx.o 0x30000510 - 0x00000400 Zero RW 1 STACK startup_stm32h743xx.o Кроме SRAM1 в Scatter-файле также указаны области DTCM, AXI SRAM, SRAM4. В них тоже располагаются какие-то данные. Если в Scatter-файле указать только эти области, то все работает без проблем, если добавить SRAM1 - Hard Fault.
  7. Убрал. Потом в код добавил: uint32_t* pointer = (uint32_t*)0x30000000; *pointer = 1; Результат в отладке: Ещё наблюдение: Пробовал зажигать светодиод в прерывании по HF. Диод не горит, подозреваю, что это происходит из-за того, что инициализации порта не была проведена.
  8. Как? В отладку не зайти. В окошке Command сыплются "Cannot access Memory". Allregia что-то знает, но молчит.
  9. ; Reset handler Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT SystemInit IMPORT __main LDR R0, =SystemInit BLX R0 LDR R0, =__main BX R0 ENDP перед __main
  10. Похоже это мой случай. Если я использую такой scatter: ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision *** ; ************************************************************* LR_IROM1 0x08000000 0x00200000 { ; load region size_region ER_IROM1 0x08000000 0x00200000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) .ANY (+XO) } RW_DTCM 0x20000000 0x00020000 { ; RW data .ANY (+RW +ZI) } RW_AXI_SRAM 0x24000000 0x00080000 { .ANY (+RW +ZI) } RW_SRAM4 0x38000000 0x00010000 { .ANY (+RW +ZI) } } Всё работает. Стоит мне добавить область SRAM1: ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision *** ; ************************************************************* LR_IROM1 0x08000000 0x00200000 { ; load region size_region ER_IROM1 0x08000000 0x00200000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) .ANY (+XO) } RW_DTCM 0x20000000 0x00020000 { ; RW data .ANY (+RW +ZI) } RW_AXI_SRAM 0x24000000 0x00080000 { .ANY (+RW +ZI) } RW_SRAM1 0x30000000 0x00020000 { .ANY (+RW +ZI) } RW_SRAM4 0x38000000 0x00010000 { .ANY (+RW +ZI) } } Всё летит в Hard Fault. Тактирование SRAM1 включено в функции SystemInit (void): RCC->AHB2ENR |= (RCC_AHB2ENR_D2SRAM1EN | RCC_AHB2ENR_D2SRAM2EN | RCC_AHB2ENR_D2SRAM3EN); В отладчике проверил - тактирование включено. В чём проблема?
  11. СПАСИБО! Пока проверить не на чем, так что пока не важно. Мне интересно всё ли я сделал чтобы заработала SRAM1. В код добавил строчку: RCC->AHB2ENR |= RCC_AHB2ENR_SRAM1EN; // SRAM1 interface clock is enabled. В Scatter добавлю все необходимое благодаря Darth Vader. Что то ещё требуется для подключения SRAM1 в STM32H73 ?
  12. Не подскажите в чём была причина с проблемой С хипом и стеком? Столкнулся с чем то подобным, не получается корректно подключить область RAM1. Если кратко описать проблему, то я пробовал включать SRAM1 так: RCC->AHB2ENR |= RCC_AHB2ENR_SRAM1EN; // SRAM1 interface clock is enabled. В Scatter так: RW_SRAM1 0x30000000 0x00020000 { .ANY (+RW +ZI) } Собрал, перешил, запустил - проект стартует и рушится (вылетает блок GPIO, который удерживает питание для контроллера (ключ)). Мне кажется я как то не так включаю SRAM1.
  13. Я делал так же как автор вначале: В Scatter так: LR_IROM1 0x08000000 0x00200000 { ; load region size_region ER_IROM1 0x08000000 0x00200000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) .ANY (+XO) } RW_IRAM1 0x20000000 0x00020000 { ; RW data .ANY (+RW +ZI) } RW_IRAM2 0x24000000 0x00080000 { .ANY (+RW +ZI) } } Потом в программе так: uint8_t L8_160x120[57600]__attribute__((section("RW_IRAM2")))={0x00};// uint8_t L82_160x120[57600]__attribute__((section("RW_IRAM2")))={0x00};// и это работало. Что не так делал автор поясните? Что такое Execution Region? Что такое выходная секция? и почему у меня работало а у автора нет?
  14. Учтем на будущее. Пока изображение устраивает. Важнее теперь это. Самодельный блок питания на импульсниках.
  15. Подаю снаружи. Если я заливаю дисплей одним цветом, то изображение однородно без полос. Это не оправдывает питание? При этом все равно питание может быть причиной полос на картинке?
  16. Здравствуйте! Имеется задача. С аналоговой камеры видеосигнал поступает в STM32 через встроенный АЦП. Необходимо вывести изображение на дисплей. В качестве видеобуфера используется RAM контроллера. Изображение размером 160x120, поэтому встроенной RAM достаточно. Изображение буду выводить через LTDC. Вот тут вычитал, что руководить этим должен LTDC. В смысле, если используется несколько видеобуферов, то LTDC должен формировать прерывание в конце кадра и в прерывании менять адреса видеобуфера. Запуск камеры, я так понимаю, тоже должен быть в этом прерывании. Но какими должны быть частоты работы камеры и вывода изображения на дисплей в этом случае? В смысле, кто быстрее должен работать? или нужно подобрать одинаковые частоты? Действительно ли требуется минимум 3 видеобуфера или при определенных соотношениях частот достаточно 2?
  17. Вроде заработало Только как-то странно. Почему фон разного оттенка? Вот надпись STM, слева от буквы S фон светлее чем фон ниже надписи.
  18. Нет. Дисплей не поддерживает такой формат. LTDC поддерживает. Я в буфере формирую картинку в соответствии с форматом L8. Я буду выводить черно-белую картинку на цветной дисплей. В буфере кадра храню картинку в формате L8 (каждый пиксель 8 бит). А чтобы дисплей показывал черно-белую картинку я три раза отправляю одно значение пикселя для каждого цвета (RGB).
  19. Можно сказать и так. Для этих целей вместо SPI я использую 80 series parallel interface. С этим проблем нет - все работает. Все верно. В используемом дисплее цвет одного пикселя определяется за три такта пиксельной частоты. За эти три такта на линии данных должны быть установлены данные для каждого из трех цветов (RGB). Подробнее в datasheet на дисплей. UG-6028GDEBF02_21.03.2013.pdf Такого режима работы у LTDC нет. Но можно для LTDC указать ширину строки не 160, а 160х3 = 480. Тогда LTDC будет формировать нужное количество тактов пиксельной частоты. Я подумал, что не стоит марать пост. Но раз уж Вы настаиваете...Source: Header: Объявление фрейм буфера и переключение адреса для вывода изображения:
  20. У меня работал этот АЦП через DMA нормально, и запускался столько раз сколько надо. Первоначально настраивал АЦП в Cube, затем настраивал регистрами то чего не хватало. Многие ошибки в настройке выяснил при отладке. В Вашем коде не нашел настройки Boost mode. Эта настройка "Must be used when ADC clock > 20 MHz". Еще помню, что после калибровки, некоторые регистры сбрасывались и приходилось делать инициализацию АЦП после калибровки, поэтому сначала делал минимальную настройку для проведения калибровки, затем калибровал, а потом всю инициализацию АЦП по полной. Проверяйте тактирование АЦП и контроллера DMA.
  21. Я пытаюсь выводить картинку на дисплей через 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
  22. Здравствуйте. Я тоже разбираюсь с 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