(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字節(jié)
void Led_RW_ON( void ) ; //LED開啟
void Led_RW_OFF( void ) ; //LED關(guān)閉
void Set_USBClock( void ) ; //USB時(shí)鐘配置函數(shù)
void Enter_LowPowerMode( void ) ; //USB進(jìn)入低功耗模式
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時(shí)鐘使能
}
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上事件上升降沿觸發(fā)
   NVIC_Init( 1, 0, USB_LP_CAN1_RX0_IRQn, 2 ) ;         //組2優(yōu)先級次之
   NVIC_Init( 0, 0, USBWakeUp_IRQn, 2 ) ;              //組2優(yōu)先級最高
}
void USB_Port_Set( u8 enable )
{
RCC->APB2ENR |= 1<<2 ;                        //使能PORTA時(shí)鐘            
   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 //當(dāng)前使用的版本
#endif
(11)usb_pwr.c文件修改(改寫Suspend函數(shù))
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文件中添加幾個(gè)重要的數(shù)據(jù)類型
typedef volatile uint8_t vu8;
#define __IO volatile
(13)stm32f103x.h文件中添加一個(gè)數(shù)據(jù)類型
typedef long long uint64_t ;
通過以上步驟,USB固件庫的移植就完成了,然后只需要調(diào)用固件庫的函數(shù)即可完成USB通信。
22.2.3 主函數(shù)編寫
#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 ;                                            //支持的磁盤個(gè)數(shù)
int main()
{
  u8 USB_STA, Divece_STA, tct=0, offline_cnt=0;
   STM32_Clock_Init( 9 ) ;                                        //系統(tǒng)時(shí)鐘設(shè)置
  SysTick_Init( 72 ) ;                                        //延時(shí)初始化
  USART1_Init( 72, 115200 ) ;                                      //串口初始化為115200
  LCD_Init() ;                                            //初始化LCD
  W25QXX_Init() ;                                            //初始化W25Q128
  my_mem_init( SRAMIN ) ;                                        //初始化內(nèi)部內(nèi)存池
  //初始化SD卡
  if( SD_Init() )
    Max_Lun = 0 ;                                          //SD卡錯(cuò)誤,則僅只有一個(gè)磁盤
  //SD 卡正常
  else
  {
    Mass_Memory_Size[ 1 ] = SDCardInfo.CardCapacity ;                        //得到SD卡容量(字節(jié)),當(dāng)SD卡容量超過4G的時(shí)候,需要用到兩個(gè)u32來表示
    Mass_Block_Size[ 1 ] = 512 ;                                  //因?yàn)槲覀冊贗nit里面設(shè)置了SD卡的操作字節(jié)為512個(gè),所以這里一定是512個(gè)字節(jié)
    Mass_Block_Count[ 1 ] = Mass_Memory_Size[ 1 ]/Mass_Block_Size[ 1 ] ;
  }
  Mass_Memory_Size[ 0 ] = 1024*1024*12 ;                                //前12M字節(jié)
  Mass_Block_Size[ 0 ] = 512 ;                                    //設(shè)置SPI FLASH的操作扇區(qū)大小為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數(shù)據(jù)緩存區(qū)申請內(nèi)存
  Bulk_Data_Buff = mymalloc( SRAMIN, BULK_MAX_PACKET_SIZE ) ;                      //申請內(nèi)存
   //USB配置
   USB_Interrupts_Config() ;
   Set_USBClock() ;
   USB_Init() ;
  delay_ms( 1800 ) ;
   while(1)
  {
    delay_ms( 1 ) ;
    //狀態(tài)改變了
    if( USB_STA!=USB_STATUS_REG )
    {                  
      LCD_ShowString( 30, 30, "              " ) ;                        //清除顯示
      //正在寫
      if( USB_STATUS_REG&0x01 )
        LCD_ShowString( 30, 30, "USB Writing..." ) ;                      //提示USB正在寫入數(shù)據(jù)
      //正在讀
      if( USB_STATUS_REG&0x02 )
        LCD_ShowString( 30, 30, "USB Reading..." ) ;                      //提示USB正在讀出數(shù)據(jù)
      if( USB_STATUS_REG&0x04 )
        LCD_ShowString( 30, 50, "USB Write Err " ) ;                      //提示寫入錯(cuò)誤
      else
        LCD_ShowString( 30, 50, "              " ) ;                      //清除顯示
      if( USB_STATUS_REG&0x08 )
        LCD_ShowString( 30, 80, "USB Read  Err " ) ;                      //提示讀出錯(cuò)誤
      else
        LCD_ShowString( 30, 80, "                " ) ;                      //清除顯示
      USB_STA = USB_STATUS_REG ;                                  //記錄最后的狀態(tài)
    }
    //獲取USB連接狀態(tài)
    if( Divece_STA!=bDeviceState )
    {
      if( bDeviceState==CONFIGURED )
        LCD_ShowString( 30, 10, "USB Connected    " ) ;                      //提示USB連接已經(jīng)建立
      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計(jì)數(shù)器
        bDeviceState = CONFIGURED ;
      }
      //沒有得到輪詢
      else
      {
        offline_cnt ++ ;  
        if( offline_cnt>10 )
          bDeviceState = UNCONNECTED ;                            //2s內(nèi)沒收到在線標(biāo)記,代表USB被拔出了
      }
      USB_STATUS_REG = 0 ;
    }
  }
}
- 
                                usb
                                +關(guān)注
關(guān)注
60文章
8346瀏覽量
280558 - 
                                PC
                                +關(guān)注
關(guān)注
9文章
2162瀏覽量
158299 - 
                                總線
                                +關(guān)注
關(guān)注
10文章
3008瀏覽量
91121 
發(fā)布評論請先 登錄
stm32的USB讀卡器實(shí)驗(yàn)源碼
電腦相關(guān)的讀卡器
ALIENTEK_MINISTM32_實(shí)驗(yàn)27_USB讀卡器
usb3.0和usb2.0讀卡器對比
USB讀卡器(SLAVE)應(yīng)用實(shí)驗(yàn)的詳細(xì)直流概述免費(fèi)下載
筆記本的讀卡器有何用處 讀卡器的類型介紹
STM32入門學(xué)習(xí)筆記之USB讀卡器實(shí)驗(yàn)1
    
STM32入門學(xué)習(xí)筆記之USB讀卡器實(shí)驗(yàn)2
    
          
        
        
STM32入門學(xué)習(xí)筆記之USB讀卡器實(shí)驗(yàn)3
                
 
    
    
    
           
            
            
                
            
評論