STM32 USB学习笔记

2023-10-27

STM32 USB学习笔记

一、USB-FS-Device firmware library

使用固件库开发程序,需要包含几个文件

 

从图中可见,应用程序接口部分,有:usb_pwr, usb_conf, usb_desc, usb_istr, usb_prop, usb_endp六个文件,在设备驱动中有六个文件:usb_core, usb_init, usb_sil, usb_int, usb_regs, usb_mem。

 

usb_regs:它提供了访问USB设备外围接口寄存器的基本过程。

usb_int:处理正确传输服务程序,提供了USB协议事件和库的联系

usb_mem:提供用户存储区和包存储区的数据交换。

usb_init :设置在库中要使用的初始化程序和全局变量

usb_core: 实现在USB2.0协议第9章中的所有功能。

usb_sil :实现外围接口的抽象层,它提供的过程实现端点的读写。

---------

usb_conf.h:Define the BTABLE and all endpoint addresses in the PMA.

Define the interrupt mask according to the needed events.

usb_desc :包括所有应用层的描述符。

usb_prop :为USB核提供的Device_Property、Device_Table、 USER_STANDARD_REQUEST 结构

usb_endp:

usb_istr:

usb_pwr:

 

 

 

 

 

 

 

 

实例调试

 

USB_Init(),里面只调用了一个函数,pProperty->Init();这个函数是什么呢?当右击这个函数出现的快捷菜单中,选择 Go to defined of Init 时,无法找到这个函数。这是怎么回事呢?实际上,向前面看,有一个pProperty = &Device_Property,噢,原来把这个指针指向了Device_Property,那么,再找一下它的定义,有一个结构:

DEVICE_PROP Device_Property =

  {

    MASS_init,

    MASS_Reset,

    MASS_Status_In,

    MASS_Status_Out,

    MASS_Data_Setup,

    MASS_NoData_Setup,

    MASS_Get_Interface_Setting,

    MASS_GetDeviceDescriptor,

    MASS_GetConfigDescriptor,

    MASS_GetStringDescriptor,

    0,

    0x40 /*MAX PACKET SIZE*/

  };

可见,这个Init实际上就是MASS_init函数了,这个函数里有几个调用,一个是Get_SerialNum函数,里面有这个

  Device_Serial0 = *(__IO uint32_t*)(0x1FFFF7E8);

  Device_Serial1 = *(__IO uint32_t*)(0x1FFFF7EC);

  Device_Serial2 = *(__IO uint32_t*)(0x1FFFF7F0);

这里用了绝对地址调,指向0x1FFFF7E8以后的几个字节的内容,它放的是什么呢?手册中说了:Unique device ID register (96 bits)

下一个是PowerOn函数,它是设置CNTR、ISTR寄存器的,首先强制USB复位,再设置中断。

还有一个调用:USB_SIL_Init,它又重新设置了CNTR寄存器的内容。

好了,初始化部分结束了。USB在处理时,输入和输出都采用中断形式,可以使用的中断有两个0x8C和0x90,它是和CAN共用的。在0x8C处调用的是CTR_HP函数,在0x90处调用的是USB_Istr函数。

USB_Istr函数是根据CNTR的设置,以及读取ISTR的状态来决定要执行的过程,还有根据对Callback的定义,来执行相应的Callback。其中CTR_LP是一个主要过程。它主要根据传输方向及端点种类决定执行的三个过程,In0_Process,Setup0_Process,Out0_Process。

对于CTR_HP函数,判断中断状态,来执行EP2_OUT_Callback(又调用了过程 Mass_Storage_Out)或EP1_IN_Callback(它又调用了Mass_Storage_In),

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

CAN和USB共用中断问题,可根据中断寄存器状态判断处理,由于对这些位的读出不影响其内容,因此不用保存。

    if (wInterrupt_Mask & _GetISTR())

        USB_Istr();

    else  if ((CAN1->RF0R) & 0x1B)

{

……

}

 

 

 

 

修改MAL_Init、MAL_GetStatus、MAL_Write、MAL_Read

与具体存储介质打交道的就是这三个函数,MAL_Init对介质进行初始化,MAL_GetStatus提供介质信息,对于SPI Flash,要解除写保护,才能实现格式化等写入工作,

 

 

 -----------------闲了再写


