STM32 F1

Рана
Чт, 07 сентября 2017 г. 8:12
Комментарий удален

Ахулл
Чт, 07 сентября 2017 г. 8:37 утра
Похоже на веселый проект.

Первое препятствие, о котором я могу подумать... Как вы собираетесь синхронизировать видео со своим наложением? Есть ICS, специально разработанные для этой задачи, например LM1881 (в вашей схеме выше), но, не зная точно, с чем вы имеете дело в качестве своего источника, я не уверен, какой из них подходит. Имейте в виду, что LM1881 работает на запасе от 5 В до 12 В, тогда как LM1980 и LM1981 предназначены для работы при более низком напряжении питания 3V3 до 5 В, а STM32F103 - это устройство 3V3 (хотя большинство контактов на 5 В толеранты))

Второе препятствие, как вы собираетесь смешать свое наложение на свое видео? Я предполагаю, что для этого есть отдельный видеоммерник.

Просто чтобы быть ясным, ваша схема предлагает композитный источник видео, но что именно является источником видео, на которое мы накладываем на?
Это PAL или NTSC, это композитный, переплетный или неинтерлин, S-видео, отдельные компоненты, такие как VGA или Scart, или цифровой (HDMI и т. Д. (Что было бы совершенно другой игрой в мяч)).

Рана
Чт, 07 сентября 2017 г., 9:02
Комментарий удален

Ахулл
Чт, 07 сентября 2017 г. 9:12
Я полагаю, что LM1881 будет в порядке, если вы не забудьте подключить его к 5 -В -толерантному штифту на STM32F103

Вы можете найти это очень полезным

https: // www.Артекит.EU/VGA-OPPUT-USING-A-36-PIN-STM32/
https: // www.Артекит.EU/Space-Invaders-For-STM32/

.. Он использует STM32F103T8U6, но может быть возможно запустить его на синей таблетке или на какой -то другой плате STM32F103XXX. Хитрость заключается в том, чтобы адаптировать код, а затем выяснить, как использовать сигналы синхронизации LM1881, чтобы сохранить заблокированные STM32F103 к рамам источника (композит от детской кулачки).

Эти темы также могут вас заинтересовать.

http: // www.STM32duino.com/viewtopic.PHP ... VGA#P30598

http: // www.STM32duino.com/viewtopic.PHP ... VGA#P29749

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

Рана
Чт, 07 сентября 2017 г. 9:36 утра
Комментарий удален

Ахулл
Чт, 07 сентября 2017 г. 9:49
.. И вот где все становится интересным.. : D

Я не эксперт по регистрам любого устройства, но другие здесь, без сомнения, смогут посоветовать.

Как я бы предложил вам заняться этим с большим правящим блокнотом и пройдите через существующий код атмеля, делая заметки о том, что делает каждая процедура.
Без сомнения, сначала не так уж много будет иметь смысл, однако не паникуйте. Просто разбивайте вещи на управляемые куски и почувствуйте, как все это видит вместе. Не торопитесь с этим, так как вам понадобится четкое понимание времени и т. Д.

Далее выясните, какие штифты на STM вам нужны, и как работают связанные с ними регистры. Вы также можете подумать о том, чтобы воспользоваться некоторыми функциями STM, которые не имеют, например, DMA, различные таймеры и режимы таймера, а также доступные режимы PIN.

Вам нужно будет получить копию STM32 листы данных (Копия листов данных Atmel тоже была бы хорошей идеей).

Рана
Чт, 07 сентября 2017 г. 10:35 утра
Да, я сосредоточусь на этом небольшом проекте, любая помощь, конечно, будет оценена ;)

