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

stm32f769 寄存器配置SD卡驱动

[复制链接]
stary666 发布时间:2018-3-9 10:58
最近在研究Linux过程中有点插曲,先不表了,于是就想着把SD卡研究一下,这个以前也没有搞过,找了stm32f767的例程,在此基础上更改了一下,可以在stm32f769上使用,就开始了SD卡的研究,个人钟爱寄存器配置的,没办法,就是对ST提供的库不感冒,有相同癖好的进来探讨,闲言少叙,进入正题。# @: ?9 M1 t) ?/ m* {
看了f767板子的寄存器版本的指导书,正好也是和STM32F769DISCOVERY电路一样,都是非SPI接口的,可以参考其例程了,于是边参考st官方的例程STM32F769I-Discovery\Applications\Display\LCD_PicturesFromSDCard,边参考f767的例程,比较着修改,
# u# C- b% Z- S- r8 @先看看电路图
. ]* G9 A0 D* B8 X+ T- m: V) E
2 B5 v0 _! v) P7 }  f3 Q+ `对应的IO分别是PG9,PG10,PB3,PB4,PD6,PD7,PI15
) _+ k  {7 n! ~# V于是开始配置IO
) [& J/ e1 j/ T*(uint32_t *)0x40023830 |=  0x14a; //使能PORTB\D\G\I时钟 " F+ q6 ?, s8 m0 c
    *(uint32_t *)0x40023830 |=  0x400000; //使能dma2时钟2 J9 k7 g: {+ i
    *(uint32_t *)0x40023844 |= 0x80;//SDMMC2时钟使能
! B$ ?. h# T# ]9 h7 r! }' q    *(uint32_t *)0x40023824 |= 0x80;//SDMMC2复位
6 Q2 h0 J+ w+ T' ]5 f; R- b        GPIO_Set(GPIOB,PIN3|PIN4,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU); //PB3,PB4设置
  h& _5 e, g) S, q: }        GPIO_AF_Set(GPIOB,3,10);        //PB3,AF108 j, g5 ^& @. M+ M- r+ c) l
    GPIO_AF_Set(GPIOB,4,10);        //PB4,AF10
! V; I, G) A4 d+ D; _+ k5 m    GPIO_Set(GPIOD,PIN6|PIN7,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU); //PB3,PB4设置
8 B: U5 ~$ \$ R8 S  O        GPIO_AF_Set(GPIOD,6,11);        //PB6,AF11
2 s* ^3 J, a8 h    GPIO_AF_Set(GPIOD,7,11);        //PB7,AF11
$ r% j5 P6 `: r, F4 L1 t# Y    GPIO_Set(GPIOG,PIN9|PIN10,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU); //PB3,PB4设置2 ^1 C! l2 a0 e& s
        GPIO_AF_Set(GPIOG,9,11);        //PB9,AF11
