USB移植(FLASH)

2023-10-29

USB移植(FLASH)

一、说明

准备好USB源文件,可参考正点原子USB读卡器实验例程,下载正点原子资料或光盘资料,,例程在 STSW-STM32121\STM32_USB-FS-Device_Lib_V4.0.0\Projects\Mass_Storage 下可以找到(STSW-STM32121 是官方的 USB 库压缩包,在光盘:8,STM32 参考资料\STM32 USB 学习资料文件夹下)。
所需文件如下图所示,添加文件进工程:
在这里插入图片描述
在这里插入图片描述

二、移植步骤

1、修改“platform_config.h”
我这个工程里面没有“platform_config.h”文件,但是在ST的源文件中有,这个文件只需要保留芯片ID,其余的都可以屏蔽

//#else /*STM32F1x*/

#define         ID1          (0x1FFFF7E8)
#define         ID2          (0x1FFFF7EC)
#define         ID3          (0x1FFFF7F0)

2、修改“hw_config.c”

1)USB时钟配置

void Set_USBClock(void)
{
    /* Select USBCLK source */
    RCC_ConfigUsbClk(RCC_USBCLK_SRC_PLLCLK_DIV3);   /*<<<<<<<<*/
    /* Enable the USB clock */
    RCC_EnableAPB1PeriphClk(RCC_APB1_PERIPH_USB, ENABLE);
}

2)无需改动

void Enter_LowPowerMode(void)     

3)无需改动

void Leave_LowPowerMode(void)   

4)USB中断配置

void USB_Interrupts_Config(void)
{
    NVIC_InitType NVIC_InitStructure;

    /* 2 bit for pre-emption priority, 2 bits for subpriority */
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); /*<<<<<<<<*/

    /* Enable the USB interrupt */
    NVIC_InitStructure.NVIC_IRQChannel                   = USB_LP_CAN1_RX0_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority        = 3;  /*<<<<<<<<*/
    NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

		
    /* Enable the USB Wake-up interrupt */
    NVIC_InitStructure.NVIC_IRQChannel                   = USBWakeUp_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority        = 3;  /*<<<<<<<<*/
    NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

5)无需改动

static void IntToUnicode (uint32_t value , uint8_t *pbuf , uint8_t len)   

6)无需改动

void Get_SerialNum(void)  

7)无需改动

#define VIRTUAL_COM_PORT_SIZ_STRING_SERIAL      26
uint8_t Virtual_Com_Port_StringSerial[VIRTUAL_COM_PORT_SIZ_STRING_SERIAL] =
  {
    VIRTUAL_COM_PORT_SIZ_STRING_SERIAL,           /* bLength */
    USB_STRING_DESCRIPTOR_TYPE,                   /* bDescriptorType */
    'N',0, '3', 0, '2',  0 
};

8)其余的没用到的可屏蔽

3、修改“mass_mal.c”

1)宏定义

uint32_t Mass_Memory_Size[2];  //容量大小
uint32_t Mass_Block_Size[2];   //分配扇区大小
uint32_t Mass_Block_Count[2];  //多少个扇区
__IO uint32_t Status = 0;

2)初始化函数接口

uint16_t MAL_Init(uint8_t lun)
{
	uint16_t status = MAL_OK;

	switch (lun)
	{
		/** 内部FLASH作为存储空间 */
		case 0:
			drv_sflash_init();
			break;
		
		default:
			return MAL_FAIL;
	}
	return status;
}

3)写数据函数接口

uint16_t MAL_Write(	uint8_t 	lun, 				// 
					uint32_t 	Memory_Offset, 		//
					uint32_t 	*Writebuff, 		//
					uint16_t 	Transfer_Length)	// 
{
	switch (lun)
	{
		case 0:
		{
			SPI_Flash_Write( (uint8_t*) Writebuff, Memory_Offset, Transfer_Length);
			break;
		}
		default:
			return MAL_FAIL;
	}
  
	return MAL_OK;
}

4)读取数据函数接口

uint16_t MAL_Read(	uint8_t 	lun, 
					uint32_t 	Memory_Offset, 
					uint32_t 	*Readbuff, 
					uint16_t 	Transfer_Length)
{
	switch (lun)
	{
		case 0:
		{	
			SPI_Flash_Read((uint8_t *)Readbuff, Memory_Offset, Transfer_Length);
			break;
		}
		
		default:
			return MAL_FAIL;
	}
	return MAL_OK;
}

5)获取存储状态函数接口

uint16_t MAL_GetStatus (uint8_t lun)
{
	switch(lun)
	{
		case 0:
			Mass_Memory_Size[0] = 1024*1024*16;   //25Q128 FLASH 容量为16M byte	
			Mass_Block_Size[0]  = 4096;    //FLASH分配扇区大小为4K byte
			Mass_Block_Count[0] = 4096;
			return MAL_OK;
		case 1:
			return MAL_FAIL;
		case 2:
			return MAL_FAIL;
		default:
			return MAL_FAIL;
	}
}

