每当提到 3D 第一人称射击游戏,大家很自然就会联想到高性能独显,以及几个G甚至几十G的硬盘存储空间,那么有没有可能在 STM32F103RC 这样一块只有 256KB Flash 的小板子上保存一个大型第一人称射击游戏呢? 当我们用 USB 线把这块开发板连接到电脑上,就可以看到出现了一个只有100多KB的U盘,这就是 STM32 的片上 Flash 了。 如果我们双击它就启动了一个 STM32 上的第一人称射击游戏。 3 Z; _ {6 e" L% e) h9 v这是完整的演示视频:如果你也有兴趣把这个游戏保存在 STM32 上,可以跟着后面的教程,或者也可以在这个项目里直接找到编译好的固件、游戏和项目源码。 链接地址:http://github.com/wuhanstudio/stm32-ufun-3d-game " `/ R" M5 r% c3 z5 Y1. 运行 RT-ThreadRT-Thread 在 Github 上是开源的,源码可以在这里(链接:http://github.com/rt-Thread/rt-thread/)找到,官网文档也很丰富这里就不重复了,总结一下需要的工具:
如果觉得从 github 上面下载 RT-Thread 源码比较慢,可以先从 gitee 上面下载,然后修改项目地址。 1git clone https://gitee.com/rtthread/rt-thread2cd rt-thread 3git remote rm origin) l6 K+ S7 q/ H, ] 4git remote add origin https://github.com/RT-Thread/rt-thread 5git pull origin master * z; V% [ `$ ^ [6 U. B 2. 片上 Flash 文件系统准备好第一步里面的工具后,首先我们需要把 STM32 的片上 flash 挂载为文件系统,首先需要在 CubeMX 里使能 USB。 打开 USB 后在时钟配置里确认外部晶振和板子上的晶振是一致的,并且 USB 的时钟是 48MHz,就可以点击生成代码了。由于我们修改了时钟,需要把 board/CubeMX_Config/Src/main.c 里面的 void SystemClock_Config(void) 函数复制到 board/board.c 里面替换。 接下来修改 bsp 下 board 目录里的 Kconfig 文件。1config BSP_USING_ON_CHIP_FLASH7 [7 v" S3 w; D4 P3 J. {8 r2 bool "Enable on-chip FLASH" 3 default n 4 5config BSP_USING_USBD_FS 6 bool "Enable USBD as USB device"3 s" a) c) [; {: g9 [( I( ]9 o 7 select RT_USING_USB_DEVICE+ m& m/ ~/ ?5 x! I 8 default n 这样再在 bsp 目录下右键 ConEmu Here 就可以看到配置界面 (Env 教程:http://www.rt-thread.org/document/site/tutorial/env-video/),依次选中下面几个选项:
保存配置退出,在 env 里面输入命令就可以自动生成 Keil 项目了: ) U3 {& ]6 o" D# G6 c/ {& c8 \1pkgs --update 2scons --target=mdk5 -s7 S0 t4 z. C3 {* s 2 3#define FAL_FLASH_DEV_TABLE \; w; x* L/ q6 z! y9 H 4{ \ 5 &stm32_onchip_flash, \ 6}: [/ A5 [: x3 q5 K. B$ K% F h 7 8#define FAL_PART_TABLE \ 9{ \ 10 {FAL_PART_MAGIC_WROD, "app", "onchip_flash", 0, 128*1024, 0}, \ 11 {FAL_PART_MAGIC_WROD, "flash0", "onchip_flash", 128*1024, 128*1024, 0}, \ 12} 再修改 main.c 挂载文件系统: 1#include <rtthread.h>2#include <rtdevice.h> 3#include <board.h>5 Z: o; c+ V. m5 q% m' _0 U 4#include <fal.h> 5#include <dfs_posix.h> 6 7/* defined the LED0 pin: PC13 */ 8#define LED0_PIN GET_PIN(C, 13) 9% h6 r z% f7 [0 `$ Q 10#define FS_PARTITION_NAME "flash0"$ S+ P$ \2 [3 n* U3 H3 i 11 12int main(void)9 x; n c' @$ n: e6 O! O+ j 13{& P/ B1 \7 {( ~ 14 int count = 1;$ |& p9 s% v0 J# T 15 /* set LED0 pin mode to output */- V6 l K J. o& c2 Z 16 rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT); 17 18 fal_init();8 Y: A B5 H+ @6 |% V( b 19 20#ifdef RT_USB_DEVICE_MSTORAGE 21 struct rt_device *flash_dev = fal_blk_device_create(FS_PARTITION_NAME);' z, K9 W- j5 U 22#else 23 struct rt_device *flash_dev = fal_mtd_nor_device_create(FS_PARTITION_NAME);) s& ]: @# L2 S) M 24#endif+ i: Y3 G. d8 l% @; _/ H. F 25 26 if (flash_dev == NULL)$ H) L- ]" r% J; ?- ~) J0 a' Y 27 {9 x4 R$ m0 f. d9 ~( K2 @) l) A 28 rt_kprintf("Can't create a block device on '%s' partition.\n", FS_PARTITION_NAME);8 y2 M8 k- ^& d% I# Z5 }0 ^8 h( Y( A 29 }# _) C% W+ J D9 ^! D5 q4 N5 j- G 30 else 31 {- D( @$ M9 B8 U% [+ w+ V 32 rt_kprintf("Create a block device on the %s partition of flash successful.\n", FS_PARTITION_NAME); 33 } 34 35 while (count++)6 m" _+ }9 J) T 36 { 37#ifndef RT_USB_DEVICE_MSTORAGE 38 if(rt_device_find(FS_PARTITION_NAME) != RT_NULL)7 k" K" E) O) ~! {+ e 39 {9 ?- w* e6 Q3 h) P0 Q# K 40 dfs_mkfs("lfs", FS_PARTITION_NAME); 41, Q$ a9 ~* i- ?' }1 q 42 if (dfs_mount(FS_PARTITION_NAME, "/", "lfs", 0, 0) == RT_EOK)3 s4 j; r4 s( U. I( q 43 {4 @# `5 d. c V 44 rt_kprintf("sd card mount to '/'\n"); 45 break;' R0 t* [ K; r4 A, P! x# v 46 }) c! f4 d9 y" G0 d6 W: a5 `: k. | 47 else n! g1 n$ a( A6 C 48 { 49 rt_kprintf("sd card mount to '/' failed!\n");9 j, r+ W4 N e) _* X0 ?" N3 q 50 }/ h1 W3 S, a9 K" y1 e- ]0 K 51 }4 t: E7 S* Z% T0 h$ E4 S+ g 52#endif 53 rt_pin_write(LED0_PIN, PIN_HIGH); 54 rt_thread_mdelay(500); 55 rt_pin_write(LED0_PIN, PIN_LOW); 56 rt_thread_mdelay(500); 57 }+ _4 I' _# C$ |! }) H) ]# | 58* C/ c8 z. j& X/ V9 ] 59 return RT_EOK;& E6 V) y D8 Y% W1 J. k- A; J 60} # G. K. A Q% a, k 项目编译下载到板子上,串口连接上去在 msh 里输入 fal probe 应当就可以看到分区表了: Linux 下常用的命令 ls ,cat,mkdir,cd 也都是支持的,这样我们就把 stm32 的片上 flash 挂载为文件系统了, 下一步就是让它识别为 U盘。 3. 挂载片上 Flash 为 U盘同样的,我们在 env 的配置目录里面依次选中:
这样保存配置,在 env 下生成项目文件: 1scons --target=mdk5 -s! e+ j6 d- |& O5 w* p' u编译上传到板子上,接上 USB 到电脑,例如 STM32F103 的 USB 引脚是 PA11 和 PA12,就可以看到电脑识别到一个新的 U盘了,第一次使用可能需要先格式化。 |
这不就是做了个U盘,跟游戏有毛线关系 |
我还以为能运行呢 |
小马哥STM32F103开源小四轴RoboFly全部资料大放送
STM32固件库分享,超全系列整理
【MCU实战经验】+STM32F107的USB使用
基于STM32F103两轮平衡小车设计(开源)
STM32F107VCT6官方原理图和PCB
【福利】用STM32库的朋友有福了:STM32F10x_StdPeriph_Lib_V3.5.0chm...
基于STM32F10xx存储器和系统架构经验分享
基于STM32F1的CAN通信之BH1750
基于STM32F1的CAN通信之OLED
基于STM32F1的CAN通信之之串口IAP