U盘GPIO文件系统映射-STM32利用内置FLASH做U盘

受到linux对一切设备的控制都当成文件对待的启发
于是便有了这个将GPIO映射到U盘中的想法,这样一来便可以在任何支持U盘的设备中扩展系统的硬件功能了
我的QQ是243786753,这属于原创作品,作为一个对单片机一窍不通的人从设想到实现成功付出了巨大的努力,
最初的设想是通过openwrt路由器远程控制一个开关,然而找遍整个网络都没有这样的东西,
所以只好花了两百元巨款买了整套的单片机实验套件,从51逐步调试成功,转载请注明出处,举手之劳,本文首发于CSDN和数码之家,20160809

在openwrt路由器中可以用这样的方法来控制路由器的led
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灯都能得到控制


实验环境:
win7 32位、 Keil uVision4、 Putty、 FlyMcu
硬件:stm32f103c8t6 8M晶振、PL2303 USB转串口

代码修改:
参考资料:  5分钟用STM32的内置Flash做一个超小U盘   http://blog.sina.com.cn/s/blog_ae3f6c0f01017nyf.html
ST的官方网站的UM0424中有一个关于使用STM32做Mass Storage的例子,实现的第一步自然是要先实现利用内置Flash做一个超小U盘
之后的U盘GPIO正是在此基础上修改而来的

从ST官网下载UM0424 , en.stsw-stm32121.zip解压后是 STM32_USB-FS-Device_Lib_V4.0.0

这个库中没有任何关于文件系统的代码,(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);
            }
           
  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值