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

stm32f769 寄存器配置SD卡驱动

[复制链接]
stary666 发布时间:2018-3-9 10:58
最近在研究Linux过程中有点插曲,先不表了,于是就想着把SD卡研究一下,这个以前也没有搞过,找了stm32f767的例程,在此基础上更改了一下,可以在stm32f769上使用,就开始了SD卡的研究,个人钟爱寄存器配置的,没办法,就是对ST提供的库不感冒,有相同癖好的进来探讨,闲言少叙,进入正题。! i  \6 F  f+ h- F8 W" ^
看了f767板子的寄存器版本的指导书,正好也是和STM32F769DISCOVERY电路一样,都是非SPI接口的,可以参考其例程了,于是边参考st官方的例程STM32F769I-Discovery\Applications\Display\LCD_PicturesFromSDCard,边参考f767的例程,比较着修改,+ R" m2 C7 m9 N; d9 j& \0 B
先看看电路图
' [; |& r1 e0 R6 W& j* w6 v
# A  o' Y/ h2 G  C$ p对应的IO分别是PG9,PG10,PB3,PB4,PD6,PD7,PI15+ `9 V' x* \, t) f
于是开始配置IO; n% L* V5 t- W5 }* B
*(uint32_t *)0x40023830 |=  0x14a; //使能PORTB\D\G\I时钟 + \+ p5 \' M% }/ r9 p/ p/ P
    *(uint32_t *)0x40023830 |=  0x400000; //使能dma2时钟
5 [, C5 S- p( p8 m9 z+ U, X5 L    *(uint32_t *)0x40023844 |= 0x80;//SDMMC2时钟使能- N; R3 K; g6 f% Q7 D
    *(uint32_t *)0x40023824 |= 0x80;//SDMMC2复位
% ]& ^% ~8 e; Y% _' F8 Z        GPIO_Set(GPIOB,PIN3|PIN4,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU); //PB3,PB4设置
% ]- ]$ e. C0 M; P9 B: ^6 j0 ^        GPIO_AF_Set(GPIOB,3,10);        //PB3,AF100 a' Q9 |2 F8 ^
    GPIO_AF_Set(GPIOB,4,10);        //PB4,AF10
. e/ m) S' U& f* u/ \    GPIO_Set(GPIOD,PIN6|PIN7,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU); //PB3,PB4设置
6 Z# q- w8 O. d, g7 j/ C! M; g        GPIO_AF_Set(GPIOD,6,11);        //PB6,AF11
6 P* ~  H/ H; \, `    GPIO_AF_Set(GPIOD,7,11);        //PB7,AF11
9 ~3 c; v! v- T  y7 v7 \) Y    GPIO_Set(GPIOG,PIN9|PIN10,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU); //PB3,PB4设置' y- ~4 x3 k( n  g- g
        GPIO_AF_Set(GPIOG,9,11);        //PB9,AF11
) x$ |0 Z3 Q  _$ [9 y; C- U    GPIO_AF_Set(GPIOG,10,11);        //PB10,AF114 f) u5 }. _. U- Z1 H# A; d$ _5 r
    GPIO_Set(GPIOI,PIN15,GPIO_MODE_IN,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU); //PI15设置        
! N+ O& \+ ?4 O0 b2 P    *(uint32_t *)0x40023824 &= ~(0x80);//SDMMC2复位$ p) \' Y& V1 u/ |% |2 v! D
这里是在f767的模板基础上改的,所以没有完全改成纯寄存器版本的,这个后续研究,然后再发帖。) [( J# X2 V. o! F, d  k  {, w$ r
IO配置完成后,开始清理SDMMC的所有寄存器
$ k9 t6 Q! e. X9 Y* L- s//SDMMC外设寄存器设置为默认值                           
" a( U; _1 o! I" E( |        SDMMC2->POWER=0x00000000;
* U* x" Y/ j6 b6 D" \& M3 @5 I8 c        SDMMC2->CLKCR=0x00000000;
) X, w0 ]% t5 ~        SDMMC2->ARG=0x00000000;
" ]7 l: z) U3 V) b$ I8 G# M4 j( h        SDMMC2->CMD=0x00000000;" F' }  w! ~& p. C6 m
        SDMMC2->DTIMER=0x00000000;) v7 v8 N; U, c/ w
        SDMMC2->DLEN=0x00000000;
' |2 W8 |# x7 i7 `- f4 Y# @" B        SDMMC2->DCTRL=0x00000000;6 o, P, S2 x) R) \  Z6 Z, z
        SDMMC2->ICR=0x00C007FF;
6 f% e. D' p5 U. F# ?* U        SDMMC2->MASK=0x00000000;         
3 J, Y5 V: m4 l2 |! h& M增加SD卡的中断配置1 m$ G# \7 L8 M7 Z% _- T7 j
        MY_NVIC_Init(0,0,SDMMC2_IRQn,2);        //SDMMC中断配置: C* M/ i8 h* r) S. h
