Easyelectronics.ru

Электроника для всех
Текущее время: 15 дек 2017, 19:09

Часовой пояс: UTC + 5 часов



    • JLCPCB - Платы прототипов всего за 2$ c бесплатной доставкой (при первом заказе)
    • 10 PCBs за $2 для 2 слоев, $15 для 4 слойной, $74 для 6 слойной платы.
    • Крупнейший китайский производитель прототипных плат. 290000+ клиентов & 8000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин радиодеталей.

Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
 Заголовок сообщения: Подключение VGA к STM32 - непонятные градиентные линии
СообщениеДобавлено: 10 окт 2017, 19:44 
Здравствуйте!

Зарегистрирован: 10 окт 2017, 19:39
Сообщения: 1
Надеюсь на помощь, тк сломал уже всю голову. Делаю выход вга, плата c STM32F103C8T6. Линии цветов подключены через 220 ом резисторы, сигналы синхронизации напрямую. В общем, делал всё по статьям.
Сигнал формируется через прерывания от трёх таймеров и монитор видит этот сигнал и распознаёт, как 800х600х56. Но! Рисует от не каждую 39 и 40 линию, как я хочу, а непонятные градиенты. Всё проверил и для меня это осталось загадкой. Вот фотка:

Вложение:
photo_2017-10-10_16-54-47.jpg
photo_2017-10-10_16-54-47.jpg [ 127.14 Кб | Просмотров: 265 ]


порт А, пины 0, 2, 4 - цвета
порт Б, 0, 1 - синхронизация
порт С, пин 13 - лампочка. Просто, чтобы осознавать.

Собственно, инициализацию таймеров и гпио:

Код:
//init gpio
   GPIO_InitTypeDef  GPIO_InitStructure;
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
   
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOC, &GPIO_InitStructure);

  GPIOC->BSRR = GPIO_Pin_13;

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
   
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
   
   //line timer
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
   
   TIM_TimeBaseStructInit(&TIM_InitStructure); // Инициализация структуры
   TIM_InitStructure.TIM_Prescaler = 0;    // Предделитель
   TIM_InitStructure.TIM_Period = 2050;              // Период таймера
   TIM_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
   TIM_TimeBaseInit(TIM2, &TIM_InitStructure); // Функция настройки таймера
   TIM_Cmd(TIM2, ENABLE);                      // Включение таймера
   
   NVIC_EnableIRQ(TIM2_IRQn); 
   TIM_ITConfig(TIM2, TIM_DIER_UIE, ENABLE);
   
   //hor sync timer on
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
   TIM_TimeBaseStructInit(&TIM_InitStructure);
   TIM_InitStructure.TIM_Prescaler = 0;
   TIM_InitStructure.TIM_Period = 1600;
   TIM_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
   TIM_TimeBaseInit(TIM3, &TIM_InitStructure);
   
   NVIC_EnableIRQ(TIM3_IRQn); 
   TIM_ITConfig(TIM3, TIM_DIER_UIE, ENABLE);
   
   //hor sync timer off
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
   TIM_TimeBaseStructInit(&TIM_InitStructure);
   TIM_InitStructure.TIM_Prescaler = 0;
   TIM_InitStructure.TIM_Period = 1752;           
   TIM_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
   TIM_TimeBaseInit(TIM4, &TIM_InitStructure);
   
   NVIC_EnableIRQ(TIM4_IRQn); 
   TIM_ITConfig(TIM4, TIM_DIER_UIE, ENABLE);


Ну и код прерываний:

Код:

void TIM2_IRQHandler(void){
   if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET){
      TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
      TIM_Cmd(TIM3, ENABLE);
      TIM_Cmd(TIM4, ENABLE);
      
      vline++;
      clr++;
      
      if (vline >= (LINE_COUNT-4)){
         VSYNC_ON;
      }else{
         VSYNC_OFF;
      }
      
      int clrsel = clr/20;
      int clrsec = GPIO_Pin_0;
      if (clrsel%3 == 1) clrsec = GPIO_Pin_2;
      if (clrsel%3 == 2) clrsec = GPIO_Pin_4;
      
      
      if (vline < 600 && (vline%40 == 0 || vline%40 == 1)){
         GPIOA->BRR = clrsec;
      }else{
         GPIOA->BSRR = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;
      }
      
      if (vline==LINE_COUNT){
         vline = 0;
         frame++;
         clr = 0;
         if (frame == 60){
            GPIOC->BRR = GPIO_Pin_13;
         }
         
         if (frame == 120){
            GPIOC->BSRR = GPIO_Pin_13;
            frame = 0;
            //counter+=1;
         }
      }
   }
}

void TIM3_IRQHandler(void){
   if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET){
      GPIOA->BSRR = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;
      HSYNC_ON;
      TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
      TIM_Cmd(TIM3, DISABLE);
   }
}

void TIM4_IRQHandler(void){
   if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET){
      HSYNC_OFF;
      TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
      TIM_Cmd(TIM4, DISABLE);
   }
}


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ 1 сообщение ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB