OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4954|回复: 12

STM32FF103CBT6内部FLASH模拟U盘求助(HAL库)

[复制链接]

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7464
金钱
7464
注册时间
2015-1-15
在线时间
1368 小时
发表于 2018-4-22 11:29:45 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 yklstudent 于 2018-4-22 11:30 编辑

各位,好:

最近想通过内部FLASH模拟U盘实现用户程序升级,使用的是STM32CubeMX创建的工程,目前连接PC时可以显示U盘,提示需要格式化U盘;
但是U盘格式化一直不成功,不知道哪位是否研究过,或者可以帮忙看下是什么原因导致无法格式化。
代码如下所示:
/**
  ******************************************************************************
  * @file           : usbd_storage_if.c
  * @version        : v2.0_Cube
  * @brief          : Memory management layer.
  ******************************************************************************
  * This notice applies to any and all portions of this file
  * that are not between comment pairs USER CODE BEGIN and
  * USER CODE END. Other portions of this file, whether
  * inserted by the user or by software development tools
  * are owned by their respective copyright owners.
  *
  * Copyright (c) 2018 STMicroelectronics International N.V.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted, provided that the following conditions are met:
  *
  * 1. Redistribution of source code must retain the above copyright notice,
  *    this list of conditions and the following disclaimer.
  * 2. Redistributions in binary form must reproduce the above copyright notice,
  *    this list of conditions and the following disclaimer in the documentation
  *    and/or other materials provided with the distribution.
  * 3. Neither the name of STMicroelectronics nor the names of other
  *    contributors to this software may be used to endorse or promote products
  *    derived from this software without specific written permission.
  * 4. This software, including modifications and/or derivative works of this
  *    software, must execute solely and exclusively on microcontroller or
  *    microprocessor devices manufactured by or for STMicroelectronics.
  * 5. Redistribution and use of this software other than as permitted under
  *    this license is void and will automatically terminate your rights under
  *    this license.
  *
  * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS"
  * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT
  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
  * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY
  * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT
  * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
  * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  ******************************************************************************
  */

/* Includes ------------------------------------------------------------------*/
#include "usbd_storage_if.h"

/* USER CODE BEGIN INCLUDE */

/* USER CODE END INCLUDE */

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/

/* USER CODE END PV */

/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
  * @brief Usb device.
  * @{
  */

/** @defgroup USBD_STORAGE
  * @brief Usb mass storage device module
  * @{
  */

/** @defgroup USBD_STORAGE_Private_TypesDefinitions
  * @brief Private types.
  * @{
  */

/* USER CODE BEGIN PRIVATE_TYPES */

/* USER CODE END PRIVATE_TYPES */

/**
  * @}
  */

/** @defgroup USBD_STORAGE_Private_Defines
  * @brief Private defines.
  * @{
  */

#define STORAGE_LUN_NBR                          1
#define STORAGE_BLK_NBR                          0x40
#define STORAGE_BLK_SIZ                          0x200

/* USER CODE BEGIN PRIVATE_DEFINES */
#define FLASH_START_ADDR                                        0x08008000
#define FLASH_SIZE                                                        0x8000
/* USER CODE END PRIVATE_DEFINES */

/**
  * @}
  */

/** @defgroup USBD_STORAGE_Private_Macros
  * @brief Private macros.
  * @{
  */

/* USER CODE BEGIN PRIVATE_MACRO */

/* USER CODE END PRIVATE_MACRO */

/**
  * @}
  */

/** @defgroup USBD_STORAGE_Private_Variables
  * @brief Private variables.
  * @{
  */

/* USER CODE BEGIN INQUIRY_DATA_FS */
/** USB Mass storage Standard Inquiry Data. */
const int8_t STORAGE_Inquirydata_FS[] = {/* 36 */

        /* LUN 0 */
        0x00,
        0x80,
        0x02,
        0x02,
        (STANDARD_INQUIRY_DATA_LEN - 5),
        0x00,
        0x00,        
        0x00,
        'S', 'T', 'M', ' ', ' ', ' ', ' ', ' ', /* Manufacturer : 8 bytes */
        'P', 'r', 'o', 'd', 'u', 'c', 't', ' ', /* Product      : 16 Bytes */
        ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
        '0', '.', '0' ,'1'                      /* Version      : 4 Bytes */
};
/* USER CODE END INQUIRY_DATA_FS */

/* USER CODE BEGIN PRIVATE_VARIABLES */

/* USER CODE END PRIVATE_VARIABLES */

/**
  * @}
  */

/** @defgroup USBD_STORAGE_Exported_Variables
  * @brief Public variables.
  * @{
  */

extern USBD_HandleTypeDef hUsbDeviceFS;

/* USER CODE BEGIN EXPORTED_VARIABLES */

/* USER CODE END EXPORTED_VARIABLES */

/**
  * @}
  */

/** @defgroup USBD_STORAGE_Private_FunctionPrototypes
  * @brief Private functions declaration.
  * @{
  */

static int8_t STORAGE_Init_FS(uint8_t lun);
static int8_t STORAGE_GetCapacity_FS(uint8_t lun, uint32_t *block_num, uint16_t *block_size);
static int8_t STORAGE_IsReady_FS(uint8_t lun);
static int8_t STORAGE_IsWriteProtected_FS(uint8_t lun);
static int8_t STORAGE_Read_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len);
static int8_t STORAGE_Write_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len);
static int8_t STORAGE_GetMaxLun_FS(void);

