STM32 USB 使用芯片内部flash模拟U盘
来源:互联网 发布:密码破译软件 编辑:程序博客网 时间:2024/06/05 19:03
然后要编写MAL_Init()、MAL_Write()、MAL_Read()、MAL_GetStatus()这里不多做介绍,贴出代码:#define FLASH_START_ADDR 0x08016000 // Flash start address #define FLASH_SIZE 0x64000 // 400K 的U盘 #define FLASH_PAGE_SIZE 0x800 // 2k Bytes per page,只有2K才能格式化#define FLASH_WAIT_TIMEOUT 100000 //操作等待时间
#include "mass_mal.h"
#define FLASH_START_ADDR 0x08016000 // Flash start address #define FLASH_SIZE 0x64000 // 400K 的U盘 #define FLASH_PAGE_SIZE 0x800 // 2k Bytes per page,只有2K才能格式化#define FLASH_WAIT_TIMEOUT 100000/* Private typedef -----------------------------------------------------------*//* Private define ------------------------------------------------------------*//* Private macro -------------------------------------------------------------*//* Private variables ---------------------------------------------------------*/uint32_t Mass_Memory_Size[2];uint32_t Mass_Block_Size[2];uint32_t Mass_Block_Count[2];__IO uint32_t Status = 0;/* Private function prototypes -----------------------------------------------*//* Private functions ---------------------------------------------------------*//******************************************************************************** Function Name : MAL_Init* Description : 初始化STM32的媒体设备* Input : lun* Output : None* Return : None*******************************************************************************/uint16_t MAL_Init(uint8_t lun){ u16 status = MAL_OK; switch (lun) { case 0: FLASH_Unlock(); break; default: return MAL_FAIL; } return status;}/******************************************************************************** Function Name : MAL_Write* Description : 写扇区* Input : None* Output : None* Return : None*******************************************************************************/uint16_t MAL_Write(uint8_t lun, uint32_t Memory_Offset, uint32_t *Writebuff, uint16_t Transfer_Length){ uint16_t i; switch (lun) { case 0: 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]);} break; default: return MAL_FAIL; } return MAL_OK;}/******************************************************************************** Function Name : MAL_Read* Description : 读取扇区* Input : None* Output : None* Return : Buffer pointer*******************************************************************************/uint16_t MAL_Read(uint8_t lun, uint32_t Memory_Offset, uint32_t *Readbuff, uint16_t Transfer_Length){ uint16_t i; switch (lun) { case 0: for(i=0;i<Transfer_Length;i+=4){Readbuff[i>>2] = ((vu32*)(FLASH_START_ADDR + Memory_Offset))[i>>2];} break; default: return MAL_FAIL; } return MAL_OK;}/******************************************************************************** Function Name : MAL_GetStatus* Description : 获取状态* Input : None* Output : None* Return : None*******************************************************************************/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;LED2_ON();return MAL_OK;} LED2_OFF();
return MAL_FAIL;}
- STM32 USB 使用芯片内部flash模拟U盘
- STM32 USB NAND FLASH 模拟U盘
- STM32 USB NAND Flash模拟U盘无法格式化问题的解决
- STM32 USB SD卡读卡器和NAND FLASH模拟U盘
- STM32 Internal Flash DFU芯片内部flash代码升级
- stm32 spi flash u盘
- STM32芯片内部温度传感器
- STM32芯片片内FLASH模拟EEPROM实验
- 简单实现stm32f103芯片usb模拟U盘进行IAP更新用户程序
- 关于 STM32 USB 模拟U盘的程序 无法格式化 的问题
- stm32 读写内部Flash
- STM32读写内部Flash
- STM32 读写内部Flash
- STM32的内部Flash
- STM32内部flash读写
- STM32写内部FLASH
- stm32 内部flash
- STM32官网Flash 模拟EEROM使用教程
- C语言单向循环链表解决约瑟夫问题
- 算法之旅,直奔<algorithm>之十七 find_first_of
- 字节序问题--大端法小端法
- Using Putty on Windows to login Linux securely via OpenSSH
- STM32 USB DFU设备固件升级 工程讲解
- STM32 USB 使用芯片内部flash模拟U盘
- Android学习笔记:Service的调用与音乐播放
- DIY一块DS3231的高精度时钟模块,让时钟DS3231/DS1302自动识别
- DMA学习资料
- The OS for Car
- 大数据推理
- UVA 11134 - Fabled Rooks(贪心+优先队列)
- 草根站长的你是感觉自豪还是苦逼
- Hibernate的session.flush做了什么呢?