Ахулл
Чт, 07 сентября 2017 г., 11:23
Код из проекта Artekit выглядит хорошо задокументирован/прокомментирован, он использует три таймера и DMA, поэтому он должен предоставить довольно надежные сроки и быстрые обновления. Я вставил видео.C код ниже, чтобы вы могли увидеть, что я имею в виду.
/*************************************************************************** * STM32 VGA demo * Copyright (C) 2012 Artekit Italy * http://www.artekit.eu * Written by Ruben H. Meleca ### video.c # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ***************************************************************************/ #include "stm32f10x.h" #include "video.h" #define VTOTAL 52 /* Total bytes to send through SPI */ __align(4) u8 fb[VID_VSIZE][VID_HSIZE+2]; /* Frame buffer */ static volatile u16 vline = 0; /* The current line being drawn */ static volatile u32 vflag = 0; /* When 1, the SPI DMA request can draw on the screen */ static volatile u32 vdraw = 0; /* Used to increment vline every 3 drawn lines */ void TIMER_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef nvic; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; u32 TimerPeriod = 0; u16 Channel1Pulse = 0, Channel2Pulse = 0, Channel3Pulse = 0; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /* SVGA 800x600 @ 56 Hz Vertical refresh 35.15625 kHz Pixel freq. 36.0 MHz 1 system tick @ 72Mhz = 0,0138 us */ /* Horizontal timing ----------------- Timer 1 period = 35156 Hz Timer 1 channel 1 generates a pulse for HSYNC each 28.4 us. 28.4 us = Visible area + Front porch + Sync pulse + Back porch. HSYNC is 2 us long, so the math to do is: 2us / 0,0138us = 144 system ticks. Timer 1 channel 2 generates a pulse equal to HSYNC + back porch. This interrupt will fire the DMA request to draw on the screen if vflag == 1. Since firing the DMA takes more or less 800ns, we'll add some extra time. The math for HSYNC + back porch is: (2us + 3,55us - dma) / 0,0138us = +-350 system ticks Horizontal timing info ---------------------- Dots us -------------------------------------------- Visible area 800 22.222222222222 Front porch 24 0.66666666666667 Sync pulse 72 2 Back porch 128 3.5555555555556 Whole line 1024 28.444444444444 */ TimerPeriod = 2048; Channel1Pulse = 144; /* HSYNC */ Channel2Pulse = 352; /* HSYNC + BACK PORCH */ TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_Period = TimerPeriod; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; TIM_OCInitStructure.TIM_Pulse = Channel1Pulse; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High; TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset; TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Set; TIM_OC1Init(TIM1, &TIM_OCInitStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Inactive; TIM_OCInitStructure.TIM_Pulse = Channel2Pulse; TIM_OC2Init(TIM1, &TIM_OCInitStructure); /* TIM1 counter enable and output enable */ TIM_CtrlPWMOutputs(TIM1, ENABLE); /* Select TIM1 as Master */ TIM_SelectMasterSlaveMode(TIM1, TIM_MasterSlaveMode_Enable); TIM_SelectOutputTrigger(TIM1, TIM_TRGOSource_Update); /* Vertical timing --------------- Polarity of vertical sync pulse is positive. Lines ------------------------------ Visible area 600 Front porch 1 Sync pulse 2 Back porch 22 Whole frame 625 */ /* VSYNC (TIM2_CH2) and VSYNC_BACKPORCH (TIM2_CH3) */ /* Channel 2 and 3 Configuration in PWM mode */ TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Gated); TIM_SelectInputTrigger(TIM2, TIM_TS_ITR0); TimerPeriod = 625; /* Vertical lines */ Channel2Pulse = 2; /* Sync pulse */ Channel3Pulse = 24; /* Sync pulse + Back porch */ TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_Period = TimerPeriod; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; TIM_OCInitStructure.TIM_Pulse = Channel2Pulse; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High; TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset; TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Set; TIM_OC2Init(TIM2, &TIM_OCInitStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Inactive; TIM_OCInitStructure.TIM_Pulse = Channel3Pulse; TIM_OC3Init(TIM2, &TIM_OCInitStructure); /* TIM2 counter enable and output enable */ TIM_CtrlPWMOutputs(TIM2, ENABLE); /* Interrupt TIM2 */ nvic.NVIC_IRQChannel = TIM2_IRQn; nvic.NVIC_IRQChannelPreemptionPriority = 1; nvic.NVIC_IRQChannelSubPriority = 0; nvic.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&nvic); TIM_ITConfig(TIM2, TIM_IT_CC3, ENABLE); /* Interrupt TIM1 */ nvic.NVIC_IRQChannel = TIM1_CC_IRQn; nvic.NVIC_IRQChannelPreemptionPriority = 1; nvic.NVIC_IRQChannelSubPriority = 0; nvic.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&nvic); TIM_ITConfig(TIM1, TIM_IT_CC2, ENABLE); TIM_Cmd(TIM2, ENABLE); TIM_Cmd(TIM1, ENABLE); } void SPI_Configuration(void) { NVIC_InitTypeDef nvic; SPI_InitTypeDef SPI_InitStructure; DMA_InitTypeDef DMA_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); SPI_Cmd(SPI1, DISABLE); DMA_DeInit(DMA1_Channel3); DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&SPI1->DR; DMA_InitStructure.DMA_MemoryBaseAddr = (u32) &fb[0][0]; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; DMA_InitStructure.DMA_BufferSize = VTOTAL; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; DMA_InitStructure.DMA_Priority = DMA_Priority_Low; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel3, &DMA_InitStructure); SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(SPI1, &SPI_InitStructure); SPI_CalculateCRC(SPI1, DISABLE); SPI_Cmd(SPI1, ENABLE); SPI1->CR2 |= SPI_I2S_DMAReq_Tx; nvic.NVIC_IRQChannel = DMA1_Channel3_IRQn; nvic.NVIC_IRQChannelPreemptionPriority = 0; nvic.NVIC_IRQChannelSubPriority = 0; nvic.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&nvic); DMA1_Channel3->CCR &= ~1; DMA1_Channel3->CNDTR = VTOTAL; DMA1_Channel3->CMAR = (u32) &fb[0][0]; DMA_ITConfig(DMA1_Channel3, DMA_IT_TC, ENABLE); } //***************************************************************************** // This irq is generated at the end of the horizontal back porch. // Test if inside a valid vertical start frame (vflag variable), // and start the DMA to output a single frame buffer line through the SPI device. //***************************************************************************** __irq void TIM1_CC_IRQHandler(void) { if (vflag) { DMA1_Channel3->CCR = 0x93; } TIM1->SR = 0xFFFB; //~TIM_IT_CC2; } //***************************************************************************** // This irq is generated at the end of the vertical back porch. // Sets the 'vflag' variable to 1 (valid vertical frame). //***************************************************************************** __irq void TIM2_IRQHandler(void) { vflag = 1; TIM2->SR = 0xFFF7; //~TIM_IT_CC3; } //***************************************************************************** // This interrupt is generated at the end of every line. // It will increment the line number and set the corresponding line pointer // in the DMA register. //***************************************************************************** __irq void DMA1_Channel3_IRQHandler(void) { DMA1->IFCR = DMA1_IT_TC3; DMA1_Channel3->CCR = 0x92; DMA1_Channel3->CNDTR = VTOTAL; vdraw++; if (vdraw == 3) { vdraw = 0; vline++; if (vline == VID_VSIZE) { vdraw = vline = vflag = 0; DMA1_Channel3->CMAR = (u32) &fb[0][0]; } else { DMA1_Channel3->CMAR += VTOTAL; } } } void vidClearScreen(void) { u16 x, y; for (y = 0; y < VID_VSIZE; y++) { for (x = 0; x < VTOTAL; x++) { fb[y][x] = 0; } } } void vidInit(void) { SPI_Configuration(); TIMER_Configuration(); vidClearScreen(); }