4、修改“memory.c”

1)参数

#define BULK_MAX_PACKET_SIZE  0x00000040   //USB协议,每包64个字节

uint32_t Data_Buffer[BULK_MAX_PACKET_SIZE *64]; /*数据缓冲区大小 4096 bytes*/

2)以下函数中有无关的LED灯置位操作,删除即可

void Read_Memory(uint8_t lun, uint32_t Memory_Offset, uint32_t Transfer_Length)
void Write_Memory (uint8_t lun, uint32_t Memory_Offset, uint32_t Transfer_Length)
void Write_Memory (uint8_t lun, uint32_t Memory_Offset, uint32_t Transfer_Length)

5、修改xxxxxxxx_it.c文件
在xxxxxxxx_it.c”中添加USB中断服务函数

void USB_LP_CAN1_RX0_IRQHandler(void)
{
    USB_Istr();
}

6,测试验证
1)初始化IO口和FLASH

GPIO_InitType GPIO_InitStructure;
	/* Enable the GPIO Clock */
	RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOA, ENABLE);
	GPIO_InitStructure.Pin        = GPIO_PIN_11|GPIO_PIN_12;
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);
	
	MAL_Init(0);

2)初始化相关配置

Set_USBClock();
USB_Interrupts_Config();
USB_Init();

3)编译烧录,复位单片机即可检测到U盘。

三、文档参考引用链接

链接1: https://blog.csdn.net/asher__zhou/article/details/105519209.
链接: https://www.cnblogs.com/hiker-blogs/p/stm32_usb.html.

**注意:**如有移植FATFS文件系统的,需注意文件系统扇区分配大小与USB扇区大小一致。

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

