打印
[STM32F4]

【STM32F469I试用】 + 基于标准库的SD卡程序移植

[复制链接]
1838|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
     拿到F69I-DISCO后,发现KEIL V5中的STM32469I-Discovery中的代码都是用HAL库实现的,由于一直在用FWLib来写代码。
看到DISCO板子上面有现成的mini-SD卡座,索性就先用手头的SD卡来做个标准库移植。

         从官网下了stm32f4_dsp_stdperiph_libV1.6.1标准库,首先在查看板子SCH中的SD卡接口引脚为SDIO口:
     
其次,到标准库中找到对应的SD底层和控制文件:
         
   stm324x9i_eval_sdio_sd.c/.h文件是对SD卡协议的实现,包括IO口的配置、中断(SDI/DMA)、SD卡协议等的实现,是基于STM324x9I-EVAL系列开发板的。
        
   标准库的SDIO_uSDCard中文件为SD卡的运用函数,包括NVIC中断的配置、SD卡的擦除、读写块等函数的实现。

  在将各文件整合到工程中后,需要做一些改动:

   stm324x9i_eval_sdio_sd.c中有包含了stm324x9i_eval_ioe16.h这个头文件,看了下里面都是基于STM324x9I-EVAL的一些必要驱动和宏定义,
包括IC21,外部中断引脚,IO脚的寄存器定义等,一时也不知和需要的SD卡移植有何关系,但编译了下后,发现SD卡检测函数有错:
   
.h文件中看到检测脚为IO16_Pin_15
   
继续查看到其宏定义:
   
这个0x8000是什么意思?看到标准库中对GPIO_Pin_x的定义如下:
     
说明EVAL板的SD检测管脚号为15

同时查看了stm324x9i_eval_ioe16.c中的这个函数,也只是读取这个IO口的电平功能:
     
而我们DISCO板的检测脚看原理图为PG2,需要相应的修改IO口的端口和管脚号。

这样,我们可以直接自己写个读取IO电平的函数来代替:
   /**
    * @brief  Initializes the SD Detect pin MSP.
    * @param  none
    * @retval None
    */
  #if SD_USE_DETECT_PIN > 0
  static void BSP_SD_Detect_MspInit(void)
  {
        //F469I-DISCO: PG2
        GPIO_InitTypeDef        GPIO_InitStructure;
       
        RCC_AHB1PeriphClockCmd(SD_DETECT_GPIO_CLK, ENABLE);
       
        GPIO_InitStructure.GPIO_Pin = SD_DETECT_PIN;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
       
        GPIO_Init(SD_DETECT_GPIO_PORT, &GPIO_InitStructure);
       
  }     

  uint8_t SD_Detect(void)
{
   __IO uint8_t status = SD_PRESENT;

  /*!< Check GPIO to detect SD */
  //  if (IOE16_MonitorIOPin(SD_DETECT_PIN) != IOE16_BitReset)
  //  {
  //    status = SD_NOT_PRESENT;
  //  }
  #if SD_USE_DETECT_PIN > 0       
        if(GPIO_ReadInputDataBit(SD_DETECT_GPIO_PORT, SD_DETECT_PIN) != Bit_RESET)
        {
                status = SD_NOT_PRESENT;
        }          
  #endif       
        return status;
  }
同时,需要在SD_Init()中添加SD卡插入检测函数:
   
当然,你也可以直接屏蔽这个函数的功能,直接不检测SD是否插入。

   至此,基于标准库的SD卡功能函数移植基本完成,测试我用了F103中移植的野火的测试例程,
SD的初始、容量、类型、擦除及读写块的结果显示。手头的SD8G,测试结果为:
   

     需要注意的是,标准库中默认工程的外部时钟为25M,而F469I-DISCO中的外部晶振为8M,需要手动修改,具体修改在工程中的redeme.txt文档有描述。
   附上工程,如有不当地方,欢迎各位多多指正:)



STM32F4_SD.zip

691.79 KB

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

29

帖子

2

粉丝