Nwatch在stm32上的移植

目录

  • Nwatch在stm32上的移植
    • 前言
    • 实验目的
    • 移植
    • game1_task任务相关代码片段
    • 结果
    • 本文中使用的工程

Nwatch在stm32上的移植

本文目标:Nwatch在stm32上的移植

按照本文的描述,应该可以跑通实验并举一反三。

先决条件:装有编译和集成的开发环境,比如:Keil uVision5、STM32CubeMX

使用外设:USART、IIC

前言

NWatch是一个很漂亮的、基于STM32的开源手表项目,我这次学习是为了配合使用FreeRTOS而进行学习的。

官方链接为:

  • GITHUB:https://github.com/ZakKemble/NWatch

  • 作者博客:https://blog.zakkemble.net/diy-digital-wristwatch/

    实验目的

在stm32的平台上移植NWatch的代码,出于学习目的,移植一个游戏进行学习,方便后期继续进行学习FreeRTOS的相关知识点。

移植

在这里插入图片描述

移植这3个文件可以在我自己的硬件平台上进行实战,移植的难点就是关于lcd的显示,显示的驱动写得好,移植就顺畅,写得不好移植费劲。

工程中的相关驱动:

在这里插入图片描述

开一任务,进行游戏,运行如下的代码:

game1_task任务相关代码片段

void game1_task(void *params)
{		
	
	uint8_t dev, data, last_data;
	
	g_framebuffer = LCD_GetFrameBuffer(&g_xres, &g_yres, &g_bpp);
	draw_init();
    
	uptMove = UPT_MOVE_NONE;

	ball.x = g_xres / 2;
	ball.y = g_yres - 10;
	ball.velX = -0.5;
	ball.velY = -0.6;
//	ball.velX = -1;
//	ball.velY = -1.1;

	blocks = pvPortMalloc(BLOCK_COUNT);
   memset(blocks, 0, BLOCK_COUNT);
	
	lives = 3;
	score = 0;
	platformX = (g_xres / 2) - (PLATFORM_WIDTH / 2);

	while (1)
	{
		
		/* 读取红外遥控器 */
		if (0 == IRReceiver_Read(&dev, &data))
		{
						if (data == 0x00)
						{
								data = last_data;
						}
						
						if (data == 0xe0) /* Left */
						{
								btnLeft();
						}

						if (data == 0x90)  /* Right */
						{
								btnRight();
						}
						last_data = data;
		}
			game1_draw();
			draw_end();
			// vTaskDelay(5);
	}
}
extern void game1_task(void *params);
xTaskCreate(game1_task, "GameTask", 128, NULL, osPriorityNormal, NULL);

结果

在这里插入图片描述

这里的核心就是要绘制那些点,哪些地方显示,哪些地方隐藏,球碰到了砖块会怎么样,碰到墙会怎么样,都是在处理这些逻辑。可以看到我这里按下我手里的遥控器,按下向左键时,挡球板向左移动,按下右键时,挡球板向右移动,当然我这里都是学习了前人的经验进行的实战,此次工程为我后面学习更多的freertos知识点提供一些思路,后续会继续学习。

本文中使用的工程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/445870.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

不允许你不知道Python作用域

在Python中,变量的作用域限制非常重要。根据作用域分类,有局部、全局、函数和内建作用域。无作用域限制的变量可以在分支语句和循环中定义,并在外部直接访问。不同的作用域决定了变量的可访问范围,访问权限取决于变量的位置。 1.…

力扣中档题:旋转链表