from: http://dontium.blog.163.com/blog/static/342952722011765381937/




本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32 USB学习笔记 的相关文章

  • 51单片机 数码管中断操作

    实践目的 1 掌握中断的概念和思想 2 掌握51单片机中断系统和相关软硬件设计 实践内容 1 利用单片机的P0口接数码管的字段脚 P1 0脚接共阴极 P3 2 P3 3引脚接独立按键产生外部中断信号 编写程序 当程序正常运行时数码管显示H字
  • 如何更改闪存的起始地址?

    我正在使用 STM32F746ZG 和 FreeRTOS Flash的起始地址是0x08000000 但我想把它改成0x08040000 我通过谷歌搜索了这个问题 但没有找到解决方案 我更改了链接器脚本 如下所示 MEMORY RAM xr
  • 初始化 ST-Link 设备时出错 - 无法连接到设备

    我目前正在使用 ST Link 调试器对我的 STM32F3 Discovery 板进行编程 我使用的IDE是Atollic TrueStudio 5 5 2 现在我面临一个非常奇怪的问题 那就是我不断收到消息 初始化 ST Link 设备
  • 在地址“0xXXXXXX”处中断,没有可用的调试信息,或在程序代码之外

    配置 使用 Nucleo L476RG 使用 GNU ARM Eclipse 我从 STM32CubeMX 生成了一个极简代码 我已经在我的板载 ST Link 中刷新了 J link 驱动程序 一直在尝试为我的代码运行调试器 但我的程序计
  • STM32 F072上的软件如何跳转到bootloader(DFU模式)?

    STM32应用笔记2606对此进行了讨论 但没有简单的代码示例 该答案已使用 IAR EWARM 在 STM32F072 Nucleo 板上进行了测试 这个答案使用 STM32标准外设库 仅此而已 请注意 验证您是否成功进入引导加载程序模式
  • 136-基于stm32单片机家庭温湿度防漏水系统设计Proteus仿真+源程序

    资料编号 136 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 蜂鸣器 制作一个基于stm32单片机家庭温湿度防漏水系统设计Proteus仿真 2 通过DHT11传感器检测当前温湿度 并且显示到L
  • rt-thread studio中新建5.02版本报错

    先吐槽一下 rt thread studio出现BUG真多 好多时间都是在找BUG 但里面用好多控件还是挺好用的 真是又爱又恨 所以一般使用功能不多的话还是用keil多一点 创建5 02版本工程之后直接进行编译 直接会报下面这个错误 资源
  • STM32用一个定时器执行多任务写法

    文章目录 main c include stm32f4xx h uint32 t Power check times 电量检测周期 uint32 t RFID Init Check times RFID检测周期 int main Timer
  • STM32超声波——HC_SR04

    文章目录 一 超声波图片 二 时序图 三 超声波流程 四 单位换算 五 取余计算 六 换算距离 七 超声波代码 一 超声波图片 测量距离 2cm 400cm 二 时序图 1 以下时序图要先提供一个至少10us的脉冲触发信号 告诉单片机我准备
  • STM32F103概要

    The STM32F103x4 STM32F103x6 STM32F103xC STM32F103xD and STM32F103xE are a drop in replacement for STM32F103x8 B medium d
  • 解决KEIL编译慢问题

    两种方案 使用v6版本的ARM Compiler 如果v6版本编译不过 必须使用v5版本的 则可以勾选掉Browse Information选项 提升很明显 1分多钟能优化到几秒 看代码量 但是这个有个弊端 在KEIL中会影响函数跳转 建议
  • 跟着野火学FreeRTOS:第一段(任务定义,切换以及临界段)

    在裸机系统中 系统的主体就是 C P U CPU CP U 按照预先设定的程序逻辑在 m a i n
  • 1.69寸SPI接口240*280TFT液晶显示模块使用中碰到的问题

    1 69寸SPI接口240 280TFT液晶显示模块使用中碰到的问题说明并记录一下 在网上买了1 69寸液晶显示模块 使用spi接口 分辨率240 280 给的参考程序是GPIO模拟的SPI接口 打算先移植到FreeRtos测试 再慢慢使用
  • 嵌入式开发--STM32G4系列片上FLASH的读写

    这个玩意吧 说起来很简单 就是几行代码的事 但楞是折腾了我大半天时间才搞定 原因后面说 先看代码吧 读操作 读操作很简单 以32位方式读取的时候是这样的 data IO uint32 t 0x0800F000 需要注意的是 当以32位方式读
  • 核心耦合内存在 STM32F4xx 上可执行吗?

    尝试从 STM32F429s CCM 运行代码 但每当我命中 CCM 中的第一条指令时 我总是会遇到硬故障 并且 IBUSERR 标志被设置 该指令有效且一致 STM32F4xx 是否可能不允许从 CCM 执行 数据访问效果良好 alios
  • 通过JTAG恢复STM32 MCU磨掉的标记

    我有一块可能带有 STM32 MCU 的板 我想为该板制作定制固件 因为库存板有很多问题 不幸的是 电路板制造商很友善地磨掉了所有标记 有没有办法通过 jtag 获取设备 系列 ID 并将其交叉引用到型号 我能找到的一切都是关于获取芯片的唯
  • 嵌入式 C++11 代码 — 我需要 volatile 吗?

    采用 Cortex M3 MCU STM32F1 的嵌入式设备 它具有嵌入式闪存 64K MCU固件可以在运行时重新编程闪存扇区 这是由闪存控制器 FMC 寄存器完成的 所以它不像a b那么简单 FMC 获取缓冲区指针并将数据刻录到某个闪存
  • STM32 上的位置无关代码 - 指针

    我已成功在 STM32 上构建并运行位置无关的代码 向量表和 GOT 已修补 一切正常 但我对这样的代码有问题 double myAdd double x return x 0 1 double ptrmyAdd double myAdd
  • STM32内部时钟

    我对 STM32F7 设备 意法半导体的 Cortex M7 微控制器 上的时钟系统感到困惑 参考手册没有充分阐明这些时钟之间的差异 SYSCLK HCLK FCLK 参考手册中阅读章节 gt RCC 为 Cortex 系统定时器 SysT
  • 在 Contiki 程序中使用 malloc

    考虑以下 Contiki 程序 include

