STM32自制GUI小游戏--Apple的学习笔记

发布者:快乐的成长最新更新时间:2025-01-22 来源: jianshu关键字:STM32  学习笔记 手机看文章 扫描二维码
随时随地手机看文章

一,前言

要过年了,我就玩会吧~GUI之前学习过了guilite源码,那么我就调用它的API自己做个小游戏玩玩。步骤是先在vs上完成调试,然后移植到stm32F4开发板上。主要也想多用用新买的并口LCD屏,因为之前的ili9325并口8bit连camera不能用DMA,我又买了个ili9431并口16bit屏幕(连接camera方便DMA直接采集赋值),因为8bit的话,16bit需要先传高bit再传低bit给LCD。而camera DMA是4个字节按低地址到高地址写到LCD,这样就导致8bit LCD无法通过DMA连接camera了。跑题了,我顺便述说我的新屏幕,哈哈~先看下游戏效果图吧!其实可以理解为一个超级玛丽小游戏。


image.png?imageView2/2/w/1000

二,vs调试遇到的问题

我是官网的example基础上,借用它图及走路,跳跃的逻辑代码,然后改成了按键可以触发的小游戏。想想容易,结果过程中也遇到了些坎坷。
1. 文字更新,无法消去之前的。--已解决
rect在surface创建的时候范围需要填写正确。然后通过调用s_surface->show_layer来显示level0层的内容,进行恢复。
2. 如何设计重玩。--已解决
做了些标志位,然后重玩需要调用reset函数来重置位置。
3. 背景图片移动不知道用哪个API或设计方案。--未解决
现在也没找到解决方法,guilite库好像不支持图片移动的API。它的移动物体要么是重绘,要么就是要预先准备好一张张图片。这个我去之后有机会再看看其它GUI源码是如何做的。否则三维立方体确实是有移动的,但是这个移动只是几条线段的移动。我这个背景图片数组很大,难道也要通过矩阵变换数学公式来实现移动?


三,STM32GUI调试问题

1. cpp函数中按钮按下后的回调函数总是找不到。导致编译不通过。
原因是UIcode.cpp是cpp文件不是c文件,所以c要引用c++的函数需要添加extern c。主要是忘记了它是cpp文件,哈哈~
2. 代码一运行就进入了while循环。
因为有2层,在底层set_surface的时候到calloc出现assert error进入while死循环。查了下我设置了2403202=150K,而STM32F407虽然有192Kram,但是其中64K不是连续的。于是我缩小了尺寸,挑选要更新的界面区域。大概为48K吧,但是依然calloc出错?
于是思考了下calloc申请堆空间出错只有一种原因,就是内存不过,但是现在48K为什么会不够呢!想起来HEAP段的大小可以设置的,估计设置小了,查了map文件果然,HEAP默认只分配了512字节。


    HEAP                                     0x20001b58   Section      512  startup_stm32f40_41xxx.o(HEAP)

    Heap_Mem                                 0x20001b58   Data         512  startup_stm32f40_41xxx.o(HEAP)

    STACK                                    0x20001d58   Section     1024  startup_stm32f40_41xxx.o(STACK)

    Stack_Mem                                0x20001d58   Data        1024  startup_stm32f40_41xxx.o(STACK)



作者:applecai

链接:https://www.jianshu.com/p/15c7d503cda8

来源:简书

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


原因找到了,那么就修改Heap段配置大小,修改startup_stm32f40_41xxx.s
Heap_Size EQU 0x00000200改成Heap_Size EQU 0x00010000

3. object走路速度快。
也就是刷屏变换比vs2017工程中快,所以把delay50变100。这样调试下速度差不多。
4. 跳一下后,key数值每次加2
防抖动从5改成10.估计我一次按下抖动了2次,所以认为按下2次。修改为10后,按一次key,跳一次数值加1。一切如预期。


四,总结

Every thing under control. What a wonderful day!
游戏使用方法

  1. 开机

  2. 按一下key0,游戏开始,主人公出现。

  3. 在游戏过程中按key0,主人公跳起,必要碰到4个障碍物。

  4. 跳过4个障碍物后,显示win结束游戏,按一次key0又可以重来。

  5. 过程中若遇到障碍物,则显示GO。游戏结束,按一次key0又可以重来。

游戏录制效果

2.gif?imageView2/2/w/1000


关键字:STM32  学习笔记 引用地址:STM32自制GUI小游戏--Apple的学习笔记

上一篇:Mac搭建STM32环境(基于M1 PRO)报错问题(No such file or directory))
下一篇:STM32开发环境搭建

推荐阅读最新更新时间:2026-03-22 11:12

STM32大神笔记,超详细单片机学习汇总资料(干货分享)
1、 SYSCLK时钟源有三个来源:HSI RC、HSE OSC、PLL 2、 MCO 可以提供4源不同的时钟同步信号,PA8 3、 GPIO口貌似有两个反向串联的二极管用作钳位二极管。 4、 ICode总线,DCode总线、系统总线、DMA总线、总线矩阵、AHB/APB桥 5、在使用一个外设之前,必须设置寄存器RCC_AHBENR来打开该外设的时钟 6、 STM32复位有三种:系统复位、上电复位、备份区域复位。其中系统复位除了RCC_CSR中的复位标志和BKP中的数值不复位之外,其他的所有寄存器全部复位。 触发方式例如外部复位、看门狗复位、软件复位等;电源复位由于外部电源的上电/掉电复位或者待机模式返回。 复位除了BKP
[单片机]
stm32学习笔记之DMA详细分析
  1、DMA简介   DMA(Direct Memory Access:直接内存存取)是一种可以大大减轻CPU工作量的数据转移方式。   CPU有转移数据、计算、控制程序转移等很多功能,但其实转移数据(尤其是转移大量数据)是可以不需要CPU参与。比如希望外设A的数据拷贝到外设B,只要给两种外设提供一条数据通路,再加上一些控制转移的部件就可以完成数据的拷贝。   DMA就是基于以上设想设计的,它的作用就是解决大量数据转移过度消耗CPU资源的问题。有了DMA使CPU更专注于更加实用的操作--计算、控制等。   2、DMA的工作原理   DMA的作用就是实现数据的直接传输,而去掉了传统数据传输需要CPU寄存器参与的环节,主要涉及四种情
