你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32f769discovery板卡实现USB_device读卡器

[复制链接]
stary666 发布时间:2018-4-4 09:52
学习了f767的USB相关例程,本想直接移植到f769,但是f767的例程里面没有USB的PHY,不能实现高速,而f769的板载有PHY可以实现高速功能,4 r- A% U- I) a* S* I' j

; `4 j; R, n! H+ [8 d见上图,是板载的PHY芯片,可以实现USB是高速传输,) G5 ]: J; k# c/ p
既然不能直接移植,就只能通过官方的例程移植了,于是在之前实现的SD卡移植fatfs的例程的基础上继续移植实现USB-slave读卡器的功能。参考官方的相关例程,准备好了目录及相关源文件,见下图- G1 J' w; ?- a; b

2 L8 r. Y) k- P1 U; t8 [其中pcd_usb.c文件是转化的官方例程的stm32f7xx_hal_pcd.c和stm32f7xx_ll_usb.c及相关的头文件而来的usb相关配置及操作的函数,就不一一介绍了。
$ x2 p0 g# Q2 z; N# D% l下面主要讲解一下usbd_conf.c和usbd_storage.c。而usbd_desc.c这个文件本就是官方为配置板卡的,所以不用任何改动即可。" W$ N) N$ p  s  Y) @- e- ]
usbd_conf.c里面需要改动的有HAL_PCD_MspInit()函数,里面是USB相关的IO口配置及初始化。  t0 ~% X- _( \* M3 J# _" C

2 Y$ _1 P6 e& O/ o# V7 F0 @, h  [  m  
& V& Z6 C1 m6 y$ r    /* Configure USB FS GPIOs */6 Y& ?0 d9 B/ l- A9 l2 F2 F
: s, y$ ^& g$ ]% @6 h
    *(uint32_t *)0x40023830 |= 7<<0 | 3<< 7;
4 N% x6 B  h7 U( O) l     /* CLK */6 W" ?) F, G, z) w, H) A
    GPIO_Set(GPIOA,PIN3|PIN5,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_NONE);//PA9,PA10,复用功能,上拉输出: R+ K$ N! \. ]+ @$ ~1 F7 Q5 d2 h
         GPIO_AF_Set(GPIOA,3,10);        //PA3. ]: d/ ^" \$ t( B3 I* d
         GPIO_AF_Set(GPIOA,5,10);        //PA5' E' o2 D7 N* X+ h# y
/* D1 D2 D3 D4 D5 D6 D7 */' K8 p& ]8 ^0 A8 b1 ?) b* f
     GPIO_Set(GPIOB,PIN0|PIN1|PIN5|PIN10|PIN11|PIN12|PIN13,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_NONE);//PA9,PA10,复用功能,上拉输出
  }: m- \/ B/ |% \8 y" e         GPIO_AF_Set(GPIOB,0,10);        //PA3
+ S* V. k$ R+ q! s2 h2 M         GPIO_AF_Set(GPIOB,1,10);        //PA5
  q1 p. j3 J( C9 }* K8 F( T    GPIO_AF_Set(GPIOB,5,10);        //PA5: z* d* z: D: |+ U% p; R
    GPIO_AF_Set(GPIOB,10,10);        //PA5
6 c7 I" [) n3 P9 c& e6 E    GPIO_AF_Set(GPIOB,11,10);        //PA5
6 j/ S, t: _7 m0 v; E  S    GPIO_AF_Set(GPIOB,12,10);        //PA5
) _3 P6 h( O# d3 X( a$ ^& h    GPIO_AF_Set(GPIOB,13,10);        //PA5& Q" [. V# A, a: W# O
/* STP */0 X- \2 @( {) G
    GPIO_Set(GPIOC,PIN0,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_NONE);//PA9,PA10,复用功能,上拉输出
& k' w7 g% r" L  B         GPIO_AF_Set(GPIOC,0,10);        //PA3
7 I( V/ {3 ?" z3 ^% {/* NXT */& n0 \; {7 d+ E
    GPIO_Set(GPIOH,PIN4,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_NONE);//PA9,PA10,复用功能,上拉输出. p' I0 H! R8 l8 y$ U# P
         GPIO_AF_Set(GPIOH,4,10);        //PA3, `4 N; ~& h; C' }$ D3 j: E
