[活动专区] 【AT-START-F407测评】+移植俄罗斯方块

[复制链接]
 楼主| chongdongchen 发表于 2021-2-25 13:57 | 显示全部楼层 |阅读模式
这次活动遇上春节放假,时间上太仓促了。一上班就开始玩板子了,在评测报告征集截止日期(明天)之前还是赶上了,哈哈。之前在另一款单片机上实现了VGA显示器上玩俄罗斯方块:https://bbs.21ic.com/icview-3050778-1-1.html
那就移植到AT-START-F407开发板上试试:
1600960373ab1aa901.png
4465860373ade02c46.png
3687360373b0852ec7.png
1d9acba640516d1f858329ef58cd9d4920212251353401.gif

评论

[url=home.php?mod=space&uid=1198114]@zhengfish[/url] :循环播放的,其实是重头又开始了。  发表于 2021-3-1 17:02
newB,为啥最后一块砖头还能上升?  发表于 2021-3-1 16:40
很给力  发表于 2021-2-26 10:53
 楼主| chongdongchen 发表于 2021-2-25 14:02 | 显示全部楼层
关键代码:
定时器配置:
  1. void TIM3_Configuration(void)
  2. {
  3. //    TMR3 Channel1 = PA6
  4. //    TMR3 Channel2 = PA7
  5. //    TMR3 Channel3 = PB0
  6. //    TMR3 Channel4 = PB1
  7.    
  8.     TMR_TimerBaseInitType  TMR_TMReBaseStructure;
  9.     TMR_OCInitType  TMR_OCInitStructure;
  10.    
  11.   /* Compute the prescaler value */
  12.   /* TMRe base configuration */
  13.   
  14.   TMR_TimeBaseStructInit(&TMR_TMReBaseStructure);
  15.   TMR_TMReBaseStructure.TMR_Period = 1056 - 1;  //1056 / 40 = 26.4us  //800*600@60Hz, 26.4us
  16.   TMR_TMReBaseStructure.TMR_DIV = (uint16_t) (SystemCoreClock / 40000000) - 1;
  17.   TMR_TMReBaseStructure.TMR_ClockDivision = 0;
  18.   TMR_TMReBaseStructure.TMR_CounterMode = TMR_CounterDIR_Up;

  19.   TMR_TimeBaseInit(TMR3, &TMR_TMReBaseStructure);

  20.   /* PWM1 Mode configuration: Channel1 */
  21.   TMR_OCStructInit(&TMR_OCInitStructure);
  22.   TMR_OCInitStructure.TMR_OCMode = TMR_OCMode_PWM1;
  23.   TMR_OCInitStructure.TMR_OutputState = TMR_OutputState_Enable;
  24.   TMR_OCInitStructure.TMR_Pulse = 128 - 1;
  25.   TMR_OCInitStructure.TMR_OCPolarity = TMR_OCPolarity_Low;
  26.   TMR_OC1Init(TMR3, &TMR_OCInitStructure);
  27.   TMR_OC1PreloadConfig(TMR3, TMR_OCPreload_Enable);

  28.   /* PWM1 Mode configuration: Channel2 */
  29.   TMR_OCInitStructure.TMR_OutputState = TMR_OutputState_Enable;
  30.   TMR_OCInitStructure.TMR_Pulse = 128 - 1 + 88 - 12;    //12是修正值
  31.   TMR_OCInitStructure.TMR_OCPolarity = TMR_OCPolarity_High;
  32.   TMR_OC2Init(TMR3, &TMR_OCInitStructure);
  33.   TMR_OC2PreloadConfig(TMR3, TMR_OCPreload_Enable);

  34. //  /* PWM1 Mode configuration: Channel3 */
  35. //  TMR_OCInitStructure.TMR_OutputState = TMR_OutputState_Enable;
  36. //  TMR_OCInitStructure.TMR_Pulse = 128 - 1 + 88 + 800;
  37. //  TMR_OCInitStructure.TMR_OCPolarity = TMR_OCPolarity_High;
  38. //  TMR_OC3Init(TMR3, &TMR_OCInitStructure);
  39. //  TMR_OC3PreloadConfig(TMR3, TMR_OCPreload_Enable);

  40.   TMR_ARPreloadConfig(TMR3, ENABLE);

  41.   //interrupts
  42.   TMR_INTConfig(TMR3, TMR_INT_Overflow, ENABLE);
  43.   TMR_INTConfig(TMR3, TMR_INT_CC2, ENABLE);
  44.   
  45.   /* TMR3 enable counter */
  46.   TMR_Cmd(TMR3, ENABLE);
  47. }
