查看: 2789|回复: 0

[原创] stm32f769discovery板卡实现USB_device读卡器

[复制链接]
  • TA的每日心情
    奋斗
    2021-7-30 11:40
  • 签到天数: 1792 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    发表于 2018-4-4 09:52:27 | 显示全部楼层 |阅读模式
    分享到:
    学习了f767的USB相关例程,本想直接移植到f769,但是f767的例程里面没有USB的PHY,不能实现高速,而f769的板载有PHY可以实现高速功能,

    见上图,是板载的PHY芯片,可以实现USB是高速传输,
    既然不能直接移植,就只能通过官方的例程移植了,于是在之前实现的SD卡移植fatfs的例程的基础上继续移植实现USB-slave读卡器的功能。参考官方的相关例程,准备好了目录及相关源文件,见下图

    其中pcd_usb.c文件是转化的官方例程的stm32f7xx_hal_pcd.c和stm32f7xx_ll_usb.c及相关的头文件而来的usb相关配置及操作的函数,就不一一介绍了。
    下面主要讲解一下usbd_conf.c和usbd_storage.c。而usbd_desc.c这个文件本就是官方为配置板卡的,所以不用任何改动即可。
    usbd_conf.c里面需要改动的有HAL_PCD_MspInit()函数,里面是USB相关的IO口配置及初始化。

      
        /* Configure USB FS GPIOs */

        *(uint32_t *)0x40023830 |= 7<<0 | 3<< 7;
         /* CLK */
        GPIO_Set(GPIOA,PIN3|PIN5,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_NONE);//PA9,PA10,复用功能,上拉输出
             GPIO_AF_Set(GPIOA,3,10);        //PA3
             GPIO_AF_Set(GPIOA,5,10);        //PA5
    /* D1 D2 D3 D4 D5 D6 D7 */
         GPIO_Set(GPIOB,PIN0|PIN1|PIN5|PIN10|PIN11|PIN12|PIN13,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_NONE);//PA9,PA10,复用功能,上拉输出
             GPIO_AF_Set(GPIOB,0,10);        //PA3
             GPIO_AF_Set(GPIOB,1,10);        //PA5
        GPIO_AF_Set(GPIOB,5,10);        //PA5
        GPIO_AF_Set(GPIOB,10,10);        //PA5
        GPIO_AF_Set(GPIOB,11,10);        //PA5
        GPIO_AF_Set(GPIOB,12,10);        //PA5
        GPIO_AF_Set(GPIOB,13,10);        //PA5
    /* STP */
        GPIO_Set(GPIOC,PIN0,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_NONE);//PA9,PA10,复用功能,上拉输出
             GPIO_AF_Set(GPIOC,0,10);        //PA3
    /* NXT */
        GPIO_Set(GPIOH,PIN4,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_NONE);//PA9,PA10,复用功能,上拉输出
             GPIO_AF_Set(GPIOH,4,10);        //PA3
    /* DIR */
        GPIO_Set(GPIOI,PIN11,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_NONE);//PA9,PA10,复用功能,上拉输出
             GPIO_AF_Set(GPIOI,11,10);        //PA3

        /* Enable USB HS Clocks */
        *(uint32_t *)0x40023830 |= 3<< 29;
        prioritygroup = NVIC_GetPriorityGrouping();
       
        /* Set USBHS Interrupt to the lowest priority */
        NVIC_SetPriority(OTG_HS_IRQn, NVIC_EncodePriority(prioritygroup, 0x0F, 0));
       
        /* Enable USBHS Interrupt */
        NVIC_EnableIRQ(OTG_HS_IRQn);

    里面有相关的注释,不用过多讲解,其他的函数不需要改动,

    在usbd_storage.c里面需要改动的有
    STORAGE_GetCapacity()函数按下面更改
    int8_t STORAGE_GetCapacity(uint8_t lun, uint32_t *block_num, uint16_t *block_size)
    {
      SD_CardInfo info;
      int8_t ret = -1;  
      
      
        SD_GetCardInfo(&info);
       
       
        ret = 0;

      return ret;
    }

    STORAGE_IsReady()函数按下面更改

    int8_t STORAGE_IsReady(uint8_t lun)
    {
      static int8_t prev_status = 0;
      int8_t ret = -1;
      

        if(prev_status < 0)
        {
          sdcard_init();
          prev_status = 0;
          
        }
       

      else if(prev_status == 0)
      {
        prev_status = -1;
      }
      return ret;
    }

    STORAGE_Read()函数按下面更改

    int8_t STORAGE_Read(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
    {
      int8_t ret = -1;  
      

        SD_ReadBlocks((uint8_t *)buf, blk_addr, blk_len, 1000);
        ret = 0;

      return ret;
    }

    STORAGE_Write()函数按下面更改

    • int8_t STORAGE_Write(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
    • {
    •   int8_t ret = -1;
    •     SD_WriteBlocks((uint8_t *)buf, blk_addr, blk_len, 1000);
    •     ret = 0;
    •   return ret;
    • }

    [color=rgb(51, 102, 153) !important]复制代码

    好了,全部更改完成,编译通过,可以增加在main函数里面的初始化了

    直接把官方例程中的代码拷贝过来即可
    • /* Init Device Library */
    •   USBD_Init(&USBD_Device, &MSC_Desc, 0);
    •   /* Add Supported Class */
    •   USBD_RegisterClass(&USBD_Device, USBD_MSC_CLASS);
    •   /* Add Storage callbacks for MSC Class */
    •   USBD_MSC_RegisterStorage(&USBD_Device, &USBD_DISK_fops);
    •   /* Start Device Process */
    •   USBD_Start(&USBD_Device);

    [color=rgb(51, 102, 153) !important]复制代码

    编译完成,下载,在设备管理器会出现如下


    其中便携设备的H盘,磁盘驱动器的STM Product USB Device还有通用串行总线控制器的USB大容量存储设备,说明移植成功,和直接下载官方例程是一样的效果。


                            发贴于2018年4月4日
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条



    手机版|小黑屋|与非网

    GMT+8, 2025-1-12 19:08 , Processed in 0.124023 second(s), 15 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.