/* DIR */. v$ R1 f3 [: `- n$ |
    GPIO_Set(GPIOI,PIN11,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_NONE);//PA9,PA10,复用功能,上拉输出9 D' `8 Q) [4 t8 O5 F
         GPIO_AF_Set(GPIOI,11,10);        //PA39 w# r7 N* d4 p0 e& c
' F7 q8 H5 Q7 l! N/ w+ e
    /* Enable USB HS Clocks */
4 [. u# p# P! `8 b2 ~& a) F    *(uint32_t *)0x40023830 |= 3<< 29;
2 p+ h, x! Z: j0 m+ F4 |( N    prioritygroup = NVIC_GetPriorityGrouping();
5 H5 u( l, i( W% J2 l   
$ }: i: a( z& W* g2 L    /* Set USBHS Interrupt to the lowest priority */
& b$ O" T* U( Y" Q* N% v    NVIC_SetPriority(OTG_HS_IRQn, NVIC_EncodePriority(prioritygroup, 0x0F, 0));
7 k, t+ @, z: |. b4 j/ G9 E  s" h   
. V' n: X$ }# x8 o* a8 W' V    /* Enable USBHS Interrupt */
0 ^9 q2 K, m( y  I% l6 X' t    NVIC_EnableIRQ(OTG_HS_IRQn);

. g* V- J8 p. A* g- g8 ^里面有相关的注释,不用过多讲解,其他的函数不需要改动,

5 \8 e1 @5 X1 a9 N+ E在usbd_storage.c里面需要改动的有* R4 N2 ?( w  N1 |7 S& U
STORAGE_GetCapacity()函数按下面更改3 L! e4 l) ?3 k  g
int8_t STORAGE_GetCapacity(uint8_t lun, uint32_t *block_num, uint16_t *block_size)
( h+ g8 N' w( V8 M. x) r5 n; e' I( I{
. I' v: w7 [7 D% x( l  SD_CardInfo info;- {5 \4 U5 G8 ?; e( {( \
  int8_t ret = -1;  * {5 l2 G1 {, ^6 \* X# {
  
  a8 c2 v+ L; T3 w9 v# }3 K  1 V8 v# \2 n, @5 v. H  M
    SD_GetCardInfo(&info);4 i% l3 X# k: S9 s
   
# ]+ l+ _6 t( `2 T' v. j  b( U   
5 O9 H" ~/ L  v    ret = 0;
) m4 Q; _) v0 ^7 j9 k( C
" F6 k7 C9 M: U. i. q+ {8 W: {2 ]  return ret;2 B# G& V9 ^3 ?! ?
}

* h( _7 ~- `9 O' o; {1 Q* v0 E1 KSTORAGE_IsReady()函数按下面更改

7 R3 o: n: b( Z2 |7 @
int8_t STORAGE_IsReady(uint8_t lun)/ N4 M; y" J! C" K9 P
{/ _* e9 u9 K* v
  static int8_t prev_status = 0;8 s4 E5 y! N1 z  y6 g
  int8_t ret = -1;; F. I/ |1 y% V3 o8 U& o8 I
  - {" N+ m6 O' |; A7 G& f. A
/ ?+ r7 _" o" o) t5 f( t: r# c* U
    if(prev_status < 0)) N4 V2 o4 S  [7 e5 R3 w: P( m
    {( _$ @" ^$ T1 u) r( y
      sdcard_init();& J' }# u& N( z- A2 R* A
      prev_status = 0;
; i4 p: h- V$ Z! s# V+ ]      + h( I1 L) ?% g0 u  F' k
    }; T) q, F! l5 P* P% Z% P8 w7 n
   . w/ w) K: K# r( u3 L4 Y/ {

9 }0 I* s9 B. d  else if(prev_status == 0)
5 S/ l  I' A) K5 {6 }8 P6 q5 F5 m  {, P' F+ M6 j2 [2 E7 K7 ]# ?6 q6 G( m
    prev_status = -1;
* F! ^1 _) ^# Q, v  }1 a" |  L( z' @& f( p
  return ret;: K0 X& q( v: i% Z, S
}
. V# T- L1 p7 d4 t( ?
STORAGE_Read()函数按下面更改

2 o# S  z8 _9 m1 x5 `/ m9 h
int8_t STORAGE_Read(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
" a; {& u# z+ D- G{
% x; T* ]5 s' S: b4 @, T7 \/ E) A, `  int8_t ret = -1;  
5 Y/ v0 g! ?# Y; ?& z, E; p$ n  & f7 W& ?8 H% H2 V' _

6 Q; C( b. A: L$ S$ A    SD_ReadBlocks((uint8_t *)buf, blk_addr, blk_len, 1000);
- `1 p5 _, O9 R- q    ret = 0;6 I! c- Z" `; ?* ^0 |
7 M! m) B- K* h/ ^
  return ret;
! T2 q- u" C" b}

9 t  E1 T% o! |. lSTORAGE_Write()函数按下面更改
6 r8 Q" i' W# Q. ?
  • 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;
  • }! u( V9 F3 G5 y1 r# r
1 M6 v7 A$ U9 o, q" T
[color=rgb(51, 102, 153) !important]复制代码

; y% c% B2 ^7 Y. J; B- U好了,全部更改完成,编译通过,可以增加在main函数里面的初始化了

5 E( L$ @( M# s, x, P  \0 B2 i直接把官方例程中的代码拷贝过来即可7 }" i3 a0 W! s" h& g
  • /* 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);
    7 H# }" }7 \: z  M4 m0 U, f; Z' ~/ u
8 @+ W4 `1 l" G5 \! A
[color=rgb(51, 102, 153) !important]复制代码
+ J" {$ X* S+ O! a. z1 D
编译完成,下载,在设备管理器会出现如下

1 B0 ]! x2 _5 N2 i% } 4 v# T& l; L+ t% ?5 U' k
其中便携设备的H盘,磁盘驱动器的STM Product USB Device还有通用串行总线控制器的USB大容量存储设备,说明移植成功,和直接下载官方例程是一样的效果。
1 C4 i  L( O6 w
+ |, H: B% {+ ^$ Z9 H+ b9 B$ I. |! A) ^
                        发贴于2018年4月4日
6 Q7 [7 {7 I! Q: V' `- v

评分

参与人数 1 ST金币 +10 蝴蝶豆 +1 收起 理由
Inc_brza + 10 + 1

查看全部评分

收藏 评论5 发布时间:2018-4-4 09:52

举报

5个回答
埃斯提爱慕 回答时间:2018-4-4 16:48:15
提示: 作者被禁止或删除 内容自动屏蔽
stary666 回答时间:2018-4-4 17:56:01
Inc_brza 回答时间:2018-4-4 18:19:35
谢谢楼主,还请楼主编辑下格式
stary666 回答时间:2018-4-5 10:48:26
有时间整理一下
zero99 回答时间:2018-4-17 14:47:13
感谢分享,请汇总到4月技术原创
2 G- L" }# r3 r4 khttps://www.stmcu.org.cn/module/forum/thread-615497-1-1.html
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版