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

stm32f769 寄存器配置SD卡驱动

[复制链接]
stary666 发布时间:2018-3-9 10:58
最近在研究Linux过程中有点插曲,先不表了,于是就想着把SD卡研究一下,这个以前也没有搞过,找了stm32f767的例程,在此基础上更改了一下,可以在stm32f769上使用,就开始了SD卡的研究,个人钟爱寄存器配置的,没办法,就是对ST提供的库不感冒,有相同癖好的进来探讨,闲言少叙,进入正题。
7 b  W; i; G( Q8 `8 y6 a看了f767板子的寄存器版本的指导书,正好也是和STM32F769DISCOVERY电路一样,都是非SPI接口的,可以参考其例程了,于是边参考st官方的例程STM32F769I-Discovery\Applications\Display\LCD_PicturesFromSDCard,边参考f767的例程,比较着修改,8 @: |! n+ e) p% e6 s
先看看电路图5 ^  g$ W" P0 d1 R; @4 b! i2 f
5 q. b. O# n3 |
对应的IO分别是PG9,PG10,PB3,PB4,PD6,PD7,PI15
5 n# F' d3 }; W* n. D- o于是开始配置IO
! _9 j# \* C2 S' G1 a5 V*(uint32_t *)0x40023830 |=  0x14a; //使能PORTB\D\G\I时钟
6 B. R" d2 Y; M" g    *(uint32_t *)0x40023830 |=  0x400000; //使能dma2时钟3 |* Y: i3 c4 q% p9 E" A9 S/ T- t7 j
    *(uint32_t *)0x40023844 |= 0x80;//SDMMC2时钟使能
5 c6 ?& t% p. X% p    *(uint32_t *)0x40023824 |= 0x80;//SDMMC2复位" v& j0 q" ?1 j
        GPIO_Set(GPIOB,PIN3|PIN4,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU); //PB3,PB4设置+ K! I/ W" ]$ k/ Y
        GPIO_AF_Set(GPIOB,3,10);        //PB3,AF10
* A! H8 E8 m" `' F9 t4 B, C/ i    GPIO_AF_Set(GPIOB,4,10);        //PB4,AF10
, }! Z) X6 B( I* T- ]8 _0 c# ?' w& R    GPIO_Set(GPIOD,PIN6|PIN7,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU); //PB3,PB4设置. s) a! }; _8 L4 L2 l, W; G
        GPIO_AF_Set(GPIOD,6,11);        //PB6,AF11
; y/ a. A6 |+ d1 e    GPIO_AF_Set(GPIOD,7,11);        //PB7,AF11
: b7 O# h% [+ B( O8 O: i    GPIO_Set(GPIOG,PIN9|PIN10,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU); //PB3,PB4设置
3 i8 z$ I- R" T        GPIO_AF_Set(GPIOG,9,11);        //PB9,AF11
) o3 ^+ M- Q$ u8 T% k* v    GPIO_AF_Set(GPIOG,10,11);        //PB10,AF11
7 a8 X( T' b3 Q1 [) e    GPIO_Set(GPIOI,PIN15,GPIO_MODE_IN,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU); //PI15设置        : X9 f: Z/ |" w1 ?
    *(uint32_t *)0x40023824 &= ~(0x80);//SDMMC2复位1 b& ~3 T' H  e, b3 a+ K
这里是在f767的模板基础上改的,所以没有完全改成纯寄存器版本的,这个后续研究,然后再发帖。
9 q6 J# R# b5 I0 S9 ?+ m8 T) B# z" DIO配置完成后,开始清理SDMMC的所有寄存器
2 K$ U- P* S1 F/ }7 h# ?//SDMMC外设寄存器设置为默认值                           
/ O$ J. N% D9 ?! z4 Q  j        SDMMC2->POWER=0x00000000;
: c- D7 a% L6 T, d* T. `0 p        SDMMC2->CLKCR=0x00000000;* s& x; G9 I' s7 \, K7 C
        SDMMC2->ARG=0x00000000;
* U1 |( g% P0 C        SDMMC2->CMD=0x00000000;
, l( t# E$ \* Q8 n- e* a" N+ p; F        SDMMC2->DTIMER=0x00000000;
  M. `2 O/ R5 p        SDMMC2->DLEN=0x00000000;
# a& t1 U; n& N6 u! [$ S' Q        SDMMC2->DCTRL=0x00000000;; L' z0 V  K  ?
        SDMMC2->ICR=0x00C007FF;7 l% n6 y  ^" D( u' {6 Q
        SDMMC2->MASK=0x00000000;         
