USB移植(FLASH)

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扇区大小一致。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值