随机推荐

  • 金蝶,「起舞」在大模型时代

    在过去的几年时间里 基于EBC的平台能力 金蝶已经走出了一个新的进化之路 这条路是对自身产品竞争力的重新构建 也更是对企业数字化转型需求的更大程度满足 如今 苍穹GPT大模型更是让这种竞争力和服务力更向前一步 作者 皮爷 出品 产业家 6个
  • 2016腾旭研发工程师笔试题

    用C C 代码算出满足上述条件的值 我们首先来分析一下 step0 我们可以得到如下方程 step1 由方程 1 3 6 可得 我们可以把x1 x5 x6看成自变量 x2 x8 x7看成对应的函数 这样只要x1 x5 x6确定了 x2 x8
  • 常见的垃圾回收机制总结

    如何工作 在某些 Java 虚拟机中 堆的实现截然不同 它更像一个传送带 每分配一个新对象 它就向前移动一格 这意味着对象存储空间的分配速度特别快 Java 的 堆指针 只是简单地移动到尚未分配的区域 所以它的效率与 C 在栈上分配空间的效
  • (Matlab源码)Matlab实现算术编码(Arithmetic coding)超级详解(每一段代码都可以看懂)

    1 代码功能 输入 一个字符串 输出 codeword 码值 codeword所占的位数 2 代码框图 3 代码超详解 统计字符串中的字符种类 调用函数 放入数组b中 b unique str1 统计每种字符的个数 放入数组a中 for i
  • PTA L1-016 查验身份证(详解)

    前言 本期是关于查验身份证的详解 内容包括四大模块 题目 代码实现 大致思路 代码解读 今天你c了吗 题目 一个合法的身份证号码由17位地区 日期编号和顺序编号加1位校验码组成 校验码的计算规则如下 首先对前17位数字加权求和 权重分配为
  • 计算机网络(第七版)谢希仁编著(转载请注明出处---https://www.cnblogs.com/qingl)...

    计算机网络复习 第七版 谢希仁编著 转载请注明出处 https www cnblogs com qingl 第一章 P39 1 15 假定网络的利用率达到了90 试估算一下现在的网络时延是它的最小值的多少倍 解 设网络利用率为U 网络时延为
  • 网络规划设计与综合布线技术详解

    一 网络工程概述 1 计算机网络及其组成 计算机网络是现代通信技术与计算机技术相结合的产物 随着计算机网络本身的发展 人们认为 计算机网络是把地理位置不同 功能独立自治的计算机系统及数据设备通过通信设备和线路连接起来 在功能完善的网络软件运
  • jQuery 绑定3种表单事件 change(value值改变),focus(获到焦点),blur(失去焦点)

    1 change 说明 元素的value值改变时 触发change事件 change事件只适用于文本框 text 文本域 textarea 下拉框 select 元素 语法 selector change function1 实例 文本框
  • 编译原理——词法分析器

    1 概述 设计 编制并调试一个简单的C语言词法分析程序 掌握利用状态转换图设计词法分析器的基本方法 利用该词法分析器完成对源程序字符串的词法分析 通过对该词法分析器的设计 加深对词法分析原理 状态转换图等编译原理知识的理解 2 使用的基本概
  • 最新bilibili怎么下载视频

    bilibili作为最火的二次元网站 很多人想下载下来 却不知道怎么下手 今天小编就来818怎么下载bilibili的视频 1 我们拿这案例来参考 https www bilibili com video av40672186 from s
  • d3碰撞源码分析

    技术 d3 d3 force d3 geom quadtree d3 geom quadtree 四叉树的应用 图像处理 空间数据索引 2D中的快速碰撞检测 存储稀疏数据等 游戏编程 上图中的数据就是普通的点 点与点之间没有关系 此函数在构
  • TOJ--3100:Getting Gold (DFS)

    1 题目源地址 http acm tju edu cn toj showp3100 html 2 源代码 TOJ 3100 Getting Gold include
  • httprunner接口自动化测试框架使用说明【保姆级教程】

    背景介绍 httprunner是国内开源的一个接口自动化框架 已经有部分公司开始使用这种框架来完成自己公司的接口自动化编写 本文主要是从简单的流程上去讲解咋使用的 PS 开发者本尊的官网教程写的是真的烂 一点也不友好 里面各种坑 本文基于h
  • Java基础——封装、继承、多态

    今天我们来了解一下面向对象的三大特性 封装 继承和多态 封装 把属性和实现细节隐藏起来 不让外界直接访问 提供公共的方法访问方式 private A 只能修饰成员 B 被private修饰的成员只能在本类中访问 外界不可以直接访问 C pr
  • cocos2d-x 地图随英雄移动

    本人刚开始学习cocos2d x游戏引擎 学到瓦片地图这块 网上有一个很经典的例子 见链接 基于Cocos2D X的砖块地图教程 一 在看到其中的地图跟随角色移动 一般情况下保持角色在屏幕中央附近 到地图边缘时移动角色 的问题时看的不大明白
  • reference to ‘ max‘ is ambiguous

    今天写C 算法的时候 声明了一个全局遍历max 来记录最短路径 编译发现遇到一个以前没遇到过的错误 reference to max is ambiguous 翻译过来就是对 max 的引用有歧义 通过查询百度发现 原因是我引用了iostr
  • c++中如何实现十进制(Dec)与十六进制(Hex)之间的相互转换

    c 中如何实现十进制 Dec 与十六进制 Hex 之间的相互转换 1 十进制 gt 十六进制 include stdafx h include iostream include string using namespace std stri
  • 富集分析(GO、KEGG、GSEA)

    library clusterProfiler library org Hs eg db GO分析与KEGG分析 GO分析需要一个基因 symbol列表 列表中为差异表达基因 一 读入数据 result lt read csv file R
  • 凡科网JS逆向后跳出的滑块验证(base64图片解码之后的破解滑块验证)

    目录 1 前提和大概思路概述 2 转换思路selenium和验证滑块图片的获取处理 3 总结 1 前提和大概思路概述 只是学习的途中有一些新的发现 分享给大家 希望对你们有帮助 凡科网的JS逆向的闭包技巧应该是典型的闭包案例 很多人都有讲解
  • STM32 USB学习笔记

    STM32 USB学习笔记 一 USB FS Device firmware library 使用固件库开发程序 需要包含几个文件 从图中可见 应用程序接口部分 有 usb pwr usb conf usb desc usb istr us