OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4276|回复: 3

对4.26或者4.27的HAL库SD卡读写问题

[复制链接]

26

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2015-12-7
在线时间
59 小时
发表于 2018-9-25 08:39:06 | 显示全部楼层 |阅读模式
1金钱
使用的是更新比较靠后的库了,在新库里面 CAN的结构体 SD卡的结构体等ST的官方人员都进行了重制的感觉。
原子原来出的写法已经走不通了....原子哥可以自己去看看。。。

细看下HAL库文件的说明,已经初始化了SDIO模式,并读取到了SD卡的内容和信息。(在hal库文件里面的注释也得到了很大提升,比以前更好阅读了对使用者来说非常好)

开了SDIO中断,DMA RX中断 DMA TX中断。(设置上SDIO的优先级要比DMA的高)

问题是调用读操作的时候,应该是进入了死循环,这个死循环不知道是不是进入了HAL库的Error_Handle().

有人写新的HAL库SD卡遇到过这类进入中断卡死的问题吗?求指点

最佳答案

查看完整内容[请看2#楼]

好了,问题解决了。难怪我看了几次这个中断都感觉只要SDIO的中断优先级比这个DMA高,两个中断的代码看了几遍都没什么问题。 进这个循环,是因为数组越界.... /** * @brief Reads block(s) from a specified address in a card. The Data transfer * is managed by DMA mode. * @note This API should be followed by a check on the card state through * HAL_SD_GetCardState(). * @note ...
< 主啊,请你温柔的笑吧 >
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

26

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2015-12-7
在线时间
59 小时
 楼主| 发表于 2018-9-25 08:39:07 | 显示全部楼层
好了,问题解决了。难怪我看了几次这个中断都感觉只要SDIO的中断优先级比这个DMA高,两个中断的代码看了几遍都没什么问题。

进这个循环,是因为数组越界....
/**
  * @brief  Reads block(s) from a specified address in a card. The Data transfer
  *         is managed by DMA mode.
  * @note   This API should be followed by a check on the card state through
  *         HAL_SD_GetCardState().
  * @note   You could also check the DMA transfer process through the SD Rx
  *         interrupt event.
  * @param  hsd Pointer SD handle                 
  * @param  pData Pointer to the buffer that will contain the received data
  * @param  BlockAdd Block Address from where data is to be read  
  * @param  NumberOfBlocks Number of blocks to read.
  * @retval HAL status
  */
在这个函数里面说明了传入的4个参数:一个是SDIO的句柄,缓冲区指针起始地址,块地址偏移多少个块起始,从块起始连续读取多少个块。

和以前的SDIO这个函数的输入有点出入。。我建立了一个512字节的数组,然而我是在读取512个block.....很明显我的数据很**的不够大。结果它往这个数组起始地址连续放数据时候就越界了,是的,**的越界了。

于是改成了HAL_SD_ReadBlocks_DMA(&hsd,(uint8_t *)Buffer_Rx, 0, 1)  从0块的首地址开始,读取一个块,而不是512个块再放入缓冲区。完事不进入硬故障中断了..
< 主啊,请你温柔的笑吧 >
回复

使用道具 举报

70

主题

6766

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13145
金钱
13145
注册时间
2012-11-26
在线时间
3816 小时
发表于 2018-9-25 08:49:32 | 显示全部楼层
你调试下不就知道死哪了,编译器不跳到那边吗?
回复

使用道具 举报

26

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2015-12-7
在线时间
59 小时
 楼主| 发表于 2018-9-25 15:02:51 | 显示全部楼层
Debug过了啊,早上忘记说了,HAL_SD_ReadBlocks_DMA执行后卡在stm32f4xx_it.c
void HardFault_Handler(void)
{

  while (1)
  {

  }

}
我的Buffer_Rx数组是uint32_t Buffer_Rx[128]也改过uint8_t Buffer_Rx[512]
1537857835(1).png
                          图1
1537857965(1).png
                        图2
1537858977(1).png
                       图3
< 主啊,请你温柔的笑吧 >
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-8 15:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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