找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5376|回复: 7
打印 上一主题 下一主题
收起左侧

STM32读写SD卡的操作源码

[复制链接]
跳转到指定楼层
楼主
ID:322751 发表于 2018-5-5 14:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以前调试M3驱动LCD的时,顺便写的一个Cortex-M3读写SD卡的操作,分享给大家,参考一下。
======================================
下载方式
======================================
·SWD JTAG


======================================
程序功能
======================================
·SDIO实验


======================================
硬件连接
======================================
·将串口调试板连接到USART1接口上
·将MicroSD Card 模块连接到I2C1接口上


======================================
软件设置
======================================
·并且打开串口助手  选择好相应的COM口   如下设置
----------------
波特率 | 115200 |
----------------
数据位 |   8    |
----------------
停止位 |   1    |
----------------
校验位 | None   |
----------------
流控制 | None   |
----------------

======================================
实验现象
======================================
·串口助手输出相应信息


单片机源程序如下:
  1. /*********************************************************************************************************
  2. *
  3. * File                : main.c
  4. * Hardware Environment:
  5. * Build Environment   : RealView MDK-ARM  Version: 4.20
  6. * Version             : V1.0
  7. * By                  :
  8. *
  9. *********************************************************************************************************/

  10. /* Includes ------------------------------------------------------------------*/
  11. #include "stm32f2xx.h"
  12. #include "usart.h"
  13. #include "sdcard.h"
  14. #include <string.h>
  15. #include <stdio.h>

  16. #ifdef __GNUC__
  17.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
  18.      set to 'Yes') calls __io_putchar() */
  19.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
  20. #else
  21.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
  22. #endif /* __GNUC__ */

  23. /* Private function prototypes -----------------------------------------------*/
  24. void LED_GPIO_Configuration(void);
  25. //void USART_Configuration(void);


  26. /*******************************************************************************
  27. * Function Name  : Delay
  28. * Description    : Delay Time
  29. * Input          : - nCount: Delay Time
  30. * Output         : None
  31. * Return         : None
  32. * Attention                 : None
  33. *******************************************************************************/
  34. void  Delay (uint32_t nCount)
  35. {
  36.   for(; nCount != 0; nCount--);
  37. }


  38. unsigned char Start_Flag=0;

  39. /* Private typedef -----------------------------------------------------------*/
  40. typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus;

  41. /* Private define ------------------------------------------------------------*/
  42. #define BlockSize            512 /* Block Size in Bytes */
  43. #define BufferWordsSize      (BlockSize >> 2)

  44. #define NumberOfBlocks       2  /* For Multi Blocks operation (Read/Write) */
  45. #define MultiBufferWordsSize ((BlockSize * NumberOfBlocks) >> 2)

  46. #define Operate_Block 0

  47. /* Private macro -------------------------------------------------------------*/
  48. /* Private variables ---------------------------------------------------------*/
  49. SD_CardInfo SDCardInfo;
  50. u32 Buffer_Block_Tx[BufferWordsSize], Buffer_Block_Rx[BufferWordsSize];
  51. u32 Buffer_MultiBlock_Tx[MultiBufferWordsSize], Buffer_MultiBlock_Rx[MultiBufferWordsSize];
  52. volatile TestStatus EraseStatus = FAILED, TransferStatus1 = FAILED, TransferStatus2 = FAILED;
  53. SD_Error Status = SD_OK;
  54. ErrorStatus HSEStartUpStatus;

  55. /* Private functions ---------------------------------------------------------*/


  56. /*******************************************************************************
  57. * Function Name  : RCC_Configuration
  58. * Description    : Configures the different system clocks.
  59. * Input          : None
  60. * Output         : None
  61. * Return         : None
  62. *******************************************************************************/
  63. void RCC_Configuration(void)
  64. {   
  65.   /* RCC system reset(for debug purpose) */
  66.   RCC_DeInit();

  67.   /* Enable HSE */
  68.   RCC_HSEConfig(RCC_HSE_ON);

  69.   /* Wait till HSE is ready */
  70.   HSEStartUpStatus = RCC_WaitForHSEStartUp();

  71.   if(HSEStartUpStatus == SUCCESS)
  72.   {
  73.     /* Enable Prefetch Buffer */
  74.     FLASH_PrefetchBufferCmd(ENABLE);

  75.     /* Flash 2 wait state */
  76.     FLASH_SetLatency(FLASH_Latency_2);

  77.     /* HCLK = SYSCLK */
  78.     RCC_HCLKConfig(RCC_SYSCLK_Div1);
  79.   
  80.     /* PCLK2 = HCLK */
  81.     RCC_PCLK2Config(RCC_HCLK_Div1);

  82.     /* PCLK1 = HCLK/2 */
  83.     RCC_PCLK1Config(RCC_HCLK_Div2);

  84.     /* PLLCLK = 8MHz * 9 = 72 MHz */
  85. //    RCC_PLLConfig(RCC_PLLSource_HSE, RCC_PLLMul_9);

  86.     /* Enable PLL */
  87.     RCC_PLLCmd(ENABLE);

  88.     /* Wait till PLL is ready */
  89.     while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
  90.     {
  91.     }

  92.     /* Select PLL as system clock source */
  93.     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

  94.     /* Wait till PLL is used as system clock source */
  95.     while(RCC_GetSYSCLKSource() != 0x08)
  96.     {
  97.     }
  98.   }
  99. }

  100. /*******************************************************************************
  101. * Function Name  : NVIC_Config
  102. * Description    : Configures SDIO IRQ channel.
  103. * Input          : None
  104. * Output         : None
  105. * Return         : None
  106. *******************************************************************************/
  107. void NVIC_Configuration(void)
  108. {
  109.   NVIC_InitTypeDef NVIC_InitStructure;

  110.   /* Configure the NVIC Preemption Priority Bits */
  111.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

  112.   NVIC_InitStructure.NVIC_IRQChannel = SDIO_IRQn;
  113.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  114.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  115.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  116.   NVIC_Init(&NVIC_InitStructure);


  117. }


  118. /*******************************************************************************
  119. * Function Name  : main
  120. * Description    : Main program
  121. * Input          : None
  122. * Output         : None
  123. * Return         : None
  124. * Attention                 : None
  125. *******************************************************************************/
  126. int main(void)
  127. {
  128.   u32 i;
  129.   RCC_Configuration();
  130.   USART_Configuration();   
  131.   NVIC_Configuration();
  132.                
  133. //  while(!Start_Flag);
  134.         
  135.   /*-------------------------- SD Init ----------------------------- */
  136.   Status = SD_Init();
  137.   printf("    \r\n\r\n01. ----- SD_Init Status:%d\r\n",Status);

  138.   if (Status == SD_OK)
  139.   {                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 +                    
  140.     printf("          Initialize SD card successfully!\r\n\r\n");
  141.     /*----------------- Read CSD/CID MSD registers ------------------*/
  142.     Status = SD_GetCardInfo(&SDCardInfo);
  143.     printf("02. ----- SD_GetCardInfo Status:%d\r\n",Status);
  144.   }
  145.   
  146.   if (Status == SD_OK)
  147.   {
  148.     printf("          Get SD card infomation successfully!\r\n          Block size:%x, Card type:%x\r\n\r\n",SDCardInfo.CardBlockSize,SDCardInfo.CardType);  
  149.     /*----------------- Select Card --------------------------------*/
  150.     Status = SD_SelectDeselect((u32) (SDCardInfo.RCA << 16));
  151.     printf("03. ----- SD_SelectDeselect Status:%d\r\n",Status);
  152.   }
  153.   
  154.   if (Status == SD_OK)
  155.   {
  156.     printf("          Select SD card successfully!\r\n\r\n");
  157.     Status = SD_EnableWideBusOperation(SDIO_BusWide_4b);
  158.     printf("04. ----- SD_EnableWideBusOperation Status:%d\r\n",Status);
  159.   }
  160.   
  161.   /*------------------- Block Erase -------------------------------*/
  162.   if (Status == SD_OK)
  163.   {
  164.     printf("          Enable wide bus operation successfully!\r\n\r\n");
  165.     /* Erase NumberOfBlocks Blocks of WRITE_BL_LEN(512 Bytes) */
  166.     Status = SD_Erase(Operate_Block*BlockSize, (Operate_Block+1)*BlockSize);
  167.     printf("05. ----- SD_Erase Status:%d\r\n",Status);
  168.   }

  169.   /* Set Device Transfer Mode to DMA */
  170.   if (Status == SD_OK)
  171.   {  
  172.     printf("          Erase block %d successfully!\r\n          All the data is 0x00\r\n\r\n",Operate_Block);
  173.     Status = SD_SetDeviceMode(SD_DMA_MODE);
  174.     printf("06. ----- SD_SetDeviceMode Status:%d\r\n",Status);
  175.   }

  176.   if (Status == SD_OK)
  177.   {
  178.     printf("          Set SD card mode successfully!\r\n\r\n");
  179.     memset(Buffer_MultiBlock_Rx,0xfe,sizeof(Buffer_MultiBlock_Rx));

  180.     Status = SD_ReadMultiBlocks(Operate_Block*BlockSize, Buffer_MultiBlock_Rx, BlockSize, NumberOfBlocks);

  181.     printf("07. ----- SD_ReadMultiBlocks Status:%d\r\n",Status);
  182.   }
  183.   
  184.   if (Status == SD_OK)
  185.   {
  186.           printf("          Read 2 blocks from block %d sucessfully!\r\n          All the data is:\r\n",Operate_Block);  //karlno add:20100505 for debug
  187.           for(i=0;i<sizeof(Buffer_MultiBlock_Rx)>>2;i++)
  188.           {
  189.                   printf("%02x:0x%08x ",i,Buffer_MultiBlock_Rx[i]);
  190.           }
  191.           printf("\r\n\r\n");
  192.   }

  193.   /*------------------- Block Read/Write --------------------------*/
  194.   /* Fill the buffer to send */
  195.   memset(Buffer_Block_Tx, 0x88,sizeof(Buffer_Block_Tx));


  196.   if (Status == SD_OK)
  197.   {
  198.     /* Write block of 512 bytes on address 0 */
  199.     Status = SD_WriteBlock(Operate_Block*BlockSize, Buffer_Block_Tx, BlockSize);
  200.     printf("08. ----- SD_WriteBlock Status:%d\r\n",Status);
  201.   }
  202.   
  203.   if (Status == SD_OK)
  204.   {
  205.     printf("          Write block %d successfully!\r\n          All the data is 0x88\r\n\r\n",Operate_Block);  //karlno add:20100505 for debug
  206.     /* Read block of 512 bytes from address 0 */
  207.     Status = SD_ReadBlock(Operate_Block*BlockSize, Buffer_Block_Rx, BlockSize);
  208.     printf("09. ----- SD_ReadBlock Status:%d\r\n",Status);
  209.   }

  210.   if (Status == SD_OK)
  211.   {
  212.           printf("          Read block %d successfully!\r\n          All the data is:\r\n",Operate_Block);  //karlno add:20100505 for debug
  213.           for(i=0;i<sizeof(Buffer_Block_Rx)>>2;i++)
  214.           {
  215.                   printf("%02x:0x%08x ",i,Buffer_Block_Rx[i]);
  216.           }
  217.           printf("\r\n\r\n");
  218.   }
  219.   
  220.   /*--------------- Multiple Block Read/Write ---------------------*/
  221.   /* Fill the buffer to send */
  222.   memset(Buffer_MultiBlock_Tx, 0x66, sizeof(Buffer_MultiBlock_Tx));

  223.   if (Status == SD_OK)
  224.   {
  225.     /* Write multiple block of many bytes on address 0 */
  226.     Status = SD_WriteMultiBlocks((Operate_Block+2)*BlockSize, Buffer_MultiBlock_Tx, BlockSize, NumberOfBlocks);
  227.     printf("10. ----- SD_WriteMultiBlocks Status:%d\r\n",Status);
  228.   }
  229.   
  230.   if (Status == SD_OK)
  231.   {
  232.     printf("          Write 2 blocks from block %d successfully!\r\n          All the data is 0x66\r\n\r\n",Operate_Block+2);  //karlno add:20100505 for debug
  233.     /* Read block of many bytes from address 0 */
  234.     Status = SD_ReadMultiBlocks((Operate_Block+2)*BlockSize, Buffer_MultiBlock_Rx, BlockSize, NumberOfBlocks);
  235.     printf("11. ----- SD_ReadMultiBlocks Status:%d\r\n",Status);
  236.   }

  237.   
  238.   if (Status == SD_OK)
  239.   {
  240.     printf("          Read 2 blocks from block %d successfully\r\n          All the data is:\r\n",Operate_Block+2);  //karlno add:20100505 for debug
  241.     for(i=0;i<sizeof(Buffer_MultiBlock_Rx)>>2;i++)
  242.     {
  243.       printf("%02x:0x%08x ",i,Buffer_MultiBlock_Rx[i]);
  244.     }
  245.     printf("\r\n\r\n");
  246.         printf("----- SD Succeed!\r\n");
  247.   }

  248.   LED_GPIO_Configuration();  
  249.   /* Infinite loop */
  250.   while (1)
  251.   {
  252.         /*====LED-ON=======*/
  253.         GPIO_SetBits(GPIOF , GPIO_Pin_6);
  254.         GPIO_SetBits(GPIOF , GPIO_Pin_7);
  255.         GPIO_SetBits(GPIOF , GPIO_Pin_8);
  256.         GPIO_SetBits(GPIOF , GPIO_Pin_9);
  257.         Delay(0xfffff);
  258.         Delay(0xfffff);
  259.         Delay(0x5ffff);        

  260.         /*====LED-OFF=======*/
  261.         GPIO_ResetBits(GPIOF , GPIO_Pin_6);
  262.         GPIO_ResetBits(GPIOF , GPIO_Pin_7);
  263.         GPIO_ResetBits(GPIOF , GPIO_Pin_8);
  264.         GPIO_ResetBits(GPIOF , GPIO_Pin_9);
  265.         Delay(0xfffff);
  266.         Delay(0xfffff);
  267.         Delay(0x5ffff);        
  268.   }
  269. }

  270. /*******************************************************************************
  271. * Function Name  : GPIO_Configuration
  272. * Description    : Configure GPIO Pin
  273. * Input          : None
  274. * Output         : None
  275. * Return         : None
  276. * Attention                 : None
  277. *******************************************************************************/
  278. void LED_GPIO_Configuration(void)
  279. {
  280. ……………………

  281. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码


所有资料51hei提供下载:
SDIO.rar (389.65 KB, 下载次数: 83)



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩1
回复

使用道具 举报

来自 7#
ID:487236 发表于 2020-1-1 13:13 | 只看该作者
程序编译出错,缺少多个重要头文件,感觉是坑黑币
回复

使用道具 举报

沙发
ID:327265 发表于 2018-5-13 23:28 | 只看该作者
你好,你发的STM32读写模块操作源代码,你可以帮我解答一下吗
回复

使用道具 举报

板凳
ID:290380 发表于 2018-5-20 12:27 | 只看该作者
谢谢lz
回复

使用道具 举报

地板
ID:290380 发表于 2018-5-20 12:31 | 只看该作者
你好,你发的STM32读写模块操作源
回复

使用道具 举报

5#
ID:650730 发表于 2019-12-13 16:48 | 只看该作者
写的很好,咕咕尝试
回复

使用道具 举报

6#
ID:663153 发表于 2019-12-13 17:11 | 只看该作者
这个程序stm32f103可以使用吗
回复

使用道具 举报

8#
ID:194219 发表于 2020-6-17 02:39 | 只看该作者
缺少头文件
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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