yukaigogogo 发表于 2016-8-1 15:28:03

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

本帖最后由 yukaigogogo 于 2016-8-1 15:30 编辑

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

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








生成工程后,
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 */
}









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上测试表示没有问题。
页: [1]
查看完整版本: 使用cube 开发STM32F1的USB的MSC设备,SDIO用不了DMA