打印
[STM32F4]

CubeMX工具生成的SDIO DMA代码无法工作

[复制链接]
7809|30
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lanjackg2003|  楼主 | 2018-4-13 20:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 lanjackg2003 于 2018-4-13 20:25 编辑

目前使用原子的F4开发板做SD卡的原型开发,发现使用CubeMX生成的代码可以读sd的数据,但是没有办法写卡。通过 HAL_SD_GetCardState 函数查询卡的状态,每次都是  HAL_SD_CARD_TRANSFER 如,图2所示
另外 HAL_SD_ErrorCallback 这个函数也会报错(通过调试,可以看到返回的是0x02的错误代码,通过差库定义发现是 HAL_DMA_ERROR_FE 错误)如图1所示

图1


图2

我怀疑过,是我的SD卡的问题,但是我使用原子的开发板例程,SD读写例程、FATFS的例子,对这张卡写数据都是正常的。
因此,目前我只能怀疑原子的例程跟当前我使用的CubeMX的库文件版本不一样,是库出现的问题。
在此,我将我的工程文件上传在这里,希望哪位同志帮忙试试。
如果是CubeMX的问题,也请ST官方的人员看到了尽快修正一下,毕竟以前的库文件没有问题。
如果是我使用的问题,也欢迎指正一下。
谢谢
cubemx_dma_fail.zip (180.44 KB)





沙发
yiyigirl2014| | 2018-4-14 09:08 | 只看该作者
周末了,都去泡妞了。

使用特权

评论回复
板凳
lanjackg2003|  楼主 | 2018-4-14 16:20 | 只看该作者
yiyigirl2014 发表于 2018-4-14 09:08
周末了,都去泡妞了。

那也希望大家泡妞成功

使用特权

评论回复
地板
xuanhuanzi| | 2018-4-15 17:40 | 只看该作者
对比一下差别啊,是那额没有设置对吧

使用特权

评论回复
5
huzi2099| | 2018-4-15 19:21 | 只看该作者
本帖最后由 huzi2099 于 2018-4-15 19:25 编辑

我知道这个,是dma中断里没有回掉,导致sdio读写中断无法继续。
void DMA2_Stream3_IRQHandler(void)
{
  /* USER CODE BEGIN DMA2_Stream3_IRQn 0 */

  /* USER CODE END DMA2_Stream3_IRQn 0 */
  HAL_DMA_IRQHandler(&hdma_sdio_rx);
  /* USER CODE BEGIN DMA2_Stream3_IRQn 1 */
BSP_SD_ReadCpltCallback();
  /* USER CODE END DMA2_Stream3_IRQn 1 */
}

/**
* @brief This function handles DMA2 stream6 global interrupt.
*/
void DMA2_Stream6_IRQHandler(void)
{
  /* USER CODE BEGIN DMA2_Stream6_IRQn 0 */

  /* USER CODE END DMA2_Stream6_IRQn 0 */
  HAL_DMA_IRQHandler(&hdma_sdio_tx);
  /* USER CODE BEGIN DMA2_Stream6_IRQn 1 */
BSP_SD_WriteCpltCallback();
  /* USER CODE END DMA2_Stream6_IRQn 1 */
}

stm32f4xx_it.c里加这两个回掉函数就行,之前extern一下。

如果不用dma则不用。

使用特权

