0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于具有USB功能的STM32微控制器

电子设计 来源:电路城 作者:电路城 2021-05-19 17:22 次阅读

该设计是一个物理开关,它确定每次打开计算机时要启动的操作系统。它使用STM32微控制器充当USB大容量存储设备,并提供一个动态文件。该文件可以由系统的引导配置加载,以根据物理输入来更改其引导行为:

基于具有USB功能的STM32微控制器

组件:

拨动开关

具有USB功能的STM32微控制器

ST-Link编程

该项目的解决方案是通过代码编写的,因此需要一个拨动开关,一个具有USB功能的STM32微控制器和一个ST-Link编程器。

代码:点击查看

设计过程:

启动Linux,只需按电源按钮;另一方面,要引导到Windows,则需要在GRUB短暂显示自己时进行战术,精确定时的敲击,以更改选择:

基于具有USB功能的STM32微控制器

引导加载程序中的脚本

GNU GRUB是一种流行的Linux启动加载程序-在加载任何操作系统之前运行的程序,它决定启动什么以及如何启动它。通常,将与上图所示的菜单进行交互,但实际上,GRUB是由简化的脚本语言配置的。在它的下面是用C语言编写的模块系统。

GRUB必须在操作系统外部运行,因此必须提供所有自己的工具,因此可用功能相当简单。

在GRUB中可以任意访问USB设备吗?

创建一个具有自定义(“特定于供应商”)接口的USB设备,以读出开关位置,就非USB而言,它就像是裸露的串行连接。可以从操作系统访问,但是不确定GRUB是否可以处理它。

GRUB实现在其原生支持USB ehci、uhci、ohci模块,但有一个问题-加载任何这些禁用用于访问磁盘上的常态机制通过BIOS来避免冲突,让你有无人接盘。有一个nativedisk模块可以独立于BIOS访问磁盘,但是除了速度慢之外,严重地使用该模块意味着GRUB无法链式加载Windows(说明),从而使这种方法成为注销。

伪装成USB大容量存储设备

可以利用BIOS已经为GRUB提供对所有连接的存储设备的访问的事实,而不是创建自定义USB接口。需要做的就是将设备显示为存储设备,其中包含一个文件,其内容指示开关位置。

从概念上讲这很简单,但是有几层:

提供大容量存储类描述符,指示要使用的几种存储协议之一(SCSI,ATA)。

实现所选的存储协议。除了用于读取和写入扇区的标准请求外,这是一组用于询问存储设备的功能,容量,布局和其他元数据的命令。

读取时模拟有效的文件系统,而实际上没有任何存储介质。

使用USB状态指示灯中已有的支持USB的STM32板卡和代码,将供应商类设备更改为大容量存储类设备只需更改现有USB描述符中的几个字节即可。

对于存储协议层,发现它libopencm3具有内置的SCSI大容量存储实现,具有简单read_block(address)和write_block(address)回调功能,隐藏了存储协议的复杂性:

基于具有USB功能的STM32微控制器

由于这个原因,即使在这个阶段它只能读出无尽的0x00字节流,仍然可以使用可识别的存储设备快速启动并运行。

基于具有USB功能的STM32微控制器

熟悉FAT

模拟GRUB可以理解的文件系统。格式化存储设备,选择FAT12,因为它的文档非常齐全,而且布局简单:

引导扇区:描述卷名称和几何形状的固定结构

文件分配表:一个索引,用于说明磁盘的哪些部分被使用以及分配/碎片化了多大的文件

根目录条目:文件元数据。指向实际文件内容所在的位置

[其余磁盘上没有固定的结构]

经过阅读和修改之后,进行了一个设置,可以定义虚拟文件列表,并在毫不怀疑的主机要求下即时生成目录条目和文件内容:

struct VirtualFile {

char* longName;

struct FatDirEntry dir;

void (*read) (uint8_t* output);

};

static void readSwtich(uint8_t* output) { // Output is a zeroed-out 512 byte buffer (one block)

output[0] = gpio_get(GPIOA, GPIO6) ? ‘1’ : ‘0’;

}

static struct VirtualFile _virtualFiles[] = {

{

.longName = “switch_position”,

.dir = { .name = “SWITCH~1”, .ext = “ ”, .size = 1 },

.read = readSwtich

},

// 。..

};

转储块设备看起来像这样:

基于具有USB功能的STM32微控制器

0000h是引导扇区,0200h是FAT的第一个副本,0400h是FAT的第二个副本,0600h是根目录条目。一共有三个32字节的目录条目-两个长文件名条目,然后是在640h该文件的实际目录条目。虚拟文件内容在4800h读出。

在GRUB中读取文件

GRUB没有将文件内容加载到变量中的任何内置支持,也不像典型的Linux shell那样支持命令替换:

# This is BASH and what I wanted to do

# GRUB script unfortunately doesn‘t support this kind of substitution

pos=$(cat /path/to/switch_position)

echo $pos

使用GRUB的“源” 命令从虚拟文件中加载其他配置。这种方法是开箱即用的,并且理论上适用于任何版本的GRUB:

基于具有USB功能的STM32微控制器

根据开关位置启动

使用GRUB外壳中的switch位置了,然后修改系统启动配置,以根据此信息进行启动选择。

在 /etc/grub.d/00_header中, 将此添加到了 生成的输出中(删除了转义符以使其更易于阅读):

