USB移植(FLASH)
一、说明
准备好USB源文件,可参考正点原子USB读卡器实验例程,下载正点原子资料或光盘资料,,例程在 STSW-STM32121\STM32_USB-FS-Device_Lib_V4.0.0\Projects\Mass_Storage 下可以找到(STSW-STM32121 是官方的 USB 库压缩包,在光盘:8,STM32 参考资料\STM32 USB 学习资料文件夹下)。
所需文件如下图所示,添加文件进工程:
二、移植步骤
1、修改“platform_config.h”
我这个工程里面没有“platform_config.h”文件,但是在ST的源文件中有,这个文件只需要保留芯片ID,其余的都可以屏蔽
//#else /*STM32F1x*/
#define ID1 (0x1FFFF7E8)
#define ID2 (0x1FFFF7EC)
#define ID3 (0x1FFFF7F0)
2、修改“hw_config.c”
1)USB时钟配置
void Set_USBClock(void)
{
/* Select USBCLK source */
RCC_ConfigUsbClk(RCC_USBCLK_SRC_PLLCLK_DIV3); /*<<<<<<<<*/
/* Enable the USB clock */
RCC_EnableAPB1PeriphClk(RCC_APB1_PERIPH_USB, ENABLE);
}
2)无需改动
void Enter_LowPowerMode(void)
3)无需改动
void Leave_LowPowerMode(void)
4)USB中断配置
void USB_Interrupts_Config(void)
{
NVIC_InitType NVIC_InitStructure;
/* 2 bit for pre-emption priority, 2 bits for subpriority */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); /*<<<<<<<<*/
/* Enable the USB interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; /*<<<<<<<<*/
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* Enable the USB Wake-up interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USBWakeUp_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; /*<<<<<<<<*/
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
5)无需改动
static void IntToUnicode (uint32_t value , uint8_t *pbuf , uint8_t len)
6)无需改动
void Get_SerialNum(void)
7)无需改动
#define VIRTUAL_COM_PORT_SIZ_STRING_SERIAL 26
uint8_t Virtual_Com_Port_StringSerial[VIRTUAL_COM_PORT_SIZ_STRING_SERIAL] =
{
VIRTUAL_COM_PORT_SIZ_STRING_SERIAL, /* bLength */
USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */
'N',0, '3', 0, '2', 0
};
8)其余的没用到的可屏蔽
3、修改“mass_mal.c”
1)宏定义
uint32_t Mass_Memory_Size[2]; //容量大小
uint32_t Mass_Block_Size[2]; //分配扇区大小
uint32_t Mass_Block_Count[2]; //多少个扇区
__IO uint32_t Status = 0;
2)初始化函数接口
uint16_t MAL_Init(uint8_t lun)
{
uint16_t status = MAL_OK;
switch (lun)
{
/** 内部FLASH作为存储空间 */
case 0:
drv_sflash_init();
break;
default:
return MAL_FAIL;
}
return status;
}
3)写数据函数接口
uint16_t MAL_Write( uint8_t lun, //
uint32_t Memory_Offset, //
uint32_t *Writebuff, //
uint16_t Transfer_Length) //
{
switch (lun)
{
case 0:
{
SPI_Flash_Write( (uint8_t*) Writebuff, Memory_Offset, Transfer_Length);
break;
}
default:
return MAL_FAIL;
}
return MAL_OK;
}
4)读取数据函数接口
uint16_t MAL_Read( uint8_t lun,
uint32_t Memory_Offset,
uint32_t *Readbuff,
uint16_t Transfer_Length)
{
switch (lun)
{
case 0:
{
SPI_Flash_Read((uint8_t *)Readbuff, Memory_Offset, Transfer_Length);
break;
}
default:
return MAL_FAIL;
}
return MAL_OK;
}
5)获取存储状态函数接口
uint16_t MAL_GetStatus (uint8_t lun)
{
switch(lun)
{
case 0:
Mass_Memory_Size[0] = 1024*1024*16; //25Q128 FLASH 容量为16M byte
Mass_Block_Size[0] = 4096; //FLASH分配扇区大小为4K byte
Mass_Block_Count[0] = 4096;
return MAL_OK;
case 1:
return MAL_FAIL;
case 2:
return MAL_FAIL;
default:
return MAL_FAIL;
}
}
4、修改“memory.c”
1)参数
#define BULK_MAX_PACKET_SIZE 0x00000040 //USB协议,每包64个字节
uint32_t Data_Buffer[BULK_MAX_PACKET_SIZE *64]; /*数据缓冲区大小 4096 bytes*/
2)以下函数中有无关的LED灯置位操作,删除即可
void Read_Memory(uint8_t lun, uint32_t Memory_Offset, uint32_t Transfer_Length)
void Write_Memory (uint8_t lun, uint32_t Memory_Offset, uint32_t Transfer_Length)
void Write_Memory (uint8_t lun, uint32_t Memory_Offset, uint32_t Transfer_Length)
5、修改xxxxxxxx_it.c文件
在xxxxxxxx_it.c”中添加USB中断服务函数
void USB_LP_CAN1_RX0_IRQHandler(void)
{
USB_Istr();
}
6,测试验证
1)初始化IO口和FLASH
GPIO_InitType GPIO_InitStructure;
/* Enable the GPIO Clock */
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOA, ENABLE);
GPIO_InitStructure.Pin = GPIO_PIN_11|GPIO_PIN_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);
MAL_Init(0);
2)初始化相关配置
Set_USBClock();
USB_Interrupts_Config();
USB_Init();
3)编译烧录,复位单片机即可检测到U盘。
三、文档参考引用链接
链接1: https://blog.csdn.net/asher__zhou/article/details/105519209.
链接: https://www.cnblogs.com/hiker-blogs/p/stm32_usb.html.
**注意:**如有移植FATFS文件系统的,需注意文件系统扇区分配大小与USB扇区大小一致。