完成后,开始进行上电操作,
% W( n( u/ S+ H) o' eSD_PowerON();( u% D. `1 U6 e7 s% e5 B1 b1 Y% A
SD_InitializeCards();                        //初始化SD卡3 J3 ?( z) ^! T1 z$ w/ {1 I, n
SD_GetCardInfo(&SDCardInfo);        //获取卡信息
- Y9 o0 E" ^) x* U3 kSD_SelectDeselect((u32)(SDCardInfo.RCA<<16));//选中SD卡
1 X' O( ^) }) I4 OSD_EnableWideBusOperation(1);        //4位宽度,如果是MMC卡,则不能用4位模式
  N* F) U7 I: Q: w3 v
& t4 B) Z) c, S5 B% Y0 B4 f9 H以上实现了检测SD卡的类型,具体设置SD卡的时钟频率。6 v4 P& u& K- [0 _  s/ [
if(SDCardInfo.CardType==STD_CAPACITY_SD_CARD_V1_1||SDCardInfo.CardType==STD_CAPACITY_SD_CARD_V2_0)
4 A$ V9 m2 w) c& e- {+ g{
6 P4 r5 @) \/ t3 d6 ~+ V9 [        clkdiv=SDMMC_TRANSFER_CLK_DIV+2;        //V1.1/V2.0卡,设置最高48/4=12Mhz
6 q/ I# H. ~' z) d, @}else clkdiv=SDMMC_TRANSFER_CLK_DIV;        //SDHC等其他卡,设置最高48/2=24Mhz( V  V/ _* U  l& ?! h4 z+ R# N
        SDMMC_Clock_Set(clkdiv);        //设置时钟频率,SDMMC时钟计算公式:SDMMC_CK时钟=SDMMCCLK/[clkdiv+2];其中,SDMMCCLK固定为48Mhz / J! F+ s) i9 B5 e6 h
暂且设置成查询模式,后续再改成中断模式. t* [6 d' K+ p$ L* g! V: f
SD_SetDeviceMode(SD_POLLING_MODE);//设置为查询模式
1 a3 M+ _7 I1 B  j( E9 I, W: K0 [+ L& _  E7 x  O) R! C
初始化完成后,在main函数下添加以下代码实现SD卡的初始化操作
! ^( i: c# k  V+ v$ Zwhile(sdcard_init())//检测不到SD卡
" \# S! D- L  \2 j; Y{  P6 ?7 ~/ i$ Q# J
                delay_ms(500);% f4 k6 N( y) L! g9 V# z) c
                LED0(led0sta^=1);//DS0闪烁8 c, N" ^/ b4 ]8 i% o/ y+ s
}
- `; b3 ~4 {( @( @+ ~# g
0 }- Q$ Z% @7 b1 Q/ M* a' `# h6 m+ d在while(1)添加代码,检查SD卡初始化是否完成,代码是否继续运行
! S" F5 F* n6 b+ W{
& n0 G( O! e: F* E5 Cdelay_ms(500);
* g8 q$ a3 G; V2 V% D9 Lprintf("\r\n sd is ok!:\r\n");
: F' x5 ^. a$ x, a! l}8 X: S: ]! i- P7 }2 X* z
果然串口一直在打印输出6 Z5 b: U0 y) D8 f

( z# Q6 K: p5 R  h9 g说明SD卡初始化完成了
- b. l* J- f; y/ d; }详细的代码说明,后面会陆续有新帖,喜欢寄存器配置的网友,自行关注!- B! o" v2 N+ `

) d9 M" P! P! ]" {" ]) E6 i" p- m5 |' y( u. B  f

3 x- x! o4 B0 J! r% w; |                                                      发帖与2018年3月9日: L1 a4 C* w7 M1 e) \& E- f' }4 F# h
( d7 p3 E# C3 Z* [% }% k
: @) u1 K& {9 Y* {  \$ k$ s) j  G2 K

5 V1 C$ y+ t: G9 Z- a6 C4 q6 E% H7 Q! P, T* k
继续阅读:stm32f769 寄存器配置SD卡--打印SD卡信息! p$ g8 c9 H& n& J
赞 收藏 评论4 发布时间:2018-3-9 10:58

举报

4个回答
zero99 回答时间:2018-3-9 14:42:09
感谢分享,已汇总到3月技术原创:
$ E1 k' o, F) z; s# y& ?" A" xhttps://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$ ]& g% X- [3 [9 Q0 E% S
感谢分享,已汇总到3月技术原创:
8 I; ^- B8 P- d1 o3 i! T2 Ahttps://www.stmcu.org.cn/module/forum/thread-615031-1-1.html ...

. f9 x8 @" @& v; H( n( Mhttps://www.stmcu.org.cn/module/forum/thread-615032-1-1.html
wzl6 回答时间:2018-4-13 09:11:26
感谢分享
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版