void STFlash_ReadBuffer(uint32_t blk_addr, uint8_t *buf, uint16_t blk_len);
void STFlash_WriteBuffer(uint32_t blk_addr, uint8_t *buf, uint16_t blk_len);

/* USER CODE BEGIN PRIVATE_FUNCTIONS_DECLARATION */

/* USER CODE END PRIVATE_FUNCTIONS_DECLARATION */

/**
  * @}
  */

USBD_StorageTypeDef USBD_Storage_Interface_fops_FS =
{
        STORAGE_Init_FS,
        STORAGE_GetCapacity_FS,
        STORAGE_IsReady_FS,
        STORAGE_IsWriteProtected_FS,
        STORAGE_Read_FS,
        STORAGE_Write_FS,
        STORAGE_GetMaxLun_FS,
        (int8_t *)STORAGE_Inquirydata_FS
};

/* Private functions ---------------------------------------------------------*/
/**
  * @brief  Initializes over USB FS IP
  * @param  lun:
  * @retval USBD_OK if all operations are OK else USBD_FAIL
  */
int8_t STORAGE_Init_FS(uint8_t lun)
{
        /* USER CODE BEGIN 2 */
        return (USBD_OK);
        /* USER CODE END 2 */
}

/**
  * @brief  .
  * @param  lun: .
  * @param  block_num: .
  * @param  block_size: .
  * @retval USBD_OK if all operations are OK else USBD_FAIL
  */
int8_t STORAGE_GetCapacity_FS(uint8_t lun, uint32_t *block_num, uint16_t *block_size)
{
        /* USER CODE BEGIN 3 */
        *block_num  = STORAGE_BLK_NBR;
        *block_size = STORAGE_BLK_SIZ;
        return (USBD_OK);
        /* USER CODE END 3 */
}

/**
  * @brief  .
  * @param  lun: .
  * @retval USBD_OK if all operations are OK else USBD_FAIL
  */
int8_t STORAGE_IsReady_FS(uint8_t lun)
{
        /* USER CODE BEGIN 4 */
        return (USBD_OK);
        /* USER CODE END 4 */
}

/**
  * @brief  .
  * @param  lun: .
  * @retval USBD_OK if all operations are OK else USBD_FAIL
  */
int8_t STORAGE_IsWriteProtected_FS(uint8_t lun)
{
        /* USER CODE BEGIN 5 */
        return (USBD_OK);
        /* USER CODE END 5 */
}

/**
  * @brief  .
  * @param  lun: .
  * @retval USBD_OK if all operations are OK else USBD_FAIL
  */
int8_t STORAGE_Read_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
        /* USER CODE BEGIN 6 */
        STFlash_ReadBuffer(blk_addr, buf, blk_len);
        return (USBD_OK);
        /* USER CODE END 6 */
}

/**
  * @brief  .
  * @param  lun: .
  * @retval USBD_OK if all operations are OK else USBD_FAIL
  */
int8_t STORAGE_Write_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
        /* USER CODE BEGIN 7 */
        STFlash_WriteBuffer(blk_addr, buf, blk_len);
        return (USBD_OK);
        /* USER CODE END 7 */
}

/**
  * @brief  .
  * @param  None
  * @retval .
  */
int8_t STORAGE_GetMaxLun_FS(void)
{
        /* USER CODE BEGIN 8 */
        return (STORAGE_LUN_NBR - 1);
        /* USER CODE END 8 */
}

