你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

使用cube 开发STM32F1的USB的MSC设备,SDIO用不了DMA

[复制链接]
yukaigogogo 提问时间:2016-8-1 15:28 /
本帖最后由 yukaigogogo 于 2016-8-1 15:30 编辑

第一次求助,大家多多包含。

在用stm32 cubemx 开发一个应用 ,就是可以用USB接口,SDIO来模拟一个U盘。相关的一些配置如图,有DMA的配置,SDIO的DMA配置,中断优先级的配置。

1.png


2.png

3.png

生成工程后,
usbd_storage_if.c 是自动生成的一个文件,但是你要填充一些函数。有两个关键的函数如下。

可以看到我使用了HAL_SD_ReadBlocks()  HAL_SD_WriteBlocks()来读写SD卡。整个应用可以正常工作。模拟U盘是成功的。
但是一但我用上HAL_SD_ReadBlocks_DMA(),U盘功能无论如何都不能正常工作。
在反复的调试中,发现了一些端倪,只知道和中断有非常大的关系,还请这方向的大侠看看,出出点子。
官方的例程我看了,他使用的是DMA来读写SDIO的,是可以正常工作的。但是看不出其中的差别。
/*******************************************************************************
* Function Name  : STORAGE_Read_FS
* Description    :
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
int8_t STORAGE_Read_FS (uint8_t lun,
                        uint8_t *buf,
                        uint32_t blk_addr,                       
                        uint16_t blk_len)
{
  /* USER CODE BEGIN 6 */
        HAL_SD_ReadBlocks(&hsd, (uint32_t*)buf, (uint64_t)(blk_addr * STORAGE_BLK_SIZ), STORAGE_BLK_SIZ, blk_len);
  return (USBD_OK);
  /* USER CODE END 6 */
}

/*******************************************************************************
* Function Name  : STORAGE_Write_FS
* Description    :
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
int8_t STORAGE_Write_FS (uint8_t lun,
                         uint8_t *buf,
                         uint32_t blk_addr,
                         uint16_t blk_len)
{
  /* USER CODE BEGIN 7 */
        HAL_SD_WriteBlocks(&hsd, (uint32_t*)buf, (uint64_t)(blk_addr * STORAGE_BLK_SIZ), STORAGE_BLK_SIZ, blk_len);
  return (USBD_OK);
  /* USER CODE END 7 */
}









收藏 1 评论3 发布时间:2016-8-1 15:28

举报

3个回答
rokin_jiao 回答时间:2016-12-12 13:55:53
SDIO的DMA你配置的是Memory to peripheral,所以你只能是write用dma,read用HAL_SD_ReadBlocks,不能用dma方式
yukaigogogo 回答时间:2016-12-22 10:54:35
rokin_jiao 发表于 2016-12-12 13:55
SDIO的DMA你配置的是Memory to peripheral,所以你只能是write用dma,read用HAL_SD_ReadBlocks,不能用dma方式 ...

但是在cube里面不能设置成双向DMA好奇怪啊
任风吹吹 回答时间:2016-12-30 16:08:51
本帖最后由 任风吹吹 于 2016-12-30 16:10 编辑

你的配置有问题:
1 SDIO得分别为Tx和RX配置DMA.
2 SDIO的中断最好不要设置为0,这个与SysTick抢,会影响到SysTick.
3 SDIO global interrup 的优先级最好小于或等于SDIO Tx和RX的DMA的中断优先级.
4 从图中并没有看到你为SDIO的Rx配置DMA,那当然不能使用DMA来接收数据了。

目前在F4上测试表示没有问题。

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版