本帖最后由 hezhenghedao 于 2019-3-22 10:14 编辑
用STM32CUBEMX 生成 SDIO 4线模式。 在配置dma下图所示,STM32F103VETX 怎么只有配接收的,DMA,要么配置为发送,要么就配置为接收,我看STM32F4 系列的,就可以单独配置,SDIO_RX 和 TX,难道只能配要么读,或 写 单边DMA吗?
2、通过MX生成的代码(设置为接收的),只能DMA接收, DMA发送,不行,但也不报错,就是不中断,和DMA中断。
看代码也没什么区别,内容一样,但是现在只能DMA读,不能DMA写就是里面DMA写的 /* Write Blocks in Polling mode */ 看里面备注了一个,写DMA怎么都不中断,也不DMA回调 , 接收有中断和回调。
后来改了,DMA读,常规模式写就可以 或者 配DMA写,常规模式读也是可以用,就是不能DMA发和收同时配 。
3、这软件不能直接像STM32F4 系列的 可以配置,读 和 写分开配吗?看手册只有一个通道4是SDIO的DMA.
STM32F103VETX 另外初始化,也是只能初始化单边的DMA 下面话的意思,只能单向的配置吗》
/*多个外围DMA句柄指针指向同一个DMA句柄。请注意,只有一个通道可以执行所有请求的DMAs。* //*在调用HAL_SD_ReadBlocks_DMA或HAL_SD_WriteBlocks_DMA之前,请确保更改传输方向。* /__HAL_LINKDMA (hsd hdmarx hdma_sdio);__HAL_LINKDMA (hsd hdmatx hdma_sdio); /* Several peripheral DMA handle pointers point to the same DMA handle. Be aware that there is only one channel to perform all the requested DMAs. */ /* Be sure to change transfer direction before calling HAL_SD_ReadBlocks_DMA or HAL_SD_WriteBlocks_DMA. */
__HAL_LINKDMA(hsd,hdmarx,hdma_sdio);
__HAL_LINKDMA(hsd,hdmatx,hdma_sdio);
现在重新改了一下,写入数据前调用一下。void MX_SDIO_SD_Tx_Init(void) 变一下,方向,就可以中DMA写中断,写返回为0也是正确的,但奇怪是实际并没有写入进去,有知道什么原因的吗?
void MX_SDIO_SD_Rx_Init(void)
{
/* SDIO DMA Init */
/* SDIO Init */
hdma_sdio.Instance = DMA2_Channel4;
hdma_sdio.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_sdio.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_sdio.Init.MemInc = DMA_MINC_ENABLE;
hdma_sdio.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
hdma_sdio.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
hdma_sdio.Init.Mode = DMA_NORMAL;
hdma_sdio.Init.Priority = DMA_PRIORITY_LOW;
if (HAL_DMA_Init(&hdma_sdio) != HAL_OK)
{
Error_Handler();
}
__HAL_LINKDMA(&hsd,hdmarx,hdma_sdio);
__HAL_LINKDMA(&hsd,hdmatx,hdma_sdio);
}
void MX_SDIO_SD_Tx_Init(void)
{
/* SDIO DMA Init */
/* SDIO Init */
hdma_sdio.Instance = DMA2_Channel4;
hdma_sdio.Init.Direction = DMA_MEMORY_TO_PERIPH;
hdma_sdio.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_sdio.Init.MemInc = DMA_MINC_ENABLE;
hdma_sdio.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
hdma_sdio.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
hdma_sdio.Init.Mode = DMA_NORMAL;
hdma_sdio.Init.Priority = DMA_PRIORITY_LOW;
if (HAL_DMA_Init(&hdma_sdio) != HAL_OK)
{
Error_Handler();
}
__HAL_LINKDMA(&hsd,hdmarx,hdma_sdio);
__HAL_LINKDMA(&hsd,hdmatx,hdma_sdio);
}
一周热门 更多>