(8)hw_config.h文件重写
#ifndef HW_CONFIG_H
#define HW_CONFIG_H
#include "platform_config.h"
#include "usb_type.h"
typedef enum
{
DISABLE = 0,
ENABLE = 1
}FunctionalState;
#define BULK_MAX_PACKET_SIZE 0x00000040 //包大小,最大64字节
void Led_RW_ON( void ) ; //LED开启
void Led_RW_OFF( void ) ; //LED关闭
void Set_USBClock( void ) ; //USB时钟配置函数
void Enter_LowPowerMode( void ) ; //USB进入低功耗模式
void Leave_LowPowerMode( void ) ; //USB退出低功耗模式
void USB_Interrupts_Config( void ) ; //USB中断配置
void USB_Port_Set( u8 enable ) ; //USB使能
void Get_SerialNum( void ) ; //获取STM32的唯一ID
#endif
(9)hw_config.c文件重写
#include "usb_lib.h"
#include "mass_mal.h"
#include "usb_desc.h"
#include "usb_pwr.h"
#include "usb_lib.h"
#include "usb_istr.h"
void USB_NotConfigured_LED()
{
}
void USB_Cable_Config( FunctionalState NewState )
{
}
void Led_RW_OFF()
{
}
void Led_RW_ON()
{
}
void USBWakeUp_IRQHandler()
{
EXTI->PR |= 1<<18 ; //清除USB唤醒中断挂起位
}
void USB_LP_CAN1_RX0_IRQHandler()
{
USB_Istr() ;
}
void Set_USBClock()
{
RCC->CFGR &= ~( 1<<22 ) ; //USBclk=PLLclk/1.5=48Mhz
RCC->APB1ENR |= 1<<23 ; //USB时钟使能
}
void Enter_LowPowerMode()
{
bDeviceState = SUSPENDED ;
}
void Leave_LowPowerMode()
{
DEVICE_INFO *pInfo = &Device_Info ;
if( pInfo->Current_Configuration!=0 )
bDeviceState=CONFIGURED ;
else
bDeviceState = ATTACHED ;
}
void USB_Interrupts_Config()
{
EXTI->IMR |= 1<<18 ; //开启线18上的中断
EXTI->RTSR |= 1<<18 ; //line 18上事件上升降沿触发
NVIC_Init( 1, 0, USB_LP_CAN1_RX0_IRQn, 2 ) ; //组2优先级次之
NVIC_Init( 0, 0, USBWakeUp_IRQn, 2 ) ; //组2优先级最高
}
void USB_Port_Set( u8 enable )
{
RCC->APB2ENR |= 1<<2 ; //使能PORTA时钟
if( enable )
_SetCNTR( _GetCNTR()&0xFFFFFFFD ) ; //退出断电模式
else
{
_SetCNTR( _GetCNTR()|0x02 ) ; //断电模式
GPIOA->CRH &= 0xFFF00FFF ;
GPIOA->CRH |= 0x00033000 ;
PAout( 12 ) = 0 ;
}
}
void IntToUnicode( u32 value, u8 *pbuf, u8 len )
{
u8 idx ;
for( idx=0; idx
{
if( ( value>>28 )<0xA )
pbuf[ 2*idx ] = ( value>>28 )+'0' ;
else
pbuf[ 2*idx ] = ( value>>28 )+'A'-10 ;
value <<= 4 ;
pbuf[ 2*idx+1 ] = 0 ;
}
}
void Get_SerialNum()
{
u32 Device_Serial0, Device_Serial1, Device_Serial2 ;
Device_Serial0 = *( u32* )0x1FFFF7E8 ;
Device_Serial1 = *( u32* )0x1FFFF7EC ;
Device_Serial2 = *( u32* )0x1FFFF7F0 ;
Device_Serial0 += Device_Serial2 ;
if( Device_Serial0!=0 )
{
IntToUnicode( Device_Serial0, &MASS_StringSerial[ 2 ] , 8 ) ;
IntToUnicode( Device_Serial1, &MASS_StringSerial[ 18 ], 4 ) ;
}
}
(10)platform_config.h文件重写
#ifndef PLATFORM_CONFIG_H
#define PLATFORM_CONFIG_H
#include "sys.h"
#define USE_STM3210E_EVAL //当前使用的版本
#endif
(11)usb_pwr.c文件修改(改写Suspend函数)
void Suspend(void)
{
uint32_t i=0 ;
uint16_t wCNTR ;
__IO uint32_t savePWR_CR=0 ;
wCNTR = _GetCNTR() ;
for( i=0; i<8; i++ )
EP[ i ] = _GetENDPOINT( i ) ;
wCNTR |= CNTR_RESETM ;
_SetCNTR( wCNTR ) ;
wCNTR |= CNTR_FRES ;
_SetCNTR( wCNTR ) ;
wCNTR &= ~CNTR_FRES ;
_SetCNTR( wCNTR ) ;
while( ( _GetISTR()&ISTR_RESET )==0 ) ;
_SetISTR( ( uint16_t )CLR_RESET ) ;
for( i=0; i<8; i++ )
_SetENDPOINT( i, EP[ i ] ) ;
wCNTR |= CNTR_FSUSP ;
_SetCNTR( wCNTR ) ;
wCNTR = _GetCNTR() ;
wCNTR |= CNTR_LPMODE ;
_SetCNTR( wCNTR ) ;
Enter_LowPowerMode() ;
}
(12)在sys.h文件中添加几个重要的数据类型
typedef volatile uint8_t vu8;
#define __IO volatile
(13)stm32f103x.h文件中添加一个数据类型
typedef long long uint64_t ;
通过以上步骤,USB固件库的移植就完成了,然后只需要调用固件库的函数即可完成USB通信。
22.2.3 主函数编写
#include "sys.h"
#include "delay.h"
#include "usart1.h"
#include "lcd.h"
#include "sdio_sdcard.h"
#include "w25q128.h"
#include "malloc.h"
#include "mass_mal.h"
#include "usb_lib.h"
#include "hw_config.h"
#include "usb_pwr.h"
#include "memory.h"
#include "usb_bot.h"
extern u8 Max_Lun ; //支持的磁盘个数
int main()
{
u8 USB_STA, Divece_STA, tct=0, offline_cnt=0;
STM32_Clock_Init( 9 ) ; //系统时钟设置
SysTick_Init( 72 ) ; //延时初始化
USART1_Init( 72, 115200 ) ; //串口初始化为115200
LCD_Init() ; //初始化LCD
W25QXX_Init() ; //初始化W25Q128
my_mem_init( SRAMIN ) ; //初始化内部内存池
//初始化SD卡
if( SD_Init() )
Max_Lun = 0 ; //SD卡错误,则仅只有一个磁盘
//SD 卡正常
else
{
Mass_Memory_Size[ 1 ] = SDCardInfo.CardCapacity ; //得到SD卡容量(字节),当SD卡容量超过4G的时候,需要用到两个u32来表示
Mass_Block_Size[ 1 ] = 512 ; //因为我们在Init里面设置了SD卡的操作字节为512个,所以这里一定是512个字节
Mass_Block_Count[ 1 ] = Mass_Memory_Size[ 1 ]/Mass_Block_Size[ 1 ] ;
}
Mass_Memory_Size[ 0 ] = 1024*1024*12 ; //前12M字节
Mass_Block_Size[ 0 ] = 512 ; //设置SPI FLASH的操作扇区大小为512
Mass_Block_Count[ 0 ] = Mass_Memory_Size[ 0 ]/Mass_Block_Size[ 0 ] ;
delay_ms( 1800 ) ;
USB_Port_Set( 0 ) ; //USB先断开
delay_ms( 700 ) ;
USB_Port_Set( 1 ) ; //USB再次连接
LCD_ShowString( 30, 10, "USB Connecting..." ) ; //提示USB开始连接
Data_Buffer = mymalloc( SRAMIN, BULK_MAX_PACKET_SIZE*2*4 ) ; //为USB数据缓存区申请内存
Bulk_Data_Buff = mymalloc( SRAMIN, BULK_MAX_PACKET_SIZE ) ; //申请内存
//USB配置
USB_Interrupts_Config() ;
Set_USBClock() ;
USB_Init() ;
delay_ms( 1800 ) ;
while(1)
{
delay_ms( 1 ) ;
//状态改变了
if( USB_STA!=USB_STATUS_REG )
{
LCD_ShowString( 30, 30, " " ) ; //清除显示
//正在写
if( USB_STATUS_REG&0x01 )
LCD_ShowString( 30, 30, "USB Writing..." ) ; //提示USB正在写入数据
//正在读
if( USB_STATUS_REG&0x02 )
LCD_ShowString( 30, 30, "USB Reading..." ) ; //提示USB正在读出数据
if( USB_STATUS_REG&0x04 )
LCD_ShowString( 30, 50, "USB Write Err " ) ; //提示写入错误
else
LCD_ShowString( 30, 50, " " ) ; //清除显示
if( USB_STATUS_REG&0x08 )
LCD_ShowString( 30, 80, "USB Read Err " ) ; //提示读出错误
else
LCD_ShowString( 30, 80, " " ) ; //清除显示
USB_STA = USB_STATUS_REG ; //记录最后的状态
}
//获取USB连接状态
if( Divece_STA!=bDeviceState )
{
if( bDeviceState==CONFIGURED )
LCD_ShowString( 30, 10, "USB Connected " ) ; //提示USB连接已经建立
else
LCD_ShowString( 30, 10, "USB DisConnected " ) ; //提示USB被拔出了
Divece_STA = bDeviceState ;
}
tct ++ ;
if( tct==200 )
{
tct = 0 ;
if( USB_STATUS_REG&0x10 )
{
offline_cnt = 0 ; //USB连接了,则清除offline计数器
bDeviceState = CONFIGURED ;
}
//没有得到轮询
else
{
offline_cnt ++ ;
if( offline_cnt>10 )
bDeviceState = UNCONNECTED ; //2s内没收到在线标记,代表USB被拔出了
}
USB_STATUS_REG = 0 ;
}
}
}
-
usb
+关注
关注
60文章
7945浏览量
264657 -
PC
+关注
关注
9文章
2082浏览量
154205 -
总线
+关注
关注
10文章
2881浏览量
88085
发布评论请先 登录
相关推荐
评论