Lena01
Сб 09 сентября 2017 г. 10:52 утра
Living VideoEtext была компанией по разработке программного обеспечения, основанной Дейвом Винером в 1983 году. Его лозунг был: «Мы делаем дерьмовое программное обеспечение... С ошибками!"Хотя это никогда не было публично в рекламе.
Компания была основана для продажи продукта Outliner под названием ThinkTank для Apple II. Этот продукт был основан на идеях, которые Winer разрабатывал в течение нескольких лет с тех пор, как университет. Winer перенес приложение для запуска на компьютерах IBM PC, совместимых с компьютерами, и, увидев демонстрацию почти выпущенного Macintosh Apple, Winer нанял своего брата Питера Винера для разработки версии Thinktank для Macintosh, которая к апрелю 1985 года продал 30 000 копий, или на Около 10% всех владельцев Mac. Даг Барон также был нанят для работы над версией Macintosh of ThinkTank.
Работа началась над другим приложением Outliner в конце 1984 года, который был расширен на графических концепциях, которые они начали добавлять в ThinkTank, например, позволяя пользователям легко преобразовать схемы в диаграммы пулей, которые будут использоваться в презентациях.

Рана
Сб 09 сентября 2017 г. 18:35
По крайней мере, бот ответил мне. :ржу не могу:

Rogerclark
Сб 09 сентября 2017 г. 9:25 вечера
[Рана - Сб 09 сентября 2017 г. 18:35] - По крайней мере, бот ответил мне. :ржу не могу:
Да.

Похоже, что форум был проник

Это, кажется, выплевывает бесполезную информацию, и теперь имеет 3 сообщения, все с информацией, которая выглядит значимой, но бесполезной

поиск.PHP?Author_id = 1833&SR = сообщения

Я предполагаю, что кто -то экспериментирует со своим ботом на нескольких форумах.

Я опубликую об этом, это отдельная ветка, прежде чем запретить этот бот, так как я не могу рискнуть, что он опубликовал тысячи спамов

Rogerclark
Сб 09 сентября 2017 г. 9:59 вечера
С точки зрения вашего проекта...

Я думаю, что основная задача состоит в том, чтобы получить выход из STM32 с синхронизацией с видео.

я.эн. STM32 должен быстро реагировать на вертикальные и горизонтальные сигналы каждый раз или с одной и той же задержкой, в противном случае вы получите зазубренные края на своем наложении.

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

Если вы хотите использовать прерывания, вам следует посмотреть на недавние сообщения в прерывании прерываний, так как некоторые булавки имеют один и тот же вектор ISR, поэтому код должен работать, чтобы проверить шаблоны битов, чтобы увидеть, какой PIN действительно вызвал прерывание.

Есть несколько булавок, которые имеют свой собственный вектор ISR и, следовательно, будут реагировать в Abiut 500NS, но даже это может быть слишком медленным для вас.

Я подозреваю, что вам нужно будет отключить прерывания, так как USB ISR может испортить выход.
(и существующий код вывода видео уже может это сделать)

Возможно, вы захотите посмотреть на потоку камеры OV7670, так как это имеет аналогичные проблемы с ожиданием VSYNC и HREF

КСТАТИ. Я предполагаю, что вы нашли схему для объединения видеосигнала...
И...
Вы не хотели бы выходить из Sync Signals из STM32 и только выводить текст наложения