/* USER CODE BEGIN PRIVATE_FUNCTIONS_IMPLEMENTATION */
//uint32_t ulFlashData;
//uint32_t ulFlashAddr;
//uint32_t i,j,n;
void STFlash_ReadBuffer(uint32_t blk_addr, uint8_t *buf, uint16_t blk_len)
{
        uint32_t ulFlashData = 0;
        uint32_t ulFlashAddr = FLASH_START_ADDR + blk_addr*STORAGE_BLK_SIZ;
        uint32_t i,j,n = 0;
        if((blk_addr + blk_len)*STORAGE_BLK_SIZ < FLASH_SIZE)
        {
                for(i=0; i<blk_len; i++)
                {
                        for(j=0; j<STORAGE_BLK_SIZ; j+=4)
                        {
                                ulFlashData = *(volatile unsigned int*)(ulFlashAddr);
                                buf[n++] = (uint8_t)(ulFlashData >> 0);
                                buf[n++] = (uint8_t)(ulFlashData >> 8);
                                buf[n++] = (uint8_t)(ulFlashData >> 16);
                                buf[n++] = (uint8_t)(ulFlashData >> 24);
                                ulFlashAddr += 4;
                        }
                }
        }
}
        
volatile uint8_t iMemory[FLASH_PAGE_SIZE];
volatile uint8_t eMemory[STORAGE_BLK_SIZ];
void STFlash_WriteBuffer(uint32_t blk_addr, uint8_t *buf, uint16_t blk_len)
{
        uint32_t ulFlashData = 0;
        uint32_t ulFlashAddr = 0;
        uint32_t secpos;                // 扇区地址
        uint16_t secoff;                // 扇区内偏移地址
        
        if((blk_addr+blk_len)*STORAGE_BLK_SIZ >= FLASH_SIZE)
        {
                return;
        }
        //uint32_t ulFlashData = 0;
        //uint32_t ulFlashAddr = 0;
        ulFlashData = 0;
        ulFlashAddr = 0;
        uint32_t i, j;
        for(i=0; i<STORAGE_BLK_SIZ; i++)
        {
                eMemory = buf;
                if(eMemory[0] == 0xEB && eMemory[1] == 0x3C)
                {
                        ulFlashData = 0;
                        ulFlashAddr = 0;
                }
        }
        // FLASH_PAGE_SIZE
        for(i=0; i<blk_len; i++)
        {
                secpos = (blk_addr + i) / 2;
                secoff = (blk_addr + i) % 2;
                STFlash_ReadBuffer(secpos, (uint8_t*)&iMemory[0], 4);
                for(j=0; j<STORAGE_BLK_SIZ; j++)
                {
                        if(iMemory[j+secoff*STORAGE_BLK_SIZ] != 0xFF)
                                break;
                }
                HAL_FLASH_Unlock();
                if(j < STORAGE_BLK_SIZ)
                {
                        /* Clear all FLASH flags */
                        __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPERR);
                        if(secpos >= 32)
                        {
                                ulFlashData = 0;
                                ulFlashAddr = 0;
                        }
                        uint32_t PageError = 0;
                        FLASH_EraseInitTypeDef pEraseInit;
                        pEraseInit.TypeErase = FLASH_TYPEERASE_PAGES;
                        pEraseInit.PageAddress = FLASH_START_ADDR + secpos*FLASH_PAGE_SIZE;
                        pEraseInit.Banks = FLASH_BANK_1;
                        pEraseInit.NbPages = 1;
                        HAL_FLASHEx_Erase(&pEraseInit, &PageError);
                        for(j=0; j<STORAGE_BLK_SIZ; j++)
                        {
                                iMemory[j + secoff*STORAGE_BLK_SIZ] = buf[j + i*STORAGE_BLK_SIZ];
                        }
                        ulFlashAddr = FLASH_START_ADDR + secpos*FLASH_PAGE_SIZE;
                        for(j=0; j<FLASH_PAGE_SIZE; j+=4)
                        {
                                ulFlashData  = (uint32_t)iMemory[j + 3] << 24;
                                ulFlashData += (uint32_t)iMemory[j + 2] << 16;
                                ulFlashData += (uint32_t)iMemory[j + 1] << 8;
                                ulFlashData += (uint32_t)iMemory[j + 0] << 0;
                                HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, ulFlashAddr, ulFlashData);
                                ulFlashAddr += 4;
                        }
                }
                else
                {
                        for(j=0; j<STORAGE_BLK_SIZ; j++)
                        {
                                iMemory[j + secoff*STORAGE_BLK_SIZ] = buf[j + i*STORAGE_BLK_SIZ];
                        }
                        ulFlashAddr = FLASH_START_ADDR + secpos*FLASH_PAGE_SIZE + secoff*STORAGE_BLK_SIZ;
                        for(j=0; j<STORAGE_BLK_SIZ; j+=4)
                        {
                                ulFlashData  = (uint32_t)iMemory[j + secoff*STORAGE_BLK_SIZ + 3] << 24;
                                ulFlashData += (uint32_t)iMemory[j + secoff*STORAGE_BLK_SIZ + 2] << 16;
                                ulFlashData += (uint32_t)iMemory[j + secoff*STORAGE_BLK_SIZ + 1] << 8;
                                ulFlashData += (uint32_t)iMemory[j + secoff*STORAGE_BLK_SIZ + 0] << 0;
                                HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, ulFlashAddr, ulFlashData);
                                ulFlashAddr += 4;
                        }
                }
                HAL_FLASH_Lock();
        }
}
/* USER CODE END PRIVATE_FUNCTIONS_IMPLEMENTATION */