# M- J5 N+ l$ t! \    GPIO_AF_Set(GPIOG,10,11);        //PB10,AF11
& r; M. }! W( ~. f    GPIO_Set(GPIOI,PIN15,GPIO_MODE_IN,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU); //PI15设置        
) h, X" y; y/ ~( d7 g. N    *(uint32_t *)0x40023824 &= ~(0x80);//SDMMC2复位" W& @9 x5 K) _+ {1 w" [4 z
这里是在f767的模板基础上改的,所以没有完全改成纯寄存器版本的,这个后续研究,然后再发帖。! ^+ d/ ?7 c9 ?& p. X
IO配置完成后,开始清理SDMMC的所有寄存器
+ g- X+ _! v5 _& [! @: [, a' q+ G//SDMMC外设寄存器设置为默认值                           
' T( O) E3 r; _        SDMMC2->POWER=0x00000000;
0 I3 C, u( ]' k        SDMMC2->CLKCR=0x00000000;  @' w! @3 U0 B8 f
        SDMMC2->ARG=0x00000000;
1 b% ]. N$ ~: Y. Y% k        SDMMC2->CMD=0x00000000;* i' s: Q; G- |9 b& S. W
        SDMMC2->DTIMER=0x00000000;
" \# m( t" u3 m3 F- i- n- u        SDMMC2->DLEN=0x00000000;
( D7 {" ^  X! }1 k6 n        SDMMC2->DCTRL=0x00000000;7 Q: E4 }: `: r: x
        SDMMC2->ICR=0x00C007FF;& m; b' X, y  q% e
        SDMMC2->MASK=0x00000000;          - T- T% @: W+ n9 Q  l8 y# R1 c% }
增加SD卡的中断配置
$ S! \# ]0 Q' I+ }$ f. x6 z+ _- R) I        MY_NVIC_Init(0,0,SDMMC2_IRQn,2);        //SDMMC中断配置
0 V" y% C. Q6 u# O7 _# o' e0 E5 N, v完成后,开始进行上电操作,
" K8 q- k/ _" W7 X3 fSD_PowerON();
: T7 ~9 O+ d: w# d; X5 w7 l! ZSD_InitializeCards();                        //初始化SD卡
9 [: g# _! N6 |! ]/ L8 ]SD_GetCardInfo(&SDCardInfo);        //获取卡信息
, f3 d7 t& W7 zSD_SelectDeselect((u32)(SDCardInfo.RCA<<16));//选中SD卡% c9 F' V! N# h( {  _, n. t
SD_EnableWideBusOperation(1);        //4位宽度,如果是MMC卡,则不能用4位模式 , J. R& X* o# d3 W# }

; J6 F5 P, c: k, U* N! B以上实现了检测SD卡的类型,具体设置SD卡的时钟频率。
+ r5 V8 z# k( [if(SDCardInfo.CardType==STD_CAPACITY_SD_CARD_V1_1||SDCardInfo.CardType==STD_CAPACITY_SD_CARD_V2_0)1 c) L6 o0 p0 W7 J2 A  u+ P2 P
{7 S3 H( h9 [2 \/ Q
        clkdiv=SDMMC_TRANSFER_CLK_DIV+2;        //V1.1/V2.0卡,设置最高48/4=12Mhz+ Z, P/ V# k' v" e4 F0 H. O, g0 {
}else clkdiv=SDMMC_TRANSFER_CLK_DIV;        //SDHC等其他卡,设置最高48/2=24Mhz
2 E) l- g; g% s0 m        SDMMC_Clock_Set(clkdiv);        //设置时钟频率,SDMMC时钟计算公式:SDMMC_CK时钟=SDMMCCLK/[clkdiv+2];其中,SDMMCCLK固定为48Mhz / z; `; E0 P& _; R
暂且设置成查询模式,后续再改成中断模式& W1 T, l% a$ Q7 @# T
SD_SetDeviceMode(SD_POLLING_MODE);//设置为查询模式
( I' E8 d" f& `8 c1 j& \6 S1 X* N4 i9 h9 }" u+ i. }* D9 f
初始化完成后,在main函数下添加以下代码实现SD卡的初始化操作
5 S3 T! k, R  {6 V' d' M9 |! Ywhile(sdcard_init())//检测不到SD卡' J" `9 f, a1 C. e1 s
{
+ `: D! ~  S8 B/ q4 t# y) k+ m                delay_ms(500);
0 g  W. U( E" K( n                LED0(led0sta^=1);//DS0闪烁9 n. }7 [* P  U9 K7 D1 O
}
4 W3 d2 r% s3 j2 n( ]; ^" C6 g7 R
" @, _" N) ~2 p" Q在while(1)添加代码,检查SD卡初始化是否完成,代码是否继续运行
9 h9 m$ T) x1 r6 X3 d7 [1 k{
: c- `* D- Q: x5 tdelay_ms(500);
( i! R" W% _3 d$ g. _printf("\r\n sd is ok!:\r\n");
) N) u4 X5 b" g" @9 {9 @9 N0 Q7 P}7 N4 _. S: \! H+ I# h# R+ v
果然串口一直在打印输出( W2 j& l  L, m
2 ~% f6 L  h7 N, X. [
说明SD卡初始化完成了; Z, M/ k1 P+ G2 ~1 B  b% n3 D& O
详细的代码说明,后面会陆续有新帖,喜欢寄存器配置的网友,自行关注!8 E  u: o5 ~) l) Q* ~6 M# O' y

$ _, [6 h! b3 r/ u# s1 g
3 _% p& j" ?/ v  C# }# V5 ~! {7 j! I6 \. P# R! X
                                                      发帖与2018年3月9日
. ~" `) y4 t9 d- Z0 ]6 C' z2 l, j7 o
2 {' x6 |( g# r0 r3 H* W

+ T# F6 E7 M% \5 _7 L8 s
- F' u& h' e# P- k, @3 t/ F: ^8 I$ O继续阅读:stm32f769 寄存器配置SD卡--打印SD卡信息# U" ]" f0 t: |) e" L' g) O/ F5 g
收藏 评论4 发布时间:2018-3-9 10:58

举报

4个回答
zero99 回答时间:2018-3-9 14:42:09
感谢分享,已汇总到3月技术原创:  D* G" k1 v- l& w# T' b
https://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:423 P8 S( F$ v. J# Z% f! a. F0 x9 Z. G
感谢分享,已汇总到3月技术原创:, }" `0 {+ @! \  Q0 Q; G5 ~
https://www.stmcu.org.cn/module/forum/thread-615031-1-1.html ...
6 W8 {$ Y! j, v- U
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 手机版