USB移植(FLASH) 的相关文章

  • BMS开发之面向对象思想(adbms1818)

    借鉴adbms1818的底层驱动代码 前言 adbms1818的主要用途就是不同种类的寄存器里面存储不同的数据 程序员需要通过特定的协议往寄存器里面写入或者读出数据 1 定义一个结构体 里面存储了adbms1818的所有寄存器的信息 然后我
  • stm32毕设分享 stm32单片机酒精浓度酒驾检测系统 - 物联网 嵌入式

    文章目录 0 前言 1 简介 2 主要器件 3 实现效果 4 硬件设计 MQ 3酒精乙醇传感器模块 SIM800C模块 5 软件说明 系统框图
  • 【MCU简单且容易理解的工作原理】

    SOC是啥 System on Chip 一个芯片 但是片上有好多东西的意思 市面上的AI芯片 包括你知道的麒麟xxx 骁龙xxx等等一些列手机芯片都是SOC 对于SOC设计者来讲 显然要知道码农们码出来的一行行代码是如何在SOC上跑起来的
  • STM32F207 I2C 测试失败

    我正在使用 STM32F207 微控制器在 STM3220G EVAL 板上学习嵌入式开发 我尝试通过连接同一芯片上的两个 I2C2 和 I2C3 模块并发送 接收字符来测试 I2C 接口 这是我当前编写的代码 使用 mdk arm 5 i
  • 【C语言】数组

    一维数组的创建和初始化 数组是一组相同类型元素的集合 数组的创建 数组的创建方式 type t arr name const n type t 是指数组的元素类型 const n 是一个常量表达式 用来指定数组的大小 数组创建的实例 数组创
  • 毕设开题分享 单片机智能教室系统(智能照明+人数统计)

    1 简介 Hi 大家好 今天向大家介绍一个学长做的单片机项目 单片机智能教室系统 智能照明 人数统计 大家可用于 课程设计 或 毕业设计 项目分享 https gitee com feifei1122 simulation project
  • 世微 AP2402降压恒流驱动IC LED刹车灯方案 全亮 半亮 瀑闪

    AP2402 是一款 PWM 工作模式 高效 率 外围简单 内置功率管 适用于 5 100V 输入的高精度降压 LED 恒流驱动芯片 输 出功率可达 15W 电流 1 5A AP2402 可实现三段功能切换 通过 MODE1 2 3 切换三
  • 世微AP9196 DC-DC 升压恒流电源管理芯 电解水驱动电源应用线路

    AP9196 是一系列外围电路简洁的宽调光比升压调光恒流驱动器 适用于 3 40V 输入电压范围的 LED照明领域 AP9196 采用我司专利算法 可以实现高精度的恒流效果 输出电流恒流精度 3 电压工作范围为5 40V 可以轻松满足锂电池
  • 会stm32有机会进大公司吗?

    今日话题 会stm32有机会进大公司吗 我本科期间参与了飞思卡尔和电赛等比赛 使用过多种单片机 但渐渐发现单片机只是其中的一小部分 不要过分迷恋所谓的单片机基础和技巧 更值得深入研究的是C语言 如果你对此感兴趣 我愿意无偿分享一个资源包 其
  • 太阳诱电 | 电容器为什么会发热?什么是纹波电流

    电容器中存在寄生于电极和电介质的电阻成分 当纹波电流等交流电流通过电容器时 电阻的成分会产生热量 为了抑制发热 选择ESR较低的电容器非常重要 陶瓷电容器在电容器中ESR较低 非常适合抑制发热 电容器中的纹波电流主要是指电源电路中由于IC的
  • Arm:objcopy 如何知道 elf 中的哪些部分要包含在二进制或 ihex 中?

    我正在开发一个项目 其中涉及解析arm elf 文件并从中提取部分 显然 elf 文件中有很多部分没有加载到闪存中 但我想知道 objcopy 到底如何知道要在二进制文件中包含哪些部分以直接闪存到闪存中 以arm elf文件的以下reade
  • C和指针课后答案

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 第八章课后答案 提示 以下是本篇文章正文内容 下面案例可供参考
  • 库函数点亮Led

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 提示 这里可以添加本文要记录的大概内容 例如 随着人工智能的不断发展 机器学习这门
  • 华为OD机试真题-API集群负载统计-Java-OD统一考试(C卷)

    题目描述 某个产品的RESTful API集合部署在服务器集群的多个节点上 近期对客户端访问日志进行了采集 需要统计各个API的访问频次 根据热点信息在服务器节点之间做负载均衡 现在需要实现热点信息统计查询功能 RESTful API的由多
  • Cortex-M3与M4权威指南

    处理器类型 所有的ARM Cortex M 处理器是32位的精简指令集处理器 它们有 32位寄存器 32位内部数据路径 32位总线接口 除了32位数据 Cortex M处理器也可以有效地处理器8位和16位数据以及支持许多涉及64位数据的操作
  • 从没有中断引脚并且在测量准备好之前需要一些时间的传感器读取数据的最佳方法

    我正在尝试将压力传感器 MS5803 14BA 与我的板 NUCLEO STM32L073RZ 连接 根据 第 3 页 压力传感器需要几毫秒才能准备好读取测量值 对于我的项目 我对需要大约 10 毫秒来转换原始数据的最高分辨率感兴趣 不幸的
  • STM32 上的 ADC 单次转换

    我正在研究 STM32 F103x 上的 ADC 编程 并从最简单的情况 单次转换开始 测量内部温度传感器 连接到 ADC1 的值 并使用 USART 将其发送到 COM 端口 目标似乎很明确 但是当我尝试将源代码下载到闪存时 它不会向 C
  • 在 Contiki 程序中使用 malloc

    考虑以下 Contiki 程序 include
  • 哪些变量类型/大小在 STM32 微控制器上是原子的?

    以下是 STM32 微控制器上的数据类型 http www keil com support man docs armcc armcc chr1359125009502 htm http www keil com support man d
  • 移动数组中的元素

    我需要一点帮助 我想将数组中的元素向上移动一个元素 以便新位置 1 包含位置 1 中的旧值 new 2 包含 old 1 依此类推 旧的最后一个值被丢弃 第一个位置的新值是我每秒给出的新值 我使用大小为 10 的数组 uint32 t TE