DMA配置:
  1. void DMA_Configuration(void)
  2. {
  3.   DMA_InitType DMA_InitStructure;

  4.   /* DMA1 Channel5 Config */
  5.   DMA_Reset(DMA1_Channel5);
  6.   DMA_DefaultInitParaConfig(&DMA_InitStructure);
  7.   DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)0x4000380C;
  8.   DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)vgaBuf;
  9.   DMA_InitStructure.DMA_Direction = DMA_DIR_PERIPHERALDST;
  10.   DMA_InitStructure.DMA_BufferSize = 50;
  11.   DMA_InitStructure.DMA_PeripheralInc = DMA_PERIPHERALINC_DISABLE;
  12.   DMA_InitStructure.DMA_MemoryInc = DMA_MEMORYINC_ENABLE;
  13.   DMA_InitStructure.DMA_PeripheralDataWidth = DMA_PERIPHERALDATAWIDTH_BYTE;
  14.   DMA_InitStructure.DMA_MemoryDataWidth = DMA_MEMORYDATAWIDTH_BYTE;
  15.   //DMA_InitStructure.DMA_Mode = DMA_MODE_CIRCULAR;
  16.   DMA_InitStructure.DMA_Mode = DMA_MODE_NORMAL;
  17.   DMA_InitStructure.DMA_Priority = DMA_PRIORITY_VERYHIGH;
  18.   DMA_InitStructure.DMA_MTOM = DMA_MEMTOMEM_DISABLE;

  19.   DMA_Init(DMA1_Channel5, &DMA_InitStructure);
  20.   
  21.   //interrupts
  22.   DMA_INTConfig(DMA1_Channel5, DMA_INT_TC, ENABLE);

  23.   /* DMA1 Channel5 enable */
  24.   DMA_ChannelEnable(DMA1_Channel5, ENABLE);
  25. }
SPI配置:
  1. void SPI_Configuration(void)
  2. {
  3.   SPI_InitType SPI_InitStructure;

  4.   /* SPI_MASTER configuration ------------------------------------------------*/
  5.   SPI_DefaultInitParaConfig(&SPI_InitStructure);
  6.   SPI_InitStructure.SPI_TransMode = SPI_TRANSMODE_FULLDUPLEX;
  7.   SPI_InitStructure.SPI_Mode = SPI_MODE_MASTER;
  8.   SPI_InitStructure.SPI_FrameSize = SPI_FRAMESIZE_8BIT;
  9.   SPI_InitStructure.SPI_CPOL = SPI_CPOL_LOW;
  10.   SPI_InitStructure.SPI_CPHA = SPI_CPHA_1EDGE;
  11.   SPI_InitStructure.SPI_NSSSEL = SPI_NSSSEL_SOFT;
  12.   SPI_InitStructure.SPI_MCLKP = SPI_MCLKP_8;
  13.   SPI_InitStructure.SPI_FirstBit = SPI_FIRSTBIT_MSB;
  14.   SPI_InitStructure.SPI_CPOLY = 7;
  15.   SPI_Init(SPI2, &SPI_InitStructure);
  16.    
  17.   SPI_I2S_DMAEnable(SPI2, SPI_I2S_DMA_TX, ENABLE);
  18.    
  19.   SPI_Enable(SPI2, ENABLE);
  20. }
中断处理:
  1. void DMA1_Channel5_IRQHandler(void)
  2. {
  3.     //关闭DMA
  4.     //DMA_ChannelEnable(DMA1_Channel5, DISABLE);
  5.     DMA1_Channel5->CHCTRL &= (uint16_t)(~DMA_CHCTRL1_CHEN);

  6.     DMA1->ICLR = DMA1_INT_GL5 | DMA1_INT_TC5 | DMA1_INT_HT5 | DMA1_INT_ERR5;
  7. }

  8. void TMR3_GLOBAL_IRQHandler(void)
  9. {
  10.     static __IO uint32_t vga_hs = 0;
  11.     static __IO uint32_t valid = 0;
  12.     static u8* addr = 0;
  13.    
  14.     if(TMR3->STS & TMR_INT_Overflow)
  15.     {
  16.         vga_hs++;

  17.         if(vga_hs >= 628)       //新的一帧,VSYNC开始
  18.         {
  19.             GPIOB->BRE = GPIO_Pins_1;
  20.             vga_hs = 0;
  21.         }
  22.         else if(vga_hs == 4)    //VSYNC结束
  23.         {
  24.             GPIOB->BSRE = GPIO_Pins_1;
  25.             addr = vgaBuf;
  26.         }
  27.         else if(vga_hs == 627)
  28.         {
  29.             valid = 0;
  30.         }
  31.         else if(vga_hs >= 27)   //有效区
  32.         {
  33.             //重新初始化DMA,准备好下一行数据
  34.             DMA_ChannelEnable(DMA1_Channel5, DISABLE);
  35.             
  36.             DMA1_Channel5->CMBA = (u32)addr;
  37.             DMA1_Channel5->TCNT = (XPix / 8);
  38.             
  39.             if(!(vga_hs & 1))
  40.                 addr += (XPix / 8);
  41.             valid = 1;
  42.         }

  43.         TMR3->STS = (uint16_t)~TMR_INT_Overflow;
  44.     }
  45.     if(TMR3->STS & TMR_INT_CC2)
  46.     {
  47.         //启动DMA
  48.         if(valid)
  49.             DMA1_Channel5->CHCTRL |= DMA_CHCTRL1_CHEN;

  50.         TMR3->STS = (uint16_t)~TMR_INT_CC2;
  51.     }
  52. }