评论回复
评论
cyang812 2018-8-11 17:42 回复TA
正解。 需要自己添加对 BSP_SD_ReadCpltCallback(); BSP_SD_WriteCpltCallback();的调用 
6
lanjackg2003|  楼主 | 2018-4-16 11:22 | 只看该作者
huzi2099 发表于 2018-4-15 19:21
我知道这个,是dma中断里没有回掉,导致sdio读写中断无法继续。
void DMA2_Stream3_IRQHandler(void)
{

请问你这个固件是什么版本,我全局搜索了我的工程代码,都没有 BSP_SD_ReadCpltCallback BSP_SD_WriteCpltCallback 只有 HAL_SD_TxCpltCallback HAL_SD_RxCpltCallback
这两个接口函数。
这两个接口函数,都是库里面通过回调方式调用的,需要用户自己去填充这两个函数的内容。
但是看你贴出来的代码,貌似BSP_XXXXX 这两个函数都是库提供好的。

使用特权

评论回复
7
huzi2099| | 2018-4-16 12:00 | 只看该作者
lanjackg2003 发表于 2018-4-16 11:22
请问你这个固件是什么版本,我全局搜索了我的工程代码,都没有 BSP_SD_ReadCpltCallback 与 BSP_SD_Write ...

我那个是加了fatfs的,在diskio.c里,不加也应该行,你那个工程文件里不带库文件所以看不到hal_sd.c

使用特权

评论回复
8
huzi2099| | 2018-4-16 12:03 | 只看该作者
你那个库版本好像是1.18的,升级一下吧,最新的是都1.21了

使用特权

评论回复
9
lanjackg2003|  楼主 | 2018-4-16 12:04 | 只看该作者
huzi2099 发表于 2018-4-16 12:03
你那个库版本好像是1.18的,升级一下吧,最新的是都1.21了

我已经升级城最新的了
但是还是没有找到BSP_XX这个开头的函数

使用特权

评论回复
10
lanjackg2003|  楼主 | 2018-4-16 12:11 | 只看该作者

这个是我目前更新的库版本,测试同样是那个错误。

使用特权

评论回复
11
huzi2099| | 2018-4-16 12:15 | 只看该作者
另外你dma启动以后去HAL_SD_GetCardState不合适啊,你还是应该去等dma的callback

使用特权

评论回复
12
lanjackg2003|  楼主 | 2018-4-16 12:21 | 只看该作者
huzi2099 发表于 2018-4-16 12:15
另外你dma启动以后去HAL_SD_GetCardState不合适啊,你还是应该去等dma的callback

我是看库的函数说明注释,写可以通过该函数等待
/**
  * @brief  Writes block(s) to 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 Tx
  *         interrupt event.
  * @param  hsd Pointer to SD handle
  * @param  pData Pointer to the buffer that will contain the data to transmit
  * @param  BlockAdd Block Address where data will be written  
  * @param  NumberOfBlocks Number of blocks to write
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_SD_WriteBlocks_DMA(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks)

我去掉试HAL_SD_GetCardState测试一下,但是仍然会有DMA 0x00000002 的错误

使用特权

评论回复
13
huzi2099| | 2018-4-16 13:01 | 只看该作者
本帖最后由 huzi2099 于 2018-4-16 13:03 编辑

我看到的项目里sdio中断没使能,是不是这个原因


使用特权

评论回复
14
huzi2099| | 2018-4-16 13:08 | 只看该作者
没有429的板子,不然帮你试一下,之前用文件系统+dma+sdio是可以的,我的板子407.

使用特权

评论回复
15
huzi2099| | 2018-4-16 13:12 | 只看该作者
nivc那里也要设置

使用特权

评论回复
16
icecut| | 2018-4-16 13:13 | 只看该作者
先看一下图形配置.确认启用dma模式需要改多少地方.
大部分人都是没选对.

然后再确认是否需要代码修改来对接某些功能.

你都跟踪了这么久了.可以看看芯片手册,如何实现带dma的sd卡读写,然后对比看cubemx帮你实现了多少.
方法,注意方法.

使用特权

评论回复
17
lanjackg2003|  楼主 | 2018-4-16 13:19 | 只看该作者
huzi2099 发表于 2018-4-16 13:12
nivc那里也要设置

我也配置了,仍然报0x2的错误。
在网上查过一个sdio全局中断优先级跟dma优先级的问题
按照sdio全局中断优先的方法设置,错误仍然存在

使用特权

评论回复
18
huzi2099| | 2018-4-16 15:43 | 只看该作者
lanjackg2003 发表于 2018-4-16 13:19
我也配置了,仍然报0x2的错误。
在网上查过一个sdio全局中断优先级跟dma优先级的问题
按照sdio全局中断优 ...

刚才试了一下是可以的,所有默认的就行,不回调也无所谓,02dmaerror表示busy,不影响,数据可以写下去.
dma完成置成0就行了.

使用特权

评论回复
19
本德尔独家代理| | 2018-4-16 15:44 | 只看该作者
这个还真不清楚,坐等学习

使用特权

评论回复
20
huzi2099| | 2018-4-16 15:55 | 只看该作者
好像第一个扇区写有问题
  while (1)
  {

  /* USER CODE END WHILE */
          HAL_Delay(100);
         buf[0]++;
         i++;
         sddmasta=HAL_SD_WriteBlocks_DMA(&hsd,(uint8_t *)buf,8288+i,1);

  /* USER CODE BEGIN 3 */

  }
后面都是对的,再看看

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

56

主题

440

帖子

7

粉丝