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

    文章

    7945

    浏览量

    264657
  • PC
    PC
    +关注

    关注

    9

    文章

    2082

    浏览量

    154205
  • 总线
    +关注

    关注

    10

    文章

    2881

    浏览量

    88085
收藏 人收藏

    评论

    相关推荐

    STM32 SD-USB读卡器实验(神舟I号)

    STM32 SD-USB读卡器实验(神舟I号
    发表于 03-21 15:20

    stm32USB读卡器实验源码

    ***_bot.h"//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 4396次阅读

    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 2820次阅读
    <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次下载