U盘GPIO文件系统映射-STM32利用内置FLASH做U盘
echo 1 > /sys/devices/platform/leds-gpio/leds/tp-link:green:lan1/brightness //亮
echo 0 > /sys/devices/platform/leds-gpio/leds/tp-link:green:lan1/brightness //灭
|
遗憾的是,由于系统的原因,并不是所有led灯都能得到控制
这个库中没有任何关于文件系统的代码,(QQ:243786753原创作品,转载请注明出处)即文件系统的实现都是由操作系统完成的,这个库中只需要对操作系统发过来的读取与写入命令负责即可。
库中的mass_mal.c为文件系统与存储介质的访问接口(Medium Access Layer interface),负责将文件存储在实际的介质上,如NAND-Flash,SD卡等
我们需要把文件存储在STM32的内部Flash中,因此更改这里的接口即可
mass_mal提供了四个函数
u16 MAL_Init (u8 lun); //初始化介质,由于是内部Flash,为了能写入,只需Unlock FLASH
u16 MAL_GetStatus (u8 lun); //读取介质的参数,页大小,总页数,以及总大小,这个视STM32的内Flash情况而定,为文件系统format介质提供依据
u16 MAL_Read(u8 lun, u32 Memory_Offset, u32 *Readbuff, u16 Transfer_Length); //读取介质上的一块区域
u16 MAL_Write(u8 lun, u32 Memory_Offset, u32 *Writebuff, u16 Transfer_Length); // 写入介质上的一块区域
读写操作的Memory_Offset是从零偏移开始的,用作U盘的STM32内部Flash需要从代码之后开始
原作都说编译结束后代码在0x0800252B,取mini U盘开始地址为0x08003000
STM32F103C8T6,Flash为64K,还剩余52K即0xD000,每一页为1K
根据以上信息,(QQ:243786753原创作品,转载请注明出处)打开STM32_USB-FS-Device_Lib_V4.0.0\Projects\Mass_Storage\src\mass_mal.c
添加FLASH的定义:
#define FLASH_START_ADDR 0x08008800 // Flash起始地址,为了保留更多的代码空间,这个地址比原文更靠后
#define FLASH_SIZE 30*1024 // 30K 大小,因为起始地址改了,所以这里也相应的改了
#define FLASH_PAGE_SIZE 1024 // 1K per page
#define FLASH_WAIT_TIMEOUT 100000
|
uint16_t MAL_Init(uint8_t lun)
{
FLASH_Unlock();
return lun == 0 ? MAL_OK : MAL_FAIL;
}
uint16_t MAL_Write(uint8_t lun, uint32_t Memory_Offset, uint32_t *Writebuff, uint16_t Transfer_Length)
{
if (lun == 0){
uint16_t i;
for ( i=0; i<Transfer_Length;i+=FLASH_PAGE_SIZE){
if (FLASH_WaitForLastOperation(FLASH_WAIT_TIMEOUT)!=FLASH_TIMEOUT){
FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);
}
FLASH_ErasePage(FLASH_START_ADDR + Memory_Offset + i);
}
for (i=0;i<Transfer_Length;i+=4){
if (FLASH_WaitForLastOperation(FLASH_WAIT_TIMEOUT)!=FLASH_TIMEOUT){
FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);
}
FLASH_ProgramWord(FLASH_START_ADDR + Memory_Offset + i , Writebuff[i>>2]);
}
return MAL_OK;
}
return MAL_FAIL;
}
uint16_t MAL_Read(uint8_t lun, uint32_t Memory_Offset, uint32_t *Readbuff, uint16_t Transfer_Length)
{
uint16_t i;
if (lun == 0){
for (i=0;i<Transfer_Length;i+=4){
Readbuff[i>>2] = ((vu32*)(FLASH_START_ADDR + Memory_Offset))[i>>2];
}
return MAL_OK;
}
return MAL_FAIL;
}
uint16_t MAL_GetStatus (uint8_t lun)
{
if (lun == 0){
Mass_Block_Count[0] = FLASH_SIZE/FLASH_PAGE_SIZE;
Mass_Block_Size[0] = FLASH_PAGE_SIZE;
Mass_Memory_Size[0] = FLASH_SIZE;
return MAL_OK;
}
return MAL_FAIL;
}
|
改好了之后文件的存储目标就变成了STM32的内部Flash
实际还有一个问题,那就是在memory.c中Data_Buffer定义大小为512Bytes,这里我们的Flash是1K一页,要将Data_Buffer重新定义成1KBytes的
第49行uint32_t Data_Buffer[BULK_MAX_PACKET_SIZE * 2]; 改成下面
uint32_t Data_Buffer[BULK_MAX_PACKET_SIZE * 4];
编译好后烧到板子上,电脑会提示格式化磁盘,(QQ:243786753原创作品,转载请注明出处)格式化后就可以像一般的U盘那样使用这个mini U盘了
此时就可以顺利的编译了,编译结果在STM32_USB-FS-Device_Lib_V4.0.0\Projects\Mass_Storage\MDK-ARM\STM3210B-EVAL
这里我用的是ISP下载方式,你也可以用其它方式下载,只要能下载到单片机上就行
STM32F103C8T6是3.3V的单片机,不能接5V的电压,好在核心板上自带了1117进行降压。所以直接这样接就行了
需要飞一个1.5K电阻!(很重要,否则无法工作):
连接电脑,提示格式化,格式化后就会出现一个35K的U盘
为什么单独拿出核心板来用?因为核心板放在普中的主板上接线电脑是无法识别的,主板上的电路是这样的:
#define RCC_LED RCC_APB2Periph_GPIOA
#define GPIO_LED GPIOA
#define PIN_LED GPIO_Pin_0
#define LED_ON() GPIO_SetBits(GPIO_LED, PIN_LED);
#define LED_OFF() GPIO_ResetBits(GPIO_LED, PIN_LED);
void LED_Init( void ) {
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = PIN_LED;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
RCC_APB2PeriphClockCmd(RCC_LED, ENABLE); //打开LED使用的GPIO的时钟使能(QQ:243786753原创作品,转载请注明出处)
GPIO_Init(GPIO_LED, &GPIO_InitStructure); //初始化相应的GPIO
}
|
/*
查看参数
lun 不知道什么意思
Memory_Offset 偏移地址(FLASH的地址)
Writebuff 写入的内容
Transfer_Length 内容的长度
*/
uint16_t MAL_Write(uint8_t lun, uint32_t Memory_Offset, uint32_t *Writebuff, uint16_t Transfer_Length)
{
if (lun == 0){
uint16_t i,qq243786753;
uint32_t data=Writebuff[0];
if (data==0x30303030){ //前四个字符0
LED_OFF();
} else if (data==0x31313131){ //前四个字符1
LED_ON();
} else {
/*
实际写入FLASH的代码,从中可行看出来首先会将内容清除,是以页的形式清除
由此可以推断文件系统的最小单位是页(传说中的扇区?),读和写都是一次性操作一页的内容
然后是写入操作,每次写4个字节,直到全部写完
*/
for ( i=0; i<Transfer_Length;i+=FLASH_PAGE_SIZE){
if (FLASH_WaitForLastOperation(FLASH_WAIT_TIMEOUT)!=FLASH_TIMEOUT){
FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);
}
FLASH_ErasePage(FLASH_START_ADDR + Memory_Offset + i);
}
for (i=0;i<Transfer_Length;i+=4){
if (FLASH_WaitForLastOperation(FLASH_WAIT_TIMEOUT)!=FLASH_TIMEOUT){
FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);
}
FLASH_ProgramWord(FLASH_START_ADDR + Memory_Offset + i , Writebuff[i>>2]);
}
}
return MAL_OK;
}
return MAL_FAIL;
}
|
U盘GPIO文件系统映射-STM32利用内置FLASH做U盘相关推荐
- 用STM32的内置DAC制作一个波形生成器(发生器)
社团作业=_= 任务一:波形生成.1.使用STM32的DAC功能,生成0~10kHz的方波,频率精确到1%以内: 2.能够生成三角波.正弦波: 3.实现频率设置,可以实现一定步进数的调节,最高为100 ...
- 【Unity】3.1 利用内置的3D对象创建三维模型
分类:Unity.C#.VS2015 创建日期:2016-04-02 一.基本概念 Unity已经内置了一些基本的3D对象,利用这些内置的3D对象就可以直接构建出各种3D模型(当然,复杂的三维模型还需 ...
- 带内部参考电压(VREFINT)校正的STM32 DMA 内置温度采集
笔者今天来介绍一下STM32ADC内置温度的采集,重点是通过内置参考电压来避免ADC参考电压VDDA对温度ADC采集的影响. 1.STM32ADC简介 stm32F4系列ADC,逐次趋近型AD.1 ...
- BK7256,Wi-Fi6音视频soc-combo芯片,上海博通-内置Flash,支持720P
BK7256,拥有以下强大的资源及应用,带有低功耗,RGB驱屏-4寸以上,内置FLASH,可保活长连接. BK7258,支持h.264视频压缩格式,mipi显示接口,200w像素,Wi-Fi6音视频s ...
- BK7256,上海博通-音视频Wi-Fi6combo-soc,内置Flash,RGB屏驱\720P
BK7256,拥有以下强大的资源及应用,支持低功耗,RGB驱屏-4寸以上,内置FLASH.8M-PSRAM -可保活长连接,智能门锁.猫眼.门铃- 高度集成音视频外设和接口- › 720p 25fps ...
- 版权原因,QQ不再内置flash插件,需安装二个插件
QQ不再内置flash插件 需安装二个插件
- CC2640之OAD固件升级(内置Flash)
转自:http://blog.csdn.net/zzfenglin/article/details/52336612 什么是OAD OAD是TI在BLE协议栈基础上扩展的一种无线更新技术.OAD使用客 ...
- 1x pcie 速度_利用起闲置的PCIe 1x空间:PCIe 1x的SATA扩展卡,内置2.5寸盘位
拼 命 加 载 中 ... 随着M.2接口逐渐占据主流,很多主流级主板都不会像以前那样给上8个SATA接口了,而且在M.2接口被占用时还可能会关闭掉几个SATA接口,这让有较多SATA存储设备的用户比 ...
- 03pe修改计算机名称,[U盘PE教程]玩转PE内置注册表(基于NT6.0)
玩转PE内置注册表(基于NT6.0) 1.让文件夹显示中等图标 Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\_default\So ...
最新文章
- 在用安全框架前,我想先让你手撸一个登陆认证
- 人工智能到来的时代,你曾经瞧不起的职业,可能会非常吃香!
- 北京邮电大学c语言按要求输出_C语言经典100例004-统计各个年龄阶段的人数
- 2018.08.09洛谷P3959 宝藏(随机化贪心)
- 复现原文(一):Single-cell RNA sequencing of human kidney(step by step)
- 80C51汇编语言有哪几条常用伪指令,单片微机原理与接口技术答案(宋跃版)
- 你需要知道的基础算法知识——STL和基础数据结构(一)
- Vue3动态组件、缓存组件、分发组件
- k近邻算法matlab实现_k近邻算法
- breakall lisp文件_breakall.lsp下载
- Vue3.0中文文档(Vue3 + TS学习资源路线)
- “减糖”迫在眉睫,“代糖”或成最佳考量?
- 行业步入快速发展期,万亿级“虚拟蛋糕“将被如何瓜分?
- python中namedtuple的用法
- Nacos 注册中心
- 大家在人生低谷时有多惨,怎么熬过来的(五)
- 小程序插件接入、开发与注意事项
- Flash 与课件制作:加载图片
- Java HTML转成PDF
- 安装SSL证书遇到困难怎么办?