在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

STM32入門學習筆記之USB讀卡器實驗3

jf_78858299 ? 來源:滑小稽筆記 ? 作者:電子技術園地 ? 2023-02-16 16:00 ? 次閱讀

(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
    usb
    +關注

    關注

    60

    文章

    7991

    瀏覽量

    266368
  • PC
    PC
    +關注

    關注

    9

    文章

    2110

    瀏覽量

    154783
  • 總線
    +關注

    關注

    10

    文章

    2908

    瀏覽量

    88473
收藏 人收藏

    評論

    相關推薦

    STM32 SD-USB讀卡器實驗(神舟I號)

    STM32 SD-USB讀卡器實驗(神舟I號
    發表于 03-21 15:20

    stm32USB讀卡器實驗源碼

    ***_bot.h"http://ALIENTEK戰艦STM32開發板實驗50//USB讀卡器 實驗//設置USB
    發表于 07-04 02:29

    電腦相關的讀卡器

    ,SM卡讀卡器,PCMICA讀卡器和記憶棒讀卡器。此外,還有一個雙插槽讀卡器,可同時支持兩個或更多卡。此外,根據端口類型,讀卡器可分為三類:
    發表于 09-16 16:51

    usb讀卡器萬能驅動下載

    usb讀卡器萬能驅動下載
    發表于 01-12 10:15 ?451次下載

    讀卡器的接口類型

    讀卡器的接口類型              接口類型是指讀卡器與電腦主機之間的連接方式和類型。目前讀卡器都是采用
    發表于 01-09 15:06 ?4459次閱讀

    ALIENTEK_MINISTM32_實驗27_USB讀卡器

    ALIENTEK MINISTM32 實驗27 USB讀卡器,很好的學習資料,快來下載吧
    發表于 02-19 11:41 ?12次下載

    基于STM32RFID的讀卡器資料(全套完整)

    基于STM32RFID的讀卡器資料(全套完整),吧友提供,我只是打包后上傳,謝謝下載
    發表于 07-01 17:35 ?718次下載

    基于STM32USB讀卡器的設計

    基于STM32USB讀卡器的設計
    發表于 09-25 11:11 ?29次下載
    基于<b class='flag-5'>STM32</b>的<b class='flag-5'>USB</b><b class='flag-5'>讀卡器</b>的設計

    基于Cortex_M3的智能卡USB讀卡器設計

    基于Cortex_M3的智能卡USB讀卡器設計
    發表于 09-29 10:04 ?4次下載
    基于Cortex_M<b class='flag-5'>3</b>的智能卡<b class='flag-5'>USB</b><b class='flag-5'>讀卡器</b>設計

    usb3.0和usb2.0讀卡器對比

    手里有個品勝的USB2.0讀卡器,電腦配置更新之后帶有3.0接口,所有買了個3.0的讀卡器,選來選去感覺還是螃蟹芯片好些,入了一個“川宇C396”,之前有個老的8G內存卡。還有個前年買了一個威剛
    發表于 05-15 16:09 ?2.5w次閱讀

    USB讀卡器(SLAVE)應用實驗的詳細直流概述免費下載

    本文檔的主要內容詳細技術的是USB讀卡器(SLAVE)應用實驗的詳細資料概述免費下載。
    發表于 09-11 08:00 ?4次下載

    筆記本的讀卡器有何用處 讀卡器的類型介紹

    曾幾何時,多合一讀卡器筆記本身上的標配,可以方便我們讀取數碼相機、行車記錄儀等數碼產品內置存儲卡中的數據。然而,如今筆記本領域讀卡器的境遇卻發生了變化。 漸被遺忘的插槽 隨著
    的頭像 發表于 01-24 10:48 ?1.3w次閱讀

    UM1799_STM32Nucleo的NFC讀卡器入門

    UM1799_STM32Nucleo的NFC讀卡器入門
    發表于 11-22 19:25 ?3次下載
    UM1799_<b class='flag-5'>STM32</b>Nucleo的NFC<b class='flag-5'>讀卡器</b><b class='flag-5'>入門</b>

    STM32入門學習筆記USB讀卡器實驗1

    USB是英文Universal Serial BUS(通用串行總線)的縮寫,是一個外部總線標準,用于規范電腦與外部設備的連接和通訊。是應用在PC領域的接口技術。USB接口支持設備的即插即用和熱插拔功能。
    的頭像 發表于 02-16 15:59 ?2938次閱讀
    <b class='flag-5'>STM32</b><b class='flag-5'>入門</b><b class='flag-5'>學習</b><b class='flag-5'>筆記</b><b class='flag-5'>之</b><b class='flag-5'>USB</b><b class='flag-5'>讀卡器</b><b class='flag-5'>實驗</b>1

    基于STM32單片機USB讀卡器使用庫文件設計源代碼

    基于STM32單片機USB讀卡器使用庫文件設計源代碼
    發表于 04-26 14:53 ?4次下載
    主站蜘蛛池模板: 久久综合色播 | 国产在线a不卡免费视频 | 艹逼视频免费看 | 福利视频免费看 | 免费一级特黄特色大片在线观看 | 一级毛片看真人在线视频 | 婷婷毛片 | 91国内视频 | 久久国产成人精品国产成人亚洲 | 三级视频中文字幕 | 性叉叉 | 国模人体一区二区三区 | 爽好舒服快给老师 | 日本黄色大片免费看 | 伊人亚洲综合网成人 | 操的好爽 | 日日噜噜爽爽狠狠视频 | 一级日本大片免费观看视频 | 男女交性动态免费视频 | 久久天天躁狠狠躁夜夜躁综合 | 日韩a无吗一区二区三区 | 可以免费看黄的网站 | 在线播放91灌醉迷j高跟美女 | 午夜肉伦伦影院 | 二级黄的全免费视频 | 理论在线视频 | 免费黄色福利视频 | 亚欧洲乱码专区视频 | 天天做天天爱天天干 | 四虎永久在线精品影院 | 网站在线观看你懂的 | 色88888久久久久久影院 | 又黄又爽又猛大片录像 | 亚洲一区中文 | 成人黄色一级片 | 久久天天干 | 亚洲 欧美 视频 | 天天在线天天综合网色 | 欧美超级碰碰 | 欧美黄色性 | 求网址你懂的手机在线观看网站 |