随机推荐

  • 浅谈对Linux中行规程(Line Discipline)的理解

    文章目录 前言 一 Line Discipline是什么 二 在输入子系统中的位置 总结 前言 学完Linux驱动程序中的输入子系统 Input System 后 又接触到行规程 Line Discipline 明明这个行规程也是用来处理输
  • Linux网络编程:Web服务器

    文章目录 一 超文本编辑语言HTML 二 HTTP超文本传输协议 1 请求和响应消息流程 myhttpd c getline函数 用于读取http协议头 2 错误 2 1 处理出错返回disconnect 2 2 错误页面展示send er
  • 【机器学习】:梯度提升决策树(GBDT)

    综述 GBDT Gradient Boosting Decision Tree 又叫 MART Multiple Additive Regression Tree 是一种迭代的决策树算法 该算法由多棵决策树组成 所有树的结论累加起来做最终答
  • 深度解读Q_D指针与Q_Q指针

    首先是Q D指针 先贴上我们的测试用例 class TEST class TESTPrivate public TESTPrivate TEST parent q ptr parent a 666 cout lt lt TESTPrivat
  • 【C++】初阶 --- 引用(超级详细版!!!)

    文章目录 一 引用的概念 二 引用的特性 1 引用在定义时必须初始化 2 一个变量可以有多个引用 3 引用一旦引用一个实体 再不能引用其他实体 三 常引用 被const 修饰的引用 1 权限的放大 2 权限的平移 3 权限的缩小 4 临时变
  • Java 字符串Base64编码和解码

    编码 String message 我是码农 String encode Base64 getEncoder encodeToString message getBytes StandardCharsets UTF 8 方式一 String
  • 线程与进程的区别

    1 一个程序至少有一个进程 一个进程至少有一个线程 2 线程的划分尺度小于进程 使得多线程程序的并发性高 3 进程在执行过程中拥有独立的内存单元 而多个线程共享内存 从而极大地提高了程序的运行效率 4 每个独立的线程有一个程序运行的入口 顺
  • 老油条表示真干不过,部门新来的00后网络安全工程师已把我卷崩溃,想离职了...

    在程序员职场上 什么样的人最让人反感呢 是技术不好的人吗 并不是 技术不好的同事 我们可以帮他 是技术太强的人吗 也不是 技术很强的同事 可遇不可求 向他学习还来不及呢 真正让人反感的 是技术平平 却急于表现自己的人 每天加班到12点 在老
  • 在Idea中,如何在SpringBoot中使用jsp页面

    在Idea中 如何在SpringBoot中使用jsp页面 1 首先 创建一个SpringBoot工程 选择Spring Initializr 然后点击next 修改工程路径 jdk根据自己安装的具体的jdk版本进行选择 根据项目所需进行选择
  • 刷脸支付彻底解决顾客的支付安全更方便

    创业能成功 其中一项不为人知的关键就在于你无需热爱自己所做的事情 热情当然必需要有 但它可以是因为这个生意能赚钱 而不是对产品的热情 当然这是纯粹的生活选择 不过鉴于赚钱能给自己和他人带来的好处 我希望你发现光是能赚到钱就足以是一种热情 生
  • Unreal4引擎开发学习日志

    Unreal4引擎开发学习笔记1 相关说明 本游戏引擎学习日志是笔者根据网上相关教学视频所写 是对视频内容的精炼与总结 如果您认为笔者所写不清晰明确 可以访问以下链接 Unreal入门第一季 虚幻C 基础训练 虚幻4引擎介绍 虚幻4是一套为
  • 插件编写傻瓜教程>>VC6.0

    gt gt 写在前面本教程主要讲解如何用按键精灵自带的模版编写插件 请大家在教程没全部写完之前不要跟贴 谢谢合作 需要的工具 VC6 0 编辑语言 C gt gt 初步接触1 安装VC6 0 建议不要使用创天的汉化版 2 解压插件自带的模版
  • 软件定价:我们深谙其道吗?

    本文为翻译初稿 更多精彩内容 敬请关注 高效能程序员的修炼 人民邮电出版社 一段时间以来频繁光顾iPhone应用商店 以致于产生了个副作用 我开始从根本上改变了对软件定价的看法 这么多优秀的iPhone应用程序 要么是免费的 要么只卖区区几
  • 关于在windows使用msys2 + mingw + gcc/g++ 编译godot的笔记

    关于在windows使用msys2 mingw gcc g 编译godot的笔记 编译参数 1 target release debug release debug 2 多线程参数 j数字 3 profile是自定义构建参数 可以启用或者禁
  • python中找出numpy array数组的最值及其索引介绍

    转自 微点阅读 https www weidianyuedu com 在list列表中 max list 可以得到list的最大值 list index max list 可以得到最大值对应的索引 但在numpy中的array没有index
  • Echarts饼状图属性设置大全

    1 标题设置 title text 学生生源地来源分布图 subtext 模拟数据 x 设置水平安放位置 默认左对齐 可选值 center left right number x坐标 单位px x center y 设置垂直安放位置 默认全
  • FPGA--IP核之RAM

    RAM 的英文全称是 Random Access Memory 即随机存取存储器 它可以随时把数据写入任一指定地址的存储单元 也可以随时从任一指定地址中读出数据 其读写速度是由时钟频率决定的 RAM主要用来存放程序及程序执行过程中产生的中间
  • 深度学习理论总结(1)

    0 前言 为了在暑假能更好的发展自己 鉴于对深度学习的浓厚兴趣 楼主开始学习深度学习的相关知识 本系列内容是在楼主学习吴恩达老师的深度学习课程后进行的总结 使用的程序软件为python 如有纰漏还请各位大佬指出 我将虚心接受 1 深度学习概
  • Visual Studio Code常用插件详解

    文章目录 前言 VS Code必备插件 1 IntelliCode 2 IntelliCode API Usage Examples 3 Settings Sync 前端必备插件 1 Auto Close Tag 2 Auto Rename
  • USB移植(FLASH)

    USB移植 FLASH 一 说明 准备好USB源文件 可参考正点原子USB读卡器实验例程 下载正点原子资料或光盘资料 例程在 STSW STM32121 STM32 USB FS Device Lib V4 0 0 Projects Mas