野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10926|回复: 6

《STM32库开发实战指南》MP3例程在什么地方初始化SDIO?

[复制链接]
发表于 2015-7-30 10:35:28 | 显示全部楼层 |阅读模式
主程序:
int main(void)
{         
        SysTick_Init();                        /* 配置SysTick 为10us中断一次 */      
        USART1_Config();                 /* 配置串口1 115200 8-N-1 */       
        /* Interrupt Config,配置sdio的中断优先级, */
        NVIC_Configuration();       
        printf(" \r\n 这是一个MP3测试例程 !\r\n " );                     
        VS1003_SPI_Init();                /* MP3硬件I/O初始化 */        
        MP3_Start();                         /* MP3就绪,准备播放,在vs1003.c实现 */        
        MP3_Play();                                  /* 播放SD卡(FATFS)里面的音频文件 */                  
        /* Infinite loop */
        while (1)
        {
        }
}

但仍看不出来在哪里调用SDIO初始化来讯取SD卡。
主函数调用的几个子函数都没有发现在哪里初始化了SDIO端口。
QQ图片20150730101257.png
回复

使用道具 举报

 楼主| 发表于 2015-7-30 10:40:01 | 显示全部楼层
还有也找不到DMA在哪里初始化。
回复 支持 反对

使用道具 举报

发表于 2015-7-30 11:23:24 | 显示全部楼层
音乐播放器有用到文件系统,在使用文件系统挂载函数f_mount时会调用SDIO的初始化函数,具体可看diskio.c文件
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-7-31 10:13:54 | 显示全部楼层
亽亼 发表于 2015-7-30 11:23
音乐播放器有用到文件系统,在使用文件系统挂载函数f_mount时会调用SDIO的初始化函数,具体可看diskio.c文 ...

在ff.c查找到f_mount的函数定义,但也没发现有调用SDIO和DMA初始化的地方
函数如下:
FRESULT f_mount (
                                BYTE vol,  /* Logical drive number to be mounted/unmounted */
                                FATFS *fs  /* Pointer to new file system object (NULL for unmount)*/
                             )
                  {
                    FATFS *rfs;

                    if (vol >= _VOLUMES)  /* Check if the drive number is valid */
                       return FR_INVALID_DRIVE;
                   rfs = FatFs[vol];   /* Get current fs object */

                    if (rfs) {
                              #if _FS_SHARE
                                  clear_lock(rfs);
                              #endif
                              #if _FS_REENTRANT    /* Discard sync object of the current volume */
                                  if (!ff_del_syncobj(rfs->sobj)) return FR_INT_ERR;
                               #endif
                              rfs->fs_type = 0;  /* Clear old fs object */
                              }

                 if (fs) {
                            fs->fs_type = 0;  /* Clear new fs object */
                           #if _FS_REENTRANT    /* Create sync object for the new volume */
                              if (!ff_cre_syncobj(vol, &fs->sobj)) return FR_INT_ERR;
                          #endif
                          }
               FatFs[vol] = fs;   /* Register new fs object */

               return FR_OK;
}

回复 支持 反对

使用道具 举报

发表于 2015-7-31 11:27:36 | 显示全部楼层
diskio.c文件
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-8-4 18:33:44 | 显示全部楼层

diskio.c是有初始化SDIO的函数,
可是在f_mount()函数里,并没有发现有调用初始化SDIO的函数,


可以在网上查到
f_mount函数在FatFs模块上注册/注销一个工作区。 在使用任何其他文件函数之前,必须使用该函数为每个
卷注册一个工作区。要注销一个工作区,只要指定FileSystemObject为NULL即可,然后该工作区可以被丢
弃。
该函数只初始化给定的工作区,以及将该工作区的地址注册到内部表中,不访问磁盘I/O层。
卷装入过程是在f_mount函数后或存储介质改变后的第一次文件访问时完成的。


这个说法意思是在f_mount后面,文件访问时才会初始化SDIO?


回复 支持 反对

使用道具 举报

发表于 2015-8-4 19:13:58 | 显示全部楼层
不知道你是用哪个版本的FatFs,我用的是R0.10版本的(目前已经更新到R0.11),在 f_mount函数中会调用find_volume函数,而在find_volume函数中有一个语句:stat = disk_initialize(fs->drv);        /* Initialize the physical drive */
它会调用diskio.c文件中的初始化函数,你可以去看看,如果用R0.09版本的话好像确实是在f_mount函数中没有调用find_volume函数。
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-4-18 14:21 , Processed in 0.038620 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表