: X% Y- r$ s; I2 s增加SD卡的中断配置: ]9 |; P3 Y+ y5 [$ z, t5 \+ S
        MY_NVIC_Init(0,0,SDMMC2_IRQn,2);        //SDMMC中断配置" m) _7 Q9 S- n* N0 J, a- D
完成后,开始进行上电操作,+ A) V8 n: U  A5 }  x
SD_PowerON();
& p2 J2 S9 T, v$ B( o4 DSD_InitializeCards();                        //初始化SD卡7 m% R5 T! ^. X8 ~. d9 e
SD_GetCardInfo(&SDCardInfo);        //获取卡信息
: K; X7 e! u3 H) }& U* i9 [SD_SelectDeselect((u32)(SDCardInfo.RCA<<16));//选中SD卡
7 b) W) g/ t* R  H; LSD_EnableWideBusOperation(1);        //4位宽度,如果是MMC卡,则不能用4位模式
9 a) X( @# c) G* U* L1 I7 x: |/ j( x! P; B& U
以上实现了检测SD卡的类型,具体设置SD卡的时钟频率。
9 P. h( b% C7 o8 Fif(SDCardInfo.CardType==STD_CAPACITY_SD_CARD_V1_1||SDCardInfo.CardType==STD_CAPACITY_SD_CARD_V2_0)+ j' Y- ]% e+ a* J  @  g
{
* y$ s# m) A- H$ q5 w        clkdiv=SDMMC_TRANSFER_CLK_DIV+2;        //V1.1/V2.0卡,设置最高48/4=12Mhz
) C& x' ?0 v; b% p* @9 @5 l; @- p}else clkdiv=SDMMC_TRANSFER_CLK_DIV;        //SDHC等其他卡,设置最高48/2=24Mhz
# `9 K6 a2 p1 h' s( J' c/ F  b        SDMMC_Clock_Set(clkdiv);        //设置时钟频率,SDMMC时钟计算公式:SDMMC_CK时钟=SDMMCCLK/[clkdiv+2];其中,SDMMCCLK固定为48Mhz ) d' \3 Y% {5 O+ f- b! G6 ?
暂且设置成查询模式,后续再改成中断模式
2 h9 A5 L* D$ L( J! W+ n+ G4 S( xSD_SetDeviceMode(SD_POLLING_MODE);//设置为查询模式- Z- |6 L' k; o. H& ?
- Y; J& y. B, s- p8 o
初始化完成后,在main函数下添加以下代码实现SD卡的初始化操作
9 q, M% |/ n9 [9 J  }. fwhile(sdcard_init())//检测不到SD卡7 |" ]- v. o( ~1 ]
{
. l- o$ S5 V7 _                delay_ms(500);
$ p6 t: R; @; `, l                LED0(led0sta^=1);//DS0闪烁
- i# H8 T+ l  u5 b4 z: Z}
0 P! u/ y9 N0 g( d* ~9 O8 m
1 i* b/ e  ?( G' M8 ]$ Y8 Y在while(1)添加代码,检查SD卡初始化是否完成,代码是否继续运行- @& Y2 @5 b% Q9 C
{
1 F) i' \! l/ Q9 z2 d7 x! cdelay_ms(500);$ y! w1 P8 g  F3 l
printf("\r\n sd is ok!:\r\n");
; Q7 ]9 e' ~1 n5 A0 U}
/ j" d! ~. x4 b果然串口一直在打印输出; B' t$ ~2 a- b. ~7 L/ [( [

: S8 ^0 ]3 B! V说明SD卡初始化完成了
, X0 k* S4 E- f- X详细的代码说明,后面会陆续有新帖,喜欢寄存器配置的网友,自行关注!  A4 V3 D. n7 @& `* j# ~( B' l

4 O! L) X3 p. m- [: d' M2 ?/ w2 E4 b3 L5 v9 A4 V, i( }' G) n$ n  |
+ D  [* A. E8 D, F7 _3 P
                                                      发帖与2018年3月9日; _# ]% z' {" L! \
. I$ [) p- }, M; d% q9 G3 ]
. v; g0 g  L/ e, q6 `1 ~8 L1 D
* P9 q  @+ ]- ^- ~
* W) V) O4 p1 J, \, ~' Z; X" `
继续阅读:stm32f769 寄存器配置SD卡--打印SD卡信息
. A; v7 Z# o  c/ v& G! U; l( Y
收藏 评论4 发布时间:2018-3-9 10:58

举报

4个回答
zero99 回答时间:2018-3-9 14:42:09
感谢分享,已汇总到3月技术原创:
- @+ e3 g/ k7 c2 \+ nhttps://www.stmcu.org.cn/module/forum/thread-615031-1-1.html
stary666 回答时间:2018-3-9 14:51:20
我还有帖子要发,是后续的sd卡研究
stary666 回答时间:2018-3-9 14:52:31
zero99 发表于 2018-3-9 14:42
. i  a* e! `6 b+ f  l# R感谢分享,已汇总到3月技术原创:0 s4 I# i! W' `8 M, ~, J
https://www.stmcu.org.cn/module/forum/thread-615031-1-1.html ...
; ]# Z- Z: i& x8 u0 i/ u: K
https://www.stmcu.org.cn/module/forum/thread-615032-1-1.html
wzl6 回答时间:2018-4-13 09:11:26
感谢分享

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版