Easyelectronics.ru

Электроника для всех
Текущее время: 21 ноя 2017, 11:31

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



    • 10 шт. 2-слоя 100*100mm 2$. Быстрый заказ: JLCPCB.com
    • JLCPCB - это крупнейшая фабрика PCB прототипов в Китае.
    • Имеющий более 290,000 клиентов и выполняющий более 8,000 заказов в день.
    • 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 Кб | Просмотров: 212 ]


порт А, пины 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 часов


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

Сейчас этот форум просматривают: lomy


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

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

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