Demo of low res colour vga video for stm32f3 discovery board
Dependencies: STM32F3-Discovery-minimal
Fork of Space_Invaders_Demo by
Diff: video.c
- Revision:
- 7:513afc954d6e
- Parent:
- 6:f16335989076
- Child:
- 8:34fb94209517
--- a/video.c Thu May 17 21:27:22 2018 +0000 +++ b/video.c Mon May 28 10:38:27 2018 +0000 @@ -123,9 +123,10 @@ */ - TimerPeriod = 2048; - Channel1Pulse = 144; /* HSYNC */ - Channel2Pulse = 360; /* HSYNC + BACK PORCH */ + TimerPeriod = 2288;//2303; + Channel1Pulse = 274;//274;//274;//277; /* HSYNC */ + //Channel2Pulse = 850;//410;//348; /* HSYNC + BACK PORCH */ + Channel3Pulse = 392;//412;//394; TIM1->CR1 &= ~TIM_CR1_CEN; TIM1->PSC=0; @@ -133,36 +134,56 @@ TIM1->CNT=0; // disable Capture and Compare 1 and 2 - TIM1->CCER &= ~(TIM_CCER_CC1E | TIM_CCER_CC2E); + TIM1->CCER &= ~(TIM_CCER_CC1E);// | TIM_CCER_CC2E); // set output compare 1 to PWM mode with preload TIM1->CCMR1 = (TIM1->CCMR1 & ~(TIM_CCMR1_OC1M | TIM_CCMR1_CC1S)) | TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1; - TIM1->CCMR1 = (TIM1->CCMR1 & ~(TIM_CCMR1_OC2M | TIM_CCMR1_CC2S)) | TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2CE; + //TIM1->CCMR1 = (TIM1->CCMR1 & ~(TIM_CCMR1_OC2M | TIM_CCMR1_CC2S)) | TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2CE; TIM1->CCR1=Channel1Pulse; - TIM1->CCR2=Channel2Pulse; +// TIM1->CCR2=Channel2Pulse; // TIM1->CCR3=Channel2Pulse+100; //TIM1->CCR2 |= TIM_CR2_OIS1; // output idle state set -// TIM1->CCR3 |= TIM_CR2_OIS1; + //TIM1->CR2 |= TIM_CR2_OIS1; // enable Capture and Compare 1 - TIM1->CCER |= TIM_CCER_CC1E | TIM_CCER_CC2E | TIM_CCER_CC1P | TIM_CCER_CC2P; // output polarity low + TIM1->CCER |= TIM_CCER_CC1E | TIM_CCER_CC1P ;// | TIM_CCER_CC2E | TIM_CCER_CC1P | TIM_CCER_CC2P; // output polarity low // main output enable TIM1->BDTR |= TIM_BDTR_MOE; TIM1->SMCR |= TIM_SMCR_MSM; // master slave mode - TIM1->CR2 = (TIM1->CR2 & ~TIM_CR2_MMS) | (3<<4); ///*TIM_CR2_MMS_2 |*/ TIM_CR2_MMS_1 /*| TIM_CR2_MMS_0*/;// TIM_TRGOSource_Update mode + TIM1->CR2 = (TIM1->CR2 & ~TIM_CR2_MMS) | (2<<4); ///*TIM_CR2_MMS_2 |*/ TIM_CR2_MMS_1 /*| TIM_CR2_MMS_0*/;// TIM_TRGOSource_Update mode TIM8->CR1 &= ~TIM_CR1_CEN; TIM8->CR1 |= TIM_CR1_ARPE; TIM8->PSC=0; - TIM8->ARR=8; + TIM8->ARR=11; TIM8->CNT=0; //TIM16->CR1 |= TIM_CR1_OPM; TIM8->DIER |= TIM_DIER_UDE; - TIM8->SMCR=TIM8->SMCR & ~(TIM_SMCR_SMS | TIM_SMCR_TS) | 4 ; + + TIM8->SMCR=TIM8->SMCR & ~(TIM_SMCR_SMS | TIM_SMCR_TS) | 6 | (3<<4); // trigger mode from itr3 (tim3) //TIM16->SMCR |= TIM_SMCR_MSM; //TIM16->CR2 = (TIM16->CR2 & ~TIM_CR2_MMS) | TIM_CR2_MMS_1;// TIM_TRGOSource_Update mode + TIM3->CR1 &= ~TIM_CR1_CEN; + TIM3->PSC=0; + TIM3->ARR=Channel3Pulse;//TimerPeriod/2; + TIM3->CNT=0; + + // disable Capture and Compare 1 and 2 +// TIM3->CCER &= ~(TIM_CCER_CC1E); + // set output compare 1 to PWM mode with preload +// TIM3->CCMR1 = (TIM3->CCMR1 & ~(TIM_CCMR1_OC1M | TIM_CCMR1_CC1S)) | TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1; +// TIM3->CCR1=Channel3Pulse; + + TIM3->CR1 |= TIM_CR1_OPM; +// TIM3->CCER |= TIM_CCER_CC1E | TIM_CCER_CC1P; // output polarity low + + //TIM3->SMCR |= TIM_SMCR_MSM; // master slave mode + TIM3->SMCR=TIM3->SMCR & ~(TIM_SMCR_SMS | TIM_SMCR_TS) | 6 ; // trigger mode from itr0 (tim1) + + TIM3->CR2 = (TIM3->CR2 & ~TIM_CR2_MMS) | (2<<4); ///*TIM_CR2_MMS_2 |*/ TIM_CR2_MMS_1 /*| TIM_CR2_MMS_0*/;// TIM_TRGOSource_Update mode + /* Vertical timing --------------- @@ -181,12 +202,12 @@ /* VSYNC (TIM2_CH2) and VSYNC_BACKPORCH (TIM2_CH3) */ /* Channel 2 and 3 Configuration in PWM mode */ - TIM2->SMCR=TIM2->SMCR & ~(TIM_SMCR_SMS | TIM_SMCR_TS) | 5 ;// triggered slave mode trigger source 0 + TIM2->SMCR=TIM2->SMCR & ~(TIM_SMCR_SMS | TIM_SMCR_TS) | 5 ;// gated slave mode trigger source 0 - TimerPeriod = 625; /* Vertical lines */ + TimerPeriod = 525; /* Vertical lines */ Channel2Pulse = 2; /* Sync pulse */ - Channel3Pulse = 24; /* Sync pulse + Back porch */ + Channel3Pulse = 35; /* Sync pulse + Back porch */ TIM2->CR1 &= ~TIM_CR1_CEN; TIM2->PSC=0; @@ -200,7 +221,8 @@ TIM2->CCR2=Channel2Pulse; TIM2->CCR3=Channel3Pulse; -// TIM2->CCR2 |= TIM_CR2_OIS1; // output idle state set + + TIM2->CR2 &= ~TIM_CR2_OIS1; // output idle state set // enable Capture and Compare 2 and 3 TIM2->CCER |= TIM_CCER_CC2E | TIM_CCER_CC3E | TIM_CCER_CC1P | TIM_CCER_CC2P; // output polarity low @@ -215,7 +237,7 @@ NVIC->IP[TIM1_CC_IRQn]=0; // Interrupt Priority, lower is higher priority NVIC->ISER[TIM1_CC_IRQn >> 0x05] = 1 << (TIM1_CC_IRQn & 0x1F); // Interrupt enable - TIM1->DIER |= TIM_DIER_CC2IE; + //TIM1->DIER |= TIM_DIER_CC2IE; TIM2->CR1 |= TIM_CR1_CEN; TIM1->CR1 |= TIM_CR1_CEN; @@ -224,8 +246,8 @@ void DMA_Configuration(void) { //gpio_set_af(GPIOA,7,5,GPIO_OUTPUT_PUSH_PULL, GPIO_NO_PULL, GPIO_SPEED_HIGH); - GPIOD->PUPDR = (GPIOD->PUPDR & ~0xffff) | 0;//xaaaa; // pull down (1010) - GPIOD->OSPEEDR = (GPIOD->OSPEEDR & ~(0xffff)) | 0xffff; + GPIOD->PUPDR = (GPIOD->PUPDR & ~0xffff);//0xaaaa; // pull down (1010) + GPIOD->OSPEEDR = (GPIOD->OSPEEDR & ~0xffff) | 0xffff; RCC->AHBENR |= RCC_AHBENR_DMA2EN; @@ -233,7 +255,7 @@ DMA2_Channel1->CCR = DMA_CCR_DIR | DMA_CCR_MINC | DMA_CCR_PL_1 | DMA_CCR_PL_0 | DMA_CCR_TCIE; // DMA1_Channel3->CCR = DMA_CCR_PINC | DMA_CCR_PL_1 | DMA_CCR_PL_0 | DMA_CCR_TCIE | DMA_CCR_MEM2MEM; // bytes to transfer - DMA2_Channel1->CNDTR = HTOTAL*2; + DMA2_Channel1->CNDTR = HTOTAL; // peripheral address DMA2_Channel1->CPAR =(uint32_t) &GPIOD->ODR; // memory address @@ -252,8 +274,11 @@ // and start the DMA to output a single frame buffer line through the GPIO device. //***************************************************************************** //__attribute__((interrupt)) - +/* __attribute__ ((section ("ccmram"))) void TIM1_CC_IRQHandler(void) { + //GPIOD->MODER=0x5555; + GPIOD->MODER = (GPIOD->MODER&0xffff0000) | 0x5555; // output mode for PD0-7 + if (vflag) { DMA2_Channel1->CCR = DMA_CCR_DIR | DMA_CCR_MINC | DMA_CCR_PL_1 | DMA_CCR_PL_0 | DMA_CCR_TCIE | DMA_CCR_EN;// 0x3093; // TIM8->CNT=0;//TIM8->ARR; @@ -262,7 +287,10 @@ //TIM8->CNT=7;//4-(TIM1->CNT&7); } TIM1->SR = 0xFFFB; //~TIM_IT_CC2; + + TIM1->SR = 0xFFFB; } +*/ //***************************************************************************** // This irq is generated at the end of the vertical back porch. @@ -272,9 +300,17 @@ __attribute__ ((section ("ccmram"))) void TIM2_IRQHandler(void) { vflag = 1; TIM2->SR = 0xFFF7; //~TIM_IT_CC3; - DMA2_Channel1->CCR = DMA_CCR_DIR | DMA_CCR_MINC | DMA_CCR_PL_1 | DMA_CCR_PL_0 | DMA_CCR_TCIE | DMA_CCR_EN;;// 0x3093; - // TIM8->CNT=0; - // TIM8->CR1 |= TIM_CR1_CEN; + TIM8->CR1 &= ~TIM_CR1_CEN; + //DMA2_Channel1->CCR = DMA_CCR_DIR | DMA_CCR_MINC | DMA_CCR_PL_1 | DMA_CCR_PL_0 | DMA_CCR_TCIE ; + //DMA2_Channel1->CNDTR = HTOTAL; + DMA2_Channel1->CCR = DMA_CCR_DIR | DMA_CCR_MINC | DMA_CCR_PL_1 | DMA_CCR_PL_0 | DMA_CCR_TCIE | DMA_CCR_EN;// 0x3093; + //GPIOD->MODER=0; + //GPIOD->MODER = (GPIOD->MODER&0xffff0000); // input mode for PD0-7 +// GPIOD->ODR=0x00; + //GPIOD->MODER=0xaaaa; + TIM8->CNT=0; + GPIOD->ODR=0x00; + } @@ -288,12 +324,13 @@ DMA2->IFCR = DMA_ISR_TCIF1; TIM8->CR1 &= ~TIM_CR1_CEN; TIM8->CNT=0; + //while(DMA2_Channel1->CNDTR); DMA2_Channel1->CCR = DMA_CCR_DIR | DMA_CCR_MINC | DMA_CCR_PL_1 | DMA_CCR_PL_0 | DMA_CCR_TCIE;// | DMA_CCR_EN;// 0x3093; 0x92;// | (1<<10) | (1<<8); DMA2_Channel1->CNDTR = HTOTAL; vdraw++; - if (vdraw == 3) { + if (vdraw == 2) { vdraw = 0; vline++; if (vline == VID_VSIZE) { @@ -303,16 +340,24 @@ DMA2_Channel1->CMAR += HTOTAL; } } -// if(vflag) -// DMA2_Channel1->CCR = DMA_CCR_DIR | DMA_CCR_MINC | DMA_CCR_PL_1 | DMA_CCR_PL_0 | DMA_CCR_TCIE | DMA_CCR_EN; + //GPIOD->ODR=0x00; + if(vflag) + DMA2_Channel1->CCR = DMA_CCR_DIR | DMA_CCR_MINC | DMA_CCR_PL_1 | DMA_CCR_PL_0 | DMA_CCR_TCIE | DMA_CCR_EN; + } -__attribute__ ((section ("ccmram"))) void vidNextBuffer(void) { +__attribute__ ((section ("ccmram"))) void vidNextBuffer1(void) { char *fp=(unsigned *)fb[0]; for(int i=0;i<VID_VSIZE*HTOTAL;i++) *fp++=(*fp>>4);//&0xf0f0f0f; } +__attribute__ ((section ("ccmram"))) void vidNextBuffer(void) { + unsigned *fp=(unsigned *)fb[0]; + for(int i=0;i<VID_VSIZE*HTOTAL/4;i++) + *fp++=(*fp>>4)&0xf0f0f0f; +} + __attribute__ ((section ("ccmram"))) void waitForRefresh(void) { while(vflag) __wfi(); }