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

使用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扩展软件包
关注我们
st-img 微信公众号
st-img 手机版