/**
  * @}
  */

/**
  * @}
  */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/


工程文件如下所示:
STM32F103CBT6_DRIVER_MSC.zip (13.87 MB, 下载次数: 283)

一分耕耘一分收获。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-4-23 01:52:02 | 显示全部楼层
回复

使用道具 举报

1

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2018-8-10
在线时间
13 小时
发表于 2018-8-10 09:40:35 | 显示全部楼层
帮顶......................................
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2018-8-10
在线时间
4 小时
发表于 2018-8-10 12:20:31 | 显示全部楼层
好厉害啊 是不是IAP升级? 搞一个boodloader  后面就是在内部flash放bin文件了   
一般是串口收发 你现在是想U盘拷贝吧  
帮顶
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2013-7-26
在线时间
2 小时
发表于 2018-8-24 15:07:38 | 显示全部楼层
同样的问题,同求。
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2013-7-26
在线时间
2 小时
发表于 2018-8-26 08:46:40 来自手机 | 显示全部楼层
问题解决了 因为不熟悉hal库的原因 sector的大小没有对应上
回复

使用道具 举报

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7464
金钱
7464
注册时间
2015-1-15
在线时间
1368 小时
 楼主| 发表于 2018-8-26 10:26:58 来自手机 | 显示全部楼层
cooleyes 发表于 2018-8-26 08:46
问题解决了 因为不熟悉hal库的原因 sector的大小没有对应上

这个问题你解决了?
回复

使用道具 举报

64

主题

446

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1032
金钱
1032
注册时间
2017-7-26
在线时间
275 小时
发表于 2018-8-26 12:39:14 | 显示全部楼层
内部FLASH模拟 U盘?
这个功能做不到升级的吧,毕竟数据是按照文件系统的方式管理的

如果是USB升级固件,那应该是DFU功能才对
回复

使用道具 举报

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7464
金钱
7464
注册时间
2015-1-15
在线时间
1368 小时
 楼主| 发表于 2018-8-26 22:43:54 来自手机 | 显示全部楼层
a3748622 发表于 2018-8-26 12:39
内部FLASH模拟 U盘?
这个功能做不到升级的吧,毕竟数据是按照文件系统的方式管理的


你就没明白升级过程和原理
回复

使用道具 举报

62

主题

275

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1155
金钱
1155
注册时间
2012-3-4
在线时间
80 小时
发表于 2020-1-8 16:13:40 | 显示全部楼层
yklstudent 发表于 2018-8-26 22:43
你就没明白升级过程和原理

请问插上了,显示2个未知设备,不知道什么原因,换了两个人的代码了,f103C8T6
回复

使用道具 举报

1

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2017-7-1
在线时间
31 小时
发表于 2020-3-27 13:54:10 | 显示全部楼层
问题怎么解决的?能分享一下吗?
回复

使用道具 举报

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7464
金钱
7464
注册时间
2015-1-15
在线时间
1368 小时
 楼主| 发表于 2020-3-27 15:16:52 | 显示全部楼层
浅笺CCC 发表于 2020-3-27 13:54
问题怎么解决的?能分享一下吗?

没解决,搁置了
一分耕耘一分收获。
回复

使用道具 举报

34

主题

322

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1838
金钱
1838
注册时间
2014-12-4
在线时间
717 小时
发表于 2020-3-27 15:56:16 | 显示全部楼层
浅笺CCC 发表于 2020-3-27 13:54
问题怎么解决的?能分享一下吗?

https://blog.csdn.net/louyangyang91/article/details/83867186   看看这个可以解决吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-24 00:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表