func_sdmmc_sdcard.c 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. #ifdef USE_SDIO_SD
  2. /*
  3. #include "sys.h"
  4. #include "usart.h"
  5. #include "led.h"
  6. #include "key.h"
  7. #include "ltdc.h"
  8. #include "lcd.h"
  9. #include "sdram.h"
  10. #include "usmart.h"
  11. #include "pcf8574.h"
  12. #include "mpu.h"
  13. */
  14. #include "sys_delay.h"
  15. #include "sys_malloc.h"
  16. #include "obj_sdmmc_sdcard.h"
  17. /************************************************
  18. ALIENTEK 阿波罗STM32H7开发板 实验40
  19. SD卡实验-HAL库函数版
  20. 技术支持:www.openedv.com
  21. 淘宝店铺:http://eboard.taobao.com
  22. 关注微信公众平台微信号:"正点原子",免费获取STM32资料。
  23. 广州市星翼电子科技有限公司
  24. 作者:正点原子 @ALIENTEK
  25. ************************************************/
  26. //通过串口打印SD卡相关信息
  27. void show_sdcard_info(void)
  28. {
  29. switch(SDCardInfo.CardType)
  30. {
  31. case STD_CAPACITY_SD_CARD_V1_1:printf("Card Type:SDSC V1.1\r\n");break;
  32. case STD_CAPACITY_SD_CARD_V2_0:printf("Card Type:SDSC V2.0\r\n");break;
  33. case HIGH_CAPACITY_SD_CARD:printf("Card Type:SDHC V2.0\r\n");break;
  34. case MULTIMEDIA_CARD:printf("Card Type:MMC Card\r\n");break;
  35. }
  36. printf("Card ManufacturerID:%d\r\n",SDCardInfo.SD_cid.ManufacturerID); //制造商ID
  37. printf("Card RCA:%d\r\n",SDCardInfo.RCA); //卡相对地址
  38. printf("Card Capacity:%d MB\r\n",(u32)(SDCardInfo.CardCapacity>>20)); //显示容量
  39. printf("Card BlockSize:%d\r\n\r\n",SDCardInfo.CardBlockSize); //显示块大小
  40. }
  41. //测试SD卡的读取
  42. //从secaddr地址开始,读取seccnt个扇区的数据
  43. //secaddr:扇区地址
  44. //seccnt:扇区数
  45. void sd_test_read(u32 secaddr,u32 seccnt)
  46. {
  47. u32 i;
  48. u8 *buf;
  49. u8 sta=0;
  50. buf=mymalloc(SRAMIN,seccnt*512); //申请内存,从SDRAM申请内存
  51. sta=SD_ReadDisk(buf,secaddr,seccnt);//读取secaddr扇区开始的内容
  52. if(sta==0)
  53. {
  54. printf("SECTOR %d DATA:\r\n",secaddr);
  55. for(i=0;i<seccnt*512;i++)printf("%x ",buf[i]);//打印secaddr开始的扇区数据
  56. printf("\r\nDATA ENDED\r\n");
  57. }else printf("err:%d\r\n",sta);
  58. myfree(SRAMIN,buf); //释放内存
  59. }
  60. //测试SD卡的写入(慎用,最好写全是0XFF的扇区,否则可能损坏SD卡.)
  61. //从secaddr地址开始,写入seccnt个扇区的数据
  62. //secaddr:扇区地址
  63. //seccnt:扇区数
  64. void sd_test_write(u32 secaddr,u32 seccnt)
  65. {
  66. u32 i;
  67. u8 *buf;
  68. u8 sta=0;
  69. buf=mymalloc(SRAMIN,seccnt*512); //从SDRAM申请内存
  70. for(i=0;i<seccnt*512;i++) //初始化写入的数据,是3的倍数.
  71. {
  72. buf[i]=i*3;
  73. }
  74. sta=SD_WriteDisk(buf,secaddr,seccnt);//从secaddr扇区开始写入seccnt个扇区内容
  75. if(sta==0)
  76. {
  77. printf("Write over!\r\n");
  78. }else printf("err:%d\r\n",sta);
  79. myfree(SRAMIN,buf); //释放内存
  80. }
  81. int func_sd_card_main(void)
  82. {
  83. // u8 key;
  84. u32 sd_size;
  85. u8 t=0;
  86. u8 *buf;
  87. /*
  88. Cache_Enable(); //打开L1-Cache
  89. //HAL_Init(); //初始化HAL库
  90. delay_init(400); //延时初始化
  91. uart_init(115200); //串口初始化
  92. usmart_dev.init(200); //初始化USMART
  93. LED_Init(); //初始化LED
  94. KEY_Init(); //初始化按键
  95. SDRAM_Init(); //初始化SDRAM
  96. LCD_Init(); //初始化LCD
  97. */
  98. my_mem_init(SRAMIN); //初始化内部内存池
  99. //my_mem_init(SRAMEX); //初始化外部SDRAM内存池
  100. while(SD_Init())//检测不到SD卡
  101. {
  102. sys_delay_ms(500);
  103. sys_delay_ms(500);
  104. }
  105. show_sdcard_info(); //打印SD卡相关信息
  106. //检测SD卡成功
  107. while(1)
  108. {
  109. buf=mymalloc(0,512); //申请内存
  110. if(SD_ReadDisk(buf,0,1)==0) //读取0扇区的内容
  111. {
  112. printf("SECTOR 0 DATA:\r\n");
  113. for(sd_size=0;sd_size<512;sd_size++)
  114. printf("%x ",buf[sd_size]);//打印0扇区数据
  115. printf("\r\nDATA ENDED\r\n");
  116. }
  117. myfree(0,buf);//释放内存
  118. t++;
  119. sys_delay_ms(10);
  120. if(t==20)
  121. {
  122. t=0;
  123. }
  124. }
  125. }
  126. #endif //--------------USE_SDIO_SD-------------------------