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

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить
Встал на лапы
Аватара пользователя
Сообщения: 132
Зарегистрирован: Вс сен 23, 2012 05:51:35

Сообщение black_lizard »

Надеюсь на помощь, тк сломал уже всю голову. Делаю выход вга, плата c STM32F103C8T6. Линии цветов подключены через 220 ом резисторы, сигналы синхронизации напрямую. В общем, делал всё по статьям.
Сигнал формируется через прерывания от трёх таймеров и монитор видит этот сигнал и распознаёт, как 800х600х56. Но! Рисует от не каждую 39 и 40 линию, как я хочу, а непонятные градиенты. Всё проверил и для меня это осталось загадкой. Вот фотка:
photo_2017-10-10_16-54-47.jpg
(127.14 КБ) 682 скачивания
Собственно, инициализацию таймеров:

Код: Выделить всё

//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);
	}
}
Собираю самопальный мини-компьютер
Реклама
Ответить

Вернуться в «Периферия»