[单片机]
<font color='red'>stm32</font><font color='red'>学习</font><font color='red'>笔记</font>之DMA详细分析
用ozone调试stm32的boot跳APP的问题--Apple的学习笔记
一,前言 过年不能一直玩游戏呢~那么我干什么呢!又开始折腾了,记得之前做过一个boot跳app是正常的,原因是base工程一样,一个做boot,一个做app,但是我app框架换成了用cubemx生成的之后,看上去boot就无法app了。所以我今天就来查下这个问题。 二,调查方法 首先要看是否boot跳入app其实也简单,用一个led灯即可,总的来说我仅修改了app框架代码,怎么就无法跳入app了,所以大体上我觉得是跳入APP的。但是我不想用led或printf来调试,我想用调试器来来说,但是keil没有attach功能,怎么调试呢!我想到了ozone是可以attach的。 三,问题原因 用keil分别下载了boot+app
[单片机]
STM32学习笔记(九)DMA(Direct memory access controller)
直接存储器读取 DMA简介 直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。 DMA框图 由图可见,DMA 一共有 DMA1 和 DMA2 两个控制器。DMA1 有7个通道,DMA2 有5个通道。 在存储器和存储器之间传输数据时,可任选通道进行传输;但在外设和存储器之间传输数据时,需要用到专用的通道。 各个通道的 DMA1 请求 各个通道的 DMA2 请求 DMA寄存器 中断状态寄存器 --- ISR(interrupt status register):存放DMA中断的标志位; 注意:若为D
[单片机]
STM32学习笔记(四)GPIO(General-Purpose I/Os)
输出方式 推挽输出(Push-Pull) 推挽输出电路 若 INT 输入为 0,则 PMOS 截止,NMOS 导通,产生灌电流,输出 OUT 为 0; 若 INT 输入为 1,则 NMOS 导通,PMOS 截止,产生拉电流,输出 OUT 为 1; 推挽输出特点 同时具有高低电压的驱动能力,即高低电平切换所需时间短,反应快; 无法实现线与功能(即禁止输出之间短接); 结型场效应管的特性(G与D、S近乎绝缘)使得电功率极小; 高低电平均由内部 IC 电平决定,通常为一定值; 开漏输出(Open-Drain) 即 漏极(Drain) 一端什么都不接,直接连接 输出端口 开漏输出电路 若 INT 输入为 0,则
[单片机]
STM32学习笔记1.0跑马灯实验遇到的问题
一,看跑马灯例程时,我的例程里的.c文件没有加号,没办法看头文件? 解决办法:一,编译一下,然后随便找一个文件右击,做如下操作! 网图,侵删。 二,直接在.c文件里找到这个头文件,再 或者 二,按照视频建立这两个文件时,加入HAREWARE时警告无法添加? 解决方法:建议不用视频的方法添加,为什么不可以我也不知道,5555555. 我是这样添加的: 三,led.h(8): warning: #1-D: last line of file ends without a newline 这个是由于在main函数的“}”后,没有加回车。只要在main函数的“}”后加回车键,此警告信息即可消除。原因查到是代码风格
[单片机]
lvgl touch在stm32移植及动画应用--Apple的学习笔记
一,前言 最近我突然发现原来我用的是电阻触摸屏,所以是带触摸功能的,当初买回来我主要用LCD显示功能,所以就忘记了它有touch功能,就移植了下驱动,然后lvgl官网的example移植到了sdl2框架中。 二,touch移植 input_dev中移植下,lvgl的porting_template做的还是比较好的。反正lvgl就是周期扫描判断是否有touch,有则则获取x和y坐标。效果就不展示了,源码中获取x和y坐标后,会识别x和y在哪个obj对象,然后调用这个obj对象的callback用户回调函数。主要是了解下它的思路。 三,music界面移植 我到应用就是调用API,暂时我不是很感兴趣去研究API,我主要是学习GUI
[单片机]
STM32学习笔记7.1】定时器基本原理
前言 本系列文章统一围绕STM32F103C8T6最小系统开发板进行记录,如涉及其他开发板将会特别说明。 基本概念 主要功能 嵌入式领域中广泛应用, 主要通过计时、计数的方式,周期性执行某件工作,如检测、响应、控制等。 应用场合:输入捕获、输出波形、计时等。 类型 由硬件资源决定,其精度主要由硬件时钟决定 单个硬件定时器可以扩充出多个软件定时器 硬件定时器 软件定时器:由软件实现 – 循环延时 工作原理:本质上是一个计数器,当计数器计满溢出时,代表着一次事件,即完成一次计时。 STM32F1x定时器 8个Timer定时器+1个系统嘀嗒定时器(SysTick)+2个看门狗定时器 Timer定时器
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved