【项目笔记】STM32 BootLoader(一) 文件系统

首先放上 项目主页

简单的介绍一下这个 BootLoader:利用 STM32 提供的 USB FS 接口,并设置为 大容量存储设备(MSC, Mass Storage device Class),并在内存中虚拟出一个 FAT16 的文件系统,以此达到让烧录和读取 Flash 像用 U 盘拷贝文件一样便捷。

系统结构如下图所示,这篇文章先介绍一下最主要的 文件系统 部分:

image-20210216134129762

TinyUSB 的移植

TinyUSB 是一个开源的的跨平台 USB 主机/设备协议栈,用于嵌入式系统,它是内存安全的,没有动态内存分配,同时也是线程安全的,所有的中断事件都会被推迟,然后在非中断服务函数中处理。目前已经支持许多主流嵌入式平台。

这篇文章就介绍一下如何将 TinyUSB 添加至项目中,这里以 STM32 平台为例。

image-20210207132819334

在Linux中控制GPIO

在 MCU 中,最基本的功能莫过于对 GPIO 的控制,但是在 Linux 中,我们要怎样才能通过代码实现对芯片的控制呢?经过了一天的折腾,我终于找到了使用 C 语言的正确打开方式。

image-20210125210553261

STM32 CMake 模板

一篇久违的文章。

上个学期因为各种 B 事太多了,一直抽不出时间来更新博客。

相比起 MakefileCMake 就要简洁许多,这就分享一个 STM32 的 CMakeLists 模板:

LVGL 的移植

最近了解了一下开源图形库 LVGL,现在记录一下移植的过程。其实 LVGL 移植挺方便的,仅需实现两个函数。

将 LVGL 添加至项目

首先,在 GitHub Release 中下载最新版本的源代码。下载完成后,将解压出的文件夹复制到工程目录的一个文件夹中(这里以Middlewares/lvgl/为例)。

配置ESP32开发环境

常规方法

获取ESP-IDF

此处操作系统为Manjaro 20.0.3 Lysia

打开 ESP-IDF 的 GitHub 项目主页,进入 release ,这里我选择的是4.0.1版本。下载时速度较慢,可使一些方法加速下载,如 Cloudflare Worker 。下载后解压至~/路径下,随后进入目录。

RT-Thread线程管理

RT-Thread的线程调度为优先级抢占式调度。当调度器进行线程切换时,会切换至就绪任务中优先级最高的那个任务,如果中断服务函数(ISR)让一个更高优先级的任务满足运行条件,中断完成时,被中断的线程挂起,优先级高的线程开始运行。对于同优先级的任务,RT-Thread采用时间片轮转调度。

STM32中Flash的读写(HAL库)

在以前的电路中,常常会用到EEPROM (Electrically Erasable Programmable read only memory, 带电可擦可编程只读存储器),EEPROM在掉电后储存的信息不会丢失,一般用于存储设备的设置。

但现在更常用的是Flash(闪存),Flash的特点是结构简单,同样工艺和同样晶元面积下可以得到更高容量且大数据量下的操作速度更快,但Flash每次擦除只能以扇区(Page)为单位操作,而EEPROM可以以字节(Byte)为单位操作。相比EEPROM,FLASH操作过程麻烦,特别是在小数据量反复重写时,所以在MCU中Flash结构适于不需频繁改写的程序存储器