Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить

Подключение VGA к STM32 - не понятные градиентные линии

Вт окт 10, 2017 15:58:42

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

photo_2017-10-10_16-54-47.jpg
(127.14 KiB) Скачиваний: 618


Собственно, инициализацию таймеров:
Код:
//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/40;
      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;
         }
      }
   }
}

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);
   }
}
Ответить