思路:将链表数据放到数组中,将数组旋转,然后再赋值给链表 struct ListNode* rotateRight(struct ListNode* head, int k) {if(headNULL){return NULL;}int count0;struct ListNode*goodhead;while(good){count;goodgood->next;}int round…

解锁网络数据:入门级IP代理使用教程

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

10 vector的使用

文档介绍 文档介绍 1.vector是表示可变大小数组的容器 2.就像数组一样,vecotr也采用的连续存储空间来存储元素,也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,大小是可以动态改变的&#xff…

【Web】浅聊Java反序列化之C3P0——URLClassLoader利用

目录 前言 C3P0介绍 回归本源——序列化的条件 利用链 利用链分析 入口——PoolBackedDataSourceBase#readObject 拨云见日——PoolBackedDataSourceBase#writeObject 综合分析 EXP 前言 这条链最让我眼前一亮的就是对Serializable接口的有无进行了一个玩&#xff0c…

权限管理系统-0.2.0

三、菜单管理接口 3.1 创建SysMenu类及相关类 首先创建sys_menu表: CREATE TABLE sys_menu (id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 编号,parent_id bigint(20) NOT NULL DEFAULT 0 COMMENT 所属上级,name varchar(20) NOT NULL DEFAULT COMMENT 名称,…

【脚本玩漆黑的魅影】寂雨镇全自动练级

文章目录 原理全部代码 原理 老样子。 治疗路径,练级路径。 def zhi_liao(): # 去治疗walk(RIGHT)walk(RIGHT)press(UP, 0.4)for i in [1, 2, 3, 4]:press(A)for i in [1, 2, 3, 4]:press(B)press(DOWN, 0.4)press(LEFT) def chu_qu(): # 右逛c.press(B)press(…

力扣同类题:重排链表

很明显做过一次 class Solution { public:void reorderList(ListNode* head) {if(!head||!head->next)return;ListNode *fasthead,*lowhead;ListNode *prenullptr,*curnullptr,*nextnullptr;while(fast->next!nullptr){fastfast->next;if(fast->next)fastfast->…

风控规则决策树可视化(升级版)

上一篇我们介绍了如何通过交叉表来生成规则,本篇我们来介绍一种可以生成多规则的方法,决策树。除了做模型以外,也可以用来挖掘规则,原理是一样的。 下面通过sklearn的决策树方法来实现风控规则的发现,同时分享一种可以…

【联邦学习综述:概念、技术】

出自——联邦学习综述:概念、技术、应用与挑战。梁天恺 1*,曾 碧 2,陈 光 1 从两个方面保护隐私数据 硬件层面 可 信 执 行 环 境 (Trusted Execution Environment,TEE)边 缘 计 算(Edge Com…

电动车窗开关中MOS管的应用解析

随着科技的不断发展,电动车窗系统已经成为现代汽车中不可或缺的一部分。而MOS(金属氧化物半导体)管的应用,为电动车窗开关注入了新的活力,极大地提高了其使用寿命和安全性。 一、MOS的优越性能 MOS管以其卓越的开关…

磁盘无法访问?别慌,这里有解决之道!

电脑中,那块储存着重要文件与数据的磁盘,突然之间无法访问,是不是让你感到惊慌失措?面对这样的突发状况,很多人可能会感到手足无措。但别担心,本文将为你解析磁盘无法访问的原因,并提供实用的数…

小文件问题及GlusterFS的瓶颈

01海量小文件存储的挑战 为了解决海量小文件的存储问题,必须采用分布式存储,目前分布式存储主要采用两种架构:集中式元数据管理架构和去中心化架构。 (1)集中式元数据架构: 典型的集中式元数据架构的分布式存储有GFS&#xff0…

代码讲解:如何把3D数据转换成旋转的视频?

目录 3D数据集下载 读取binvox文件 使用matplotlib创建图 动画效果 完整代码 3D数据集下载 这里以shapenet数据集为例,可以访问外网的可以去直接申请下载;我也准备了一个备份在百度网盘的数据集,可以参考: ShapeNet简介和下…

Leetcode 54. 螺旋矩阵

题目描述: 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5] 示例 2: 输入&a…

Linux文件系列: 深入理解缓冲区和C标准库的简单模拟实现

Linux文件系列: 深入理解缓冲区和C标准库的简易模拟实现 一.缓冲区的概念和作用二.一个样例三.理解样例1.样例解释2.什么是刷新? 四.简易模拟实现C标准库1.我们要实现的大致框架2.mylib.h的实现1.文件结构体的定义2.myfopen等等函数的声明3.完整mylib.h代码 3.myfopen函数的实…

备战蓝桥杯Day25 - 二叉搜索树

一、基本概念 二叉搜索树(Binary Search Tree),又称为二叉查找树或二叉排序树,是一种具有特定性质的二叉树。 定义:二叉搜索树可以是一棵空树,也可以是具有以下特性的非空二叉树: 若其左子树不…

MAC OS 14.2.1 ASP.NET Core 调试遇到的端口占用的问题

一、问题描述 在调试 ASP.NET Core 项目时,遇到一个很奇怪的问题,不管项目是否已经运行,使用 Postman 测试接口时,都返回 403 Forbidden。重启电脑,刚开始还好好的,过一会儿就返回 403 Forbidden。 二、问…

AOP切面编程,以及自定义注解实现切面

AOP切面编程 通知类型表达式重用表达式切面优先级使用注解开发,加上注解实现某些功能 简介 动态代理分为JDK动态代理和cglib动态代理当目标类有接口的情况使用JDK动态代理和cglib动态代理,没有接口时只能使用cglib动态代理JDK动态代理动态生成的代理类…

2024蓝桥杯每日一题(双指针)

一、第一题:牛的学术圈 解题思路:双指针贪心 仔细思考可以知道,写一篇综述最多在原来的H指数的基础上1,所以基本方法可以是先求出原始的H指数,然后分类讨论怎么样提升H指数。 【Python程序代码】 n,l map(int,…