如何做一部基于STM32F4的手持式游戏机

这是在hackster.io上发布的一个项目,基于stm32f4 discovery板制作的游戏机。采用编写游戏的方式来学习嵌入式系统是比较好的方式,寓教于乐,培养成就感,并不需要学习完模电、数电就可以编程。
下面是这个项目的硬件部分,主要的器件:
一个stm32f4 discovery板
一个3.2寸、320*240分辨率、带触摸的tft lcd显示屏(ili9341为控制器)
一个2轴游戏手柄
单通道2.5w d类音频放大器
一只4ohm,3w的喇叭
两个按键
其它电阻、二极管若干
原理图:
关于游戏手柄及按键的功能定义参见原文 - 点击左下角的“阅读原文”即可到达,在这里不再赘述。
下面是板子的正面和背面器件布局示意图:
下图为软件模块的构成及调用关系
下图为数据流:
游戏手柄在两个方向的变化通过其内部两个独立的可变电阻来实现,电阻的改变以变化的电压送到控制器的12位精度的adc,变换后的数据以40hz的频度被控制器的游戏引擎读取。
下面是游戏的流程图:
isr的程序:
void tim6_dac_irqhandler (void){ tim_intrpt_handler(tim6); frameupdate = set;}
前景:
int main (void){ rte_init(); rte_display_start_screen(); while(shoot_button_read); while(1){ rte_display_black_background(); rte_create_player_spaceship(&playerspaceship); rte_draw_player_spaceship(&playerspaceship); rte_create_asteroid(&asteroidvect,asteroid,numofasteroidinwave[currentwa ve],&playerspaceship); rte_draw_asteroid(&asteroidvect); rng_deinit(); rte_start_update_frame(); while(1){ if(frameupdate == set){ rte_display_score(); rte_update_player_spaceship(&playerspaceship); rte_draw_player_spaceship(&playerspaceship); rte_create_rocket(&rocketvect,rocket,&playerspaceship); rte_update_rocket(&rocketvect,&asteroidvect); rte_draw_rocket(&rocketvect); rte_update_asteroid(&asteroidvect,&playerspaceship); rte_draw_asteroid(&asteroidvect); if(playerspaceship.object_property.aliveflag == rte_alive_false){ protoboard_green_led_on; rte_display_game_over_screen(); while(shoot_button_read); rte_reset_game(); protoboard_green_led_off; break; } if(asteroidvect.total == 0){ tim_ctr(tim6,stop); currentwave++; rng_init(); rte_create_asteroid(&asteroidvect,asteroid,numofasteroidinwave[currentwave],&playerspaceship); tim_ctr(tim6,start); } frameupdate = clear; } } }}
第二个周期性的中断产生dac需要的数据,以产生相应的音频效果:
#ifdef speaker_use_timer7 void tim7_irqhandler (void){ tim_intrpt_handler(tim7); dac_write(&dacxhandle,*(soundptrglobal++)); if(soundptrglobal == soundend){ speaker_stop_sound(); } }#endif
创建特殊的空间维度:
/***********************************************************************private function: wrap coordinate***********************************************************************/void rte_wrap_cordinate (int16_t *xptr, int16_t *yptr){ if (*xptr = ili9341_config.width){ *xptr -= ili9341_config.width; } if (*yptr = ili9341_config.height){ *yptr -= ili9341_config.height; }}
下面的示意 - 右边慢慢消失,出现在左侧
下面的代码就是在左侧重画出图像中右侧消失掉的部分:
/***********************************************************************external function: overwrite draw pixel function in ili9341 driver library (in order to draw pixels going off screen)***********************************************************************/void ili9341_draw_pixel (int16_t x, int16_t y, uint16_t color){ rte_wrap_cordinate(&x,&y); ili9341_set_active_area(x,x,y,y); ili9341_send_command(ili9341_mem_write); ili9341_send_parameter_16_bits(color);}
碰撞检测:
/***********************************************************************private function: detect collision between 2 object using aabb algorithm***********************************************************************/uint8_t rte_collision_detect (space_object_t *object1ptr, space_object_t *object2ptr){ int16_t obj1bottomright_x = object1ptr->object_property.x + object1ptr->object_image.imagewidth; int16_t obj1bottomright_y = object1ptr->object_property.y + object1ptr->object_image.imageheight; int16_t obj2bottomright_x = object2ptr->object_property.x + object2ptr->obje ct_image.imagewidth; int16_t obj2bottomright_y = object2ptr->object_property.y + object2ptr->object_image.imageheight; if (object1ptr->object_property.x object_property.x object_property.y object_property.y < obj1bottomright_y){ return rte_collision_true; } return rte_collision_false;}

原文标题:基于stm32f4的手持式游戏机如何实现?
文章出处:【微信公众号:fpga入门到精通】欢迎添加关注!文章转载请注明出处。

OPPO Find X3和华为mate40哪一款更适合自己
Credo于TSMC 2018南京OIP研讨会首次公开展示7纳米工艺结点112G SerDes
兆易创新:独特的存储产业布局 获得了业界的肯定
诺基亚Nokia6正式发布,Nokia手机重回中国市场!
复合机器人走进防疫酒店,助力实现无接触配餐
如何做一部基于STM32F4的手持式游戏机
快讯:汉诺威工业展起跑,聚焦人工智能与5G
华人卫视携手玉银能公司打造区块链+艺术品资产化交易服务平台
CEE国际消费电子展多管齐下打造行业发展年度盛典
OPPO开发者大会2021 colorOS的AON全天候视觉感知服务
强制“接通”!充电桩必须包含特斯拉接口
医疗辅助机器人的设计特点是什么
医用微波消融针刚性韧性刺穿力连接牢固度测试
怎样制作带有显示屏的超声波测量工具
【回顾往年CES】360携千元新旗舰360手机N4参展,获消费者一致好评
小米mix2什么时候上市 小米mix2价格是多少?
如何用常用的耐压绝缘测试测量AC/DC转换器隔离电压
中国互联网行业错失一个超级大BOSS平台,该高兴还是该懊悔呢?
微软推出一系列MagSafe游戏配件
基于单/双核Zynq的GigaExpress SBC PCIe卡