# Look for hardware switch device by its hard-coded filesystem ID

search --no-floppy --fs-uuid --set hdswitch 55AA-6922

# If found, read dynamic config file and select appropriate entry for each position

if [ “${hdswitch}” ] ; then

source ($hdswitch)/switch_position_grub.cfg

if [ “${os_hw_switch}” == 0 ] ; then

# Boot Linux

set default=“0”

elif [ “${os_hw_switch}” == 1 ] ; then

# Boot Windows

set default=“2”

else

# Fallback to default

set default=“${GRUB_DEFAULT}”

fi

else

set default=“${GRUB_DEFAULT}”

fi

运行update-grub生成新的启动配置后,

硬件安装

小的铝制扁杆,几个螺丝和一些钻孔。
责任编辑:pj

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 微控制器
    +关注

    关注

    48

    文章

    6808

    浏览量

    147611
  • usb
    usb
    +关注

    关注

    59

    文章

    7422

    浏览量

    258046
  • 编程器
    +关注

    关注

    9

    文章

    386

    浏览量

    41689
收藏 人收藏

    评论

    相关推荐

    STM32F030超值系列微控制器的自我描述

    [size=11.818181991577148px]STM32F0308探索套件是是一个价格亲民而又简单易用的开发工具套件,让设计人员能够快速评估STM32F030超值系列微控制器功能
    发表于 03-31 14:28

    结合AVR微控制器USB的全新产品

    ■记者:胥京宇爱特梅尔公司推出结合了 USB 控制器和高性能模拟功能的全新AVR微控制器产品,型号为 ATmega16UA 和 ATmega32U4。虽然电池供电设备能够通过
    发表于 06-27 07:20

    不同微控制器版的特性

    要开始嵌入式开发,我们需要两个主要的东西,即开发板和IDE(集成开发环境)。微控制器开发板是一种印刷电路板(PCB),其电路和硬件设计用于促进某些微控制器功能的实验。开发板与处理
    发表于 08-07 08:53

    如何应用具有高度集成模拟功能微控制器

    使用微控制器 MSP430FR2355 MCU的功能,在紧凑设计中快速实现模拟信号链
    发表于 01-04 07:31

    STM32系列32位微控制器

    STM32系列32位微控制器基于Arm® Cortex®-M处理,旨在为MCU用户提供新的开发自由度。它包括一系列产品,集高性能、实时功能、数字信号处理、低功耗/低电压操作、连接性等
    发表于 07-16 06:51

    STM32微控制器

    意法半导体(ST)是世界上最大的半导体公司之一,是MCU微控制器的领先者。STM32微控制器是目前的主流产品。如STM32F0 系列产品基于超低功耗的 ARM Cortex-M0 处理
    发表于 07-23 10:11

    STM32:32位微控制器功能

    STM32:32位微控制器功能:1、串口USART:接外设2、内部集成电路I2C:用于与I2C接口设备通信3、串行通讯接口SPI:用于与SPI接口设备通信4、 SDIO( SDIO接口是在SD内存卡
    发表于 08-11 08:02

    STM32G071CBT6微控制器功能特性

    功能特性STM32G071CBT6 微控制器具有2路 type C 接口,内置 USB Power Delivery PHY。LiPow
    发表于 08-11 06:18

    基于内核设计的STM32系列微控制器

    内核是为低功耗和价格敏感的应用而专门设计的,具有突出的能效比和处理速度。通过采用Thumb-2高密度指令集,Cortex-M3内核降低了系统存储要求,同时快速的中断处理能够满足控制领域的高实时性要求,使基于该内核设计的STM32
    发表于 08-18 06:28

    STM32微控制器的相关资料分享

    文章目录一、STM32微控制器概述1、控制器主要参数:2、内部资源情况:3、STM32总线系统4、存储映射5、
    发表于 11-26 07:56

    STM32MP1微控制器之开发环境介绍

    STM32MP157系列教程连载–Cortex-M4开发篇1:STM32MP1微控制器之开发环境STM32CubeIDE是一个高级C / C ++开发平台,
    发表于 01-25 07:01

    使用M032系列微控制器来执行USB磁盘和FatFs功能

    应用:此示例代码使用 M032 系列微控制器(MCU) 来执行 USB 磁盘和 FatFs 功能。 BSP 版本:M031系列BSP CMSIS V3.05.000 硬件
    发表于 08-29 07:45

    AN3156_基于STM32微控制器引导程序的USB_DFU协议应用手册

    AN3156_基于STM32微控制器引导程序的USB_DFU协议应用手册
    发表于 11-21 17:07 2次下载
    AN3156_基于<b class='flag-5'>STM32</b><b class='flag-5'>微控制器</b>引导程序的<b class='flag-5'>USB</b>_DFU协议应用手册

    AN4879 使用STM32微控制器USB硬件和PCB指南

    AN4879 使用STM32微控制器USB硬件和PCB指南
    发表于 11-21 17:07 10次下载
    AN4879 使用<b class='flag-5'>STM32</b><b class='flag-5'>微控制器</b>的<b class='flag-5'>USB</b>硬件和PCB指南

    STM32微控制器的技术特点和性能指标

      STM32微控制器是ST公司推出的一款基于ARM Cortex-M内核的32位微控制器具有高性能、低功耗、高集成度等特点,广泛应用于各种嵌入式系统。本文将对
    发表于 09-25 17:16 1633次阅读