主函数:
  1. int main(void)
  2. {
  3.   RCC_AHBPeriphClockCmd(RCC_AHBPERIPH_DMA1, ENABLE);
  4.   RCC_APB1PeriphClockCmd(RCC_APB1PERIPH_TMR3 | RCC_APB1PERIPH_SPI2, ENABLE);
  5.   RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOA | RCC_APB2PERIPH_GPIOB |
  6.                          RCC_APB2PERIPH_GPIOC | RCC_APB2PERIPH_AFIO, ENABLE);
  7.   GPIO_Configuration();
  8.   DMA_Configuration();
  9.   SPI_Configuration();
  10.   TIM3_Configuration();
  11.   AT32_Board_Init();
  12.   NVIC_Configuration();
  13.   
  14.   tetris_init();
  15.    
  16.   while (1)
  17.   {
  18.     static uint32_t t_10ms = 0;
  19.     static uint16_t led = LED1;

  20.     Delay_ms(10);
  21.     if(++t_10ms >= 10)
  22.     {
  23.       if(++led >= LED_NUM)led = LED2;
  24.       AT32_LEDn_Toggle(led);
  25.       t_10ms = 0;
  26.     }

  27.     sysTime_10ms++;

  28.     JOYPAD_run();
  29.     tetris_key_processing();
  30.     tetris_run();
  31.   }
  32. }


 楼主| chongdongchen 发表于 2021-2-25 14:08 | 显示全部楼层
这对于强大的AT32F407来说,真的很轻松,之前那款显示出来还有些毛刺。现在就没有了。赞一个!!
muyichuan2012 发表于 2021-2-26 09:06 来自手机 | 显示全部楼层
这个也太强了吧  俄罗斯方块也可以移植过来。
wsnsyy 发表于 2021-2-26 10:24 | 显示全部楼层
能分享工程吗
 楼主| chongdongchen 发表于 2021-2-26 14:59 | 显示全部楼层
感谢大家支持!
@wsnsyy 你可以看一下我之前的帖子,已经开源的(https://bbs.21ic.com/icview-3050778-1-1.html)
有何不可0365 发表于 2021-2-28 22:33 | 显示全部楼层

这个也太强了吧
zhengshuai888 发表于 2021-3-1 07:59 来自手机 | 显示全部楼层
哈哈,又来了。
小明的同学 发表于 2021-3-1 19:09 | 显示全部楼层
赞一个。。。
aspoke 发表于 2021-3-7 21:33 | 显示全部楼层
这个高端了。        
232321122 发表于 2021-3-7 21:33 | 显示全部楼层
有完整的代码吗   
ghuca 发表于 2021-3-7 21:34 | 显示全部楼层
VGA是怎么驱动 的呢?   
soodesyt 发表于 2021-3-7 21:34 | 显示全部楼层
AT-START-F407性能怎么样  
mnynt121 发表于 2021-3-7 21:34 | 显示全部楼层
谢谢楼主分享的。         
plsbackup 发表于 2021-3-7 21:34 | 显示全部楼层
VGA显示器这么高端呢
kmzuaz 发表于 2021-3-7 21:34 | 显示全部楼层
硬件电路怎么搭建的   
qiufengsd 发表于 2021-3-7 21:35 | 显示全部楼层
玩板子很高端呢。   
wengh2016 发表于 2021-3-7 21:35 | 显示全部楼层
跑的操作系统吗   
iyoum 发表于 2021-3-7 21:35 | 显示全部楼层
VGA的接口这么容易吗  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

55

主题

1238

帖子

10

粉丝
快速回复 在线客服 返回列表 返回顶部

55

主题

1238

帖子

10

粉丝
快速回复 在线客服 返回列表 返回顶部