6944|5

79

帖子

1

TA的资源

一粒金砂(中级)

楼主
 

【STM32 F7】学习使用SDIO [复制链接]

本帖最后由 义剑仗乾坤 于 2015-10-25 10:24 编辑
系统初始化与LED闪烁
一、实验目的
学习使用SDIO方式读写Micro SD卡(TF卡)
二、开发工具
STM32CUBEMX
Keil MDK-ARM V5
MicroSD Card
三、开发步骤
组员前面已经发帖详细讲解了工程的创建方法,此处不再赘述,只说重点
1、新建工程并生成代码
打开Cube新建一个工程,MCU型号选择STM32F746NGH
在Pinout界面设置SDMMC1的Mode,对读写速度要求较高时可选择4bit,此处设置为 1 bit
选择USART1模式为异步
USART引脚需要按原理图配置一下
设置波特率
点击菜单栏project-generate code可以生成工程文件及代码
2、调用SDIO库函数读写SD卡
读扇区 HAL_SD_ReadBlocks 定义读buffer uint32_t receive[1024]; //ReadBuffer 长度设为1024为后面读多块扇区做准备
写扇区 HAL_SD_WriteBlocks 定义写buffer uint32_t write[512]; //WriteBuffer
定义串口发送数组 uint8_t send[512];
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。错误状态列表如下图所示。
下载程序后,打开串口助手选择COM口和波特率,按RESET后可看到以下结果
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);
复制代码
所以说,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);
复制代码
结果是前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);
OK 两次分别写入了512字节 读出1024字节 所以我认为是这样的:读写函数中,每块在存储区占用了512字节,但是呢,只能存入128字节的数据 也就是说比如现在有0-511字节的数据从0写入,执行下面这条语句 HAL_SD_WriteBlocks (&hsd1, write,0, 512,4); SD卡存储区中的结果会是这样: SDIO告一段落,还请各位大神多多指教
此帖出自stm32/stm8论坛

最新回复

必须支持一下,正在捣鼓图形界面  详情 回复 发表于 2015-10-25 20:59
点赞 关注
 

回复
举报

267

帖子

0

TA的资源

一粒金砂(高级)

沙发
 
怎么不直接上文件系统呢??
此帖出自stm32/stm8论坛

点评

以前没搞过文件系统,下一步学习一下  详情 回复 发表于 2015-10-26 11:21
 
个人签名

gitee/casy

 

回复

1891

帖子

2

TA的资源

纯净的硅(中级)

板凳
 
我只是来看一看。。。。
此帖出自stm32/stm8论坛
 
个人签名
分享铸就美好未来。。。




 

回复

323

帖子

2

TA的资源

一粒金砂(高级)

4
 
必须支持一下,正在捣鼓图形界面
此帖出自stm32/stm8论坛

点评

显示也用到文件系统了,一起学习吧  详情 回复 发表于 2015-10-26 11:22
 
 
 

回复

79

帖子

1

TA的资源

一粒金砂(中级)

5
 
caizhiwei 发表于 2015-10-25 12:25
怎么不直接上文件系统呢??

以前没搞过文件系统,下一步学习一下
此帖出自stm32/stm8论坛
 
 
 

回复

79

帖子

1

TA的资源

一粒金砂(中级)

6
 
snoweaglemcu 发表于 2015-10-25 20:59
必须支持一下,正在捣鼓图形界面

显示也用到文件系统了,一起学习吧
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表