[原创] 【STM32 F7】学习使用SDIO

义剑仗乾坤   2015-10-24 19:20 楼主
系统初始化与LED闪烁
一、实验目的
学习使用SDIO方式读写Micro SD卡(TF卡)
二、开发工具
STM32CUBEMX
Keil MDK-ARM V5
MicroSD Card
三、开发步骤
组员前面已经发帖详细讲解了工程的创建方法,此处不再赘述,只说重点
1、新建工程并生成代码
打开Cube新建一个工程,MCU型号选择STM32F746NGH
1.png
在Pinout界面设置SDMMC1的Mode,对读写速度要求较高时可选择4bit,此处设置为 1 bit
10.png
选择USART1模式为异步
3.png
USART引脚需要按原理图配置一下
4.png
设置波特率
5.png
点击菜单栏project-generate code可以生成工程文件及代码
2、调用SDIO库函数读写SD卡
读扇区 HAL_SD_ReadBlocks 定义读buffer uint32_t receive[1024]; //ReadBuffer 长度设为1024为后面读多块扇区做准备
6read.png
写扇区 HAL_SD_WriteBlocks 定义写buffer uint32_t write[512]; //WriteBuffer
7write.png
定义串口发送数组 uint8_t send[512];
8uart.png 1) 读写一块扇区
代码如下
  1. #include "stm32f7xx_hal.h"

  2. /* Private variables ---------------------------------------------------------*/
  3. SD_HandleTypeDef hsd1;
  4. HAL_SD_CardInfoTypedef SDCardInfo1;
  5. UART_HandleTypeDef huart1;
  6. /* USER variables begin */
  7. uint8_t send[512];
  8. uint32_t write[512]; //WriteBuffer
  9. uint32_t receive[1024]; //ReadBuffer 大小最好为512的整数倍,此处设为1024方便后面读多块扇区
  10. uint8_t error=0; //errorstate 返回值若不为0,则代表有错误,详见下图
  11. /* USER variables end */
  12. /* Private function prototypes -----------------------------------------------*/
  13. void SystemClock_Config(void);
  14. static void MX_GPIO_Init(void);
  15. static void MX_SDMMC1_SD_Init(void);
  16. static void MX_USART1_UART_Init(void);
  17. int main(void)
  18. {
  19. /* MCU Configuration----------------------------------------------------------*/
  20. /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  21. HAL_Init();
  22. /* Configure the system clock */
  23. SystemClock_Config();
  24. /* Initialize all configured peripherals */
  25. MX_GPIO_Init();
  26. MX_SDMMC1_SD_Init();
  27. MX_USART1_UART_Init();
  28. for(uint16_t i=0;i<512;i++)
  29. {
  30. write[i]=i/4; //uint8_t 最大到255
  31. }
  32. /* USER CODE BEGIN 2 */
  33. error=HAL_SD_WriteBlocks (&hsd1, write,0, 512,1); //从地址0开始,blocksize为512字节,块数量为1

    if(error!=0)

    {

    HAL_UART_Transmit(&huart1, &error,1, 50);

  34. }

    HAL_Delay(100);

  35. error=HAL_SD_ReadBlocks (&hsd1, receive,0, 512, 1);//读1块
  36. HAL_Delay(100);
  37. for( uint16_t j=0;j<512;j++)
  38. {
  39. send[j]=receive[j];
  40. }
  41. HAL_UART_Transmit(&huart1, send,512, 5000); //
  42. /* USER CODE END 2 */
  43. while (1)
  44. {
  45. }
  46. }

若无错误,返回值error为0。错误状态列表如下图所示。
11.png
下载程序后,打开串口助手选择COM口和波特率,按RESET后可看到以下结果
444.png
write[512]里存的是0,0,0,0,1,1,1,1一直到128,每个数字重复4次,共512个元素。
然而只写入了128个字节,这令我很困惑。blocksize为512,那么写1块应该是512字节才对,不是吗?
2) 读写多块扇区
写4块,读4块
  1. error=HAL_SD_WriteBlocks (&hsd1, write,0, 512,4); //[i]NumberOfBlocks[/i] 设为4
  2. HAL_Delay(100);
  3. error=HAL_SD_ReadBlocks (&hsd1, receive,0, 512, 4);//[i]NumberOfBlocks[/i] 设为4
  4. HAL_Delay(100);
  5. for( uint16_t j=0;j<512;j++)
  6. {
  7. send[j]=receive[j];
  8. }
  9. HAL_UART_Transmit(&huart1, send,512, 5000);
14.png
所以说,4块才是512字节么。
3)地址从0开始写4块,从512开始再写4块,一次性读8块
  1. error=HAL_SD_WriteBlocks (&hsd1, write,0, 512,4); //<em>NumberOfBlocks</em> 设为4
  2. HAL_Delay(100);
  3. error=HAL_SD_WriteBlocks (&hsd1, write,512, 512,4); //<em>NumberOfBlocks</em> 设为4
  4. HAL_Delay(100);
  5. error=HAL_SD_ReadBlocks (&hsd1, receive,0, 512, 8);//<em>NumberOfBlocks</em> 设为8
  6. HAL_Delay(100);
  7. for( uint16_t j=0;j<512;j++)
  8. {
  9. send[j]=receive[j];
  10. }
  11. HAL_UART_Transmit(&huart1, send,512, 5000);
  12. for(uint16_t i=0;i<512;i++)
  13. {
  14. send[i]=receive[512+i];
  15. }
  16. HAL_UART_Transmit(&huart1, send,512, 5000);
222222.png
结果是前512字节正常,后面出现乱码。
4) 后续测试 把第二个写函数的地址改成 512*4=2048试一下
HAL_SD_WriteBlocks (&hsd1, write,0, 512,4); HAL_Delay(100); HAL_SD_WriteBlocks (&hsd1, write,2048, 512,4); HAL_Delay(100); HAL_SD_ReadBlocks (&hsd1, receive,0, 512, 8); HAL_Delay(100);
UART1 UART2 OK 两次分别写入了512字节 读出1024字节 所以我认为是这样的:读写函数中,每块在存储区占用了512字节,但是呢,只能存入128字节的数据 也就是说比如现在有0-511字节的数据从0写入,执行下面这条语句 HAL_SD_WriteBlocks (&hsd1, write,0, 512,4); SD卡存储区中的结果会是这样: QQ图片20151025101838.png SDIO告一段落,还请各位大神多多指教 本帖最后由 义剑仗乾坤 于 2015-10-25 10:24 编辑

回复评论 (5)

怎么不直接上文件系统呢??
gitee/casy
点赞  2015-10-25 12:25
我只是来看一看。。。。
分享铸就美好未来。。。
点赞  2015-10-25 13:27
必须支持一下,正在捣鼓图形界面
点赞  2015-10-25 20:59
引用: caizhiwei 发表于 2015-10-25 12:25
怎么不直接上文件系统呢??

以前没搞过文件系统,下一步学习一下
点赞  2015-10-26 11:21
引用: snoweaglemcu 发表于 2015-10-25 20:59
必须支持一下,正在捣鼓图形界面

显示也用到文件系统了,一起学习吧
点赞  2015-10-26 11:22
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复