新手上路
- 积分
- 47
- 金钱
- 47
- 注册时间
- 2019-8-14
- 在线时间
- 7 小时
|
需求是通过串口获取数据,存入Flash,然后连接usb,通过电脑可以看到对应的文件。我想着分为两步实现:
1、插上usb,可以看到U盘,暂定100kb吧。
2、针对内部Flash挂载Fatfs。
工程通过CubeMX来生成。
选择晶振
配置基本按照网上的资料来做的,生成代码。
下面就是在usbd_storage_if.c修改。
下面贴出主要代码。
1、一些宏定义,STORAGE_BLK_NBR 这个修改为了200,其他都是官方例子里面截取的。
- #define STORAGE_LUN_NBR 1
- //#define STORAGE_BLK_NBR 0x10000
- #define STORAGE_BLK_NBR 200
- #define STORAGE_BLK_SIZ 0x200
- /* USER CODE BEGIN PRIVATE_DEFINES */
- #define ADDR_FLASH_SECTOR_0 ((uint32_t)0x08000000) /* Base [url=home.php?mod=space&uid=95564]@[/url] of Sector 0, 16 Kbytes */
- #define ADDR_FLASH_SECTOR_1 ((uint32_t)0x08004000) /* Base @ of Sector 1, 16 Kbytes */
- #define ADDR_FLASH_SECTOR_2 ((uint32_t)0x08008000) /* Base @ of Sector 2, 16 Kbytes */
- #define ADDR_FLASH_SECTOR_3 ((uint32_t)0x0800C000) /* Base @ of Sector 3, 16 Kbytes */
- #define ADDR_FLASH_SECTOR_4 ((uint32_t)0x08010000) /* Base @ of Sector 4, 64 Kbytes */
- #define ADDR_FLASH_SECTOR_5 ((uint32_t)0x08020000) /* Base @ of Sector 5, 128 Kbytes */
- #define ADDR_FLASH_SECTOR_6 ((uint32_t)0x08040000) /* Base @ of Sector 6, 128 Kbytes */
- #define ADDR_FLASH_SECTOR_7 ((uint32_t)0x08060000) /* Base @ of Sector 7, 128 Kbytes */
- #define FLASH_USER_START_ADDR ADDR_FLASH_SECTOR_7 /* Start @ of user Flash area */
复制代码 2、添加一个函数,来自官方例子。
- /**
- * @brief Gets the sector of a given address
- * @param None
- * @retval The sector of a given address
- */
- static uint32_t GetSector(uint32_t Address)
- {
- uint32_t sector = 0;
-
- if((Address < ADDR_FLASH_SECTOR_1) && (Address >= ADDR_FLASH_SECTOR_0))
- {
- sector = FLASH_SECTOR_0;
- }
- else if((Address < ADDR_FLASH_SECTOR_2) && (Address >= ADDR_FLASH_SECTOR_1))
- {
- sector = FLASH_SECTOR_1;
- }
- else if((Address < ADDR_FLASH_SECTOR_3) && (Address >= ADDR_FLASH_SECTOR_2))
- {
- sector = FLASH_SECTOR_2;
- }
- else if((Address < ADDR_FLASH_SECTOR_4) && (Address >= ADDR_FLASH_SECTOR_3))
- {
- sector = FLASH_SECTOR_3;
- }
- else if((Address < ADDR_FLASH_SECTOR_5) && (Address >= ADDR_FLASH_SECTOR_4))
- {
- sector = FLASH_SECTOR_4;
- }
- else if((Address < ADDR_FLASH_SECTOR_6) && (Address >= ADDR_FLASH_SECTOR_5))
- {
- sector = FLASH_SECTOR_5;
- }
- else if((Address < ADDR_FLASH_SECTOR_7) && (Address >= ADDR_FLASH_SECTOR_6))
- {
- sector = FLASH_SECTOR_6;
- }
- else/*(Address < FLASH_END_ADDR) && (Address >= ADDR_FLASH_SECTOR_7))*/
- {
- sector = FLASH_SECTOR_7;
- }
- return sector;
- }
复制代码 3、修改STORAGE_Read_FS函数。
- int8_t STORAGE_Read_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
- {
- /* USER CODE BEGIN 6 */
- if(lun == 0)
- {
- memcpy(buf,(uint8_t *)(FLASH_USER_START_ADDR + blk_addr), blk_len * STORAGE_BLK_SIZ);
- return USBD_OK;
- }
- return USBD_FAIL;
- /* USER CODE END 6 */
- }
复制代码 4、修改STORAGE_Write_FS函数。
- int8_t STORAGE_Write_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
- {
- /* USER CODE BEGIN 7 */
- if(lun == 0)
- {
- uint16_t i;
- uint32_t FirstSector = 0, NbOfSectors = 0;
- HAL_FLASH_Unlock();
- /* Get the 1st sector to erase */
- FirstSector = GetSector(FLASH_USER_START_ADDR + blk_addr);
- /* Get the number of sector to erase from 1st sector*/
- NbOfSectors = GetSector(FLASH_USER_START_ADDR + blk_addr + blk_len*FLASH_PAGE_SIZE) - FirstSector + 1;
- FLASH_EraseInitTypeDef f;
- f.TypeErase = FLASH_TYPEERASE_SECTORS;
- f.VoltageRange = FLASH_VOLTAGE_RANGE_3;
- f.Sector = FirstSector;
- f.NbSectors = NbOfSectors;
-
- uint32_t PageError = 0;
- HAL_FLASHEx_Erase(&f, &PageError);
- for(i=0; i< blk_len*FLASH_PAGE_SIZE; i+=4)
- {
- //HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, FLASH_USER_START_ADDR + blk_addr + i, *(uint32_t *)(&buf[i]));
- HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, FLASH_USER_START_ADDR + blk_addr + i, *(uint32_t *)(buf+i));
- }
- HAL_FLASH_Lock();
- return USBD_OK;
- }
- return USBD_FAIL;
- /* USER CODE END 7 */
- }
复制代码 5、下载 到板子,插上usb,果然出现了新设备,还有提示格式化。
6、默认参数进行格式化。
7、果然失败了,好无奈。
第一次做flash、usb的东西,挂载fatfs应该也会遇到不少麻烦。
请各位前辈不吝赐教,问题到底出在哪里。
是配置错了,还是函数用错了,还是参数传错了,还是地址写错了。
多谢各位大神帮忙。
|
|