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

cube hal sd 库里面配置的中断、dma不能够使用,是神马情况...

[复制链接]
hpdell 提问时间:2016-1-13 15:19 /
本帖最后由 hpdell 于 2016-1-13 17:01 编辑

在最新的 cube hal 库里面没有发现dma的地址赋值 ??

/* Includes ------------------------------------------------------------------*/
#include "sdio.h"

#include "gpio.h"



static SD_HandleTypeDef hsd;
static HAL_SD_CardInfoTypedef SDCardInfo;


uint8_t HAL_SD_DetectedInit(void)
{
        GPIO_InitTypeDef GPIO_InitStruct;
        
        GPIO_InitStruct.Pin = GPIO_PIN_11;
        GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
//        GPIO_InitStruct.Alternate = GPIO_AF12_SDIO;
        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
        
        return 0;
}



void MX_SDIO_SD_Init(void)
{

  hsd.Instance = SDIO;
  hsd.Init.ClockEdge = SDIO_CLOCK_EDGE_RISING;
  hsd.Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE;
  hsd.Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE;
  hsd.Init.BusWide = SDIO_BUS_WIDE_1B;
  hsd.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE;
  hsd.Init.ClockDiv = SDIO_TRANSFER_CLK_DIV;

}

void HAL_SD_MspInit(SD_HandleTypeDef* hsd)
{
  static DMA_HandleTypeDef dmaRxHandle;
  static DMA_HandleTypeDef dmaTxHandle;
        
  GPIO_InitTypeDef GPIO_InitStruct;
  if(hsd->Instance==SDIO)
  {

    __SDIO_CLK_ENABLE();
    __DMAx_TxRx_CLK_ENABLE();
    __GPIOC_CLK_ENABLE();
    __GPIOD_CLK_ENABLE();   

    /**SDIO GPIO Configuration   
    PC8     ------> SDIO_D0
    PC9     ------> SDIO_D1
    PC10     ------> SDIO_D2
    PC11     ------> SDIO_D3
    PC12     ------> SDIO_CK
    PD2     ------> SDIO_CMD
    */
    GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11
                          |GPIO_PIN_12;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF12_SDIO;
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_2;
    HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

    /* Peripheral interrupt init*/
    HAL_NVIC_SetPriority(SDIO_IRQn, 5, 0);
    HAL_NVIC_EnableIRQ(SDIO_IRQn);
               
                /* Configure DMA Rx parameters */
                dmaRxHandle.Init.Channel             = SD_DMAx_Rx_CHANNEL;
                dmaRxHandle.Init.Direction           = DMA_PERIPH_TO_MEMORY;
                dmaRxHandle.Init.PeriphInc           = DMA_PINC_DISABLE;
                dmaRxHandle.Init.MemInc              = DMA_MINC_ENABLE;
                dmaRxHandle.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
                dmaRxHandle.Init.MemDataAlignment    = DMA_MDATAALIGN_BYTE;   // DMA_MDATAALIGN_WORD
                dmaRxHandle.Init.Mode                = DMA_PFCTRL;   //DMA_NORMAL;
                dmaRxHandle.Init.Priority            = DMA_PRIORITY_VERY_HIGH;
                dmaRxHandle.Init.FIFOMode            = DMA_FIFOMODE_ENABLE;
                dmaRxHandle.Init.FIFOThreshold       = DMA_FIFO_THRESHOLD_FULL;
                dmaRxHandle.Init.MemBurst            = DMA_MBURST_INC4;
                dmaRxHandle.Init.PeriphBurst         = DMA_PBURST_INC4;
               
                dmaRxHandle.Instance = SD_DMAx_Rx_STREAM;   
                        
                /* Associate the DMA handle */
                __HAL_LINKDMA(hsd, hdmarx, dmaRxHandle);
               
                /* Deinitialize the stream for new transfer */
                HAL_DMA_DeInit(&dmaRxHandle);
               
                /* Configure the DMA stream */
                HAL_DMA_Init(&dmaRxHandle);   
                        
                        
                /* Configure DMA Tx parameters */
                dmaTxHandle.Init.Channel             = SD_DMAx_Tx_CHANNEL;
                dmaTxHandle.Init.Direction           = DMA_MEMORY_TO_PERIPH;
                dmaTxHandle.Init.PeriphInc           = DMA_PINC_DISABLE;
                dmaTxHandle.Init.MemInc              = DMA_MINC_ENABLE;
                dmaTxHandle.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
                dmaTxHandle.Init.MemDataAlignment    = DMA_MDATAALIGN_BYTE;
                dmaTxHandle.Init.Mode                = DMA_PFCTRL;   //DMA_NORMAL;
                dmaTxHandle.Init.Priority            = DMA_PRIORITY_VERY_HIGH;
                dmaTxHandle.Init.FIFOMode            = DMA_FIFOMODE_ENABLE;
                dmaTxHandle.Init.FIFOThreshold       = DMA_FIFO_THRESHOLD_FULL;
                dmaTxHandle.Init.MemBurst            = DMA_MBURST_INC4;
                dmaTxHandle.Init.PeriphBurst         = DMA_PBURST_INC4;
               
                dmaTxHandle.Instance = SD_DMAx_Tx_STREAM;
               
                /* Associate the DMA handle */
                __HAL_LINKDMA(hsd, hdmatx, dmaTxHandle);
               
                /* Deinitialize the stream for new transfer */
                HAL_DMA_DeInit(&dmaTxHandle);
               
                /* Configure the DMA stream */
                HAL_DMA_Init(&dmaTxHandle);
               
                /* NVIC configuration for DMA transfer complete interrupt */
                HAL_NVIC_SetPriority(SD_DMAx_Rx_IRQn, 6, 0);
                HAL_NVIC_EnableIRQ(SD_DMAx_Rx_IRQn);
               
                /* NVIC configuration for DMA transfer complete interrupt */
                HAL_NVIC_SetPriority(SD_DMAx_Tx_IRQn, 6, 0);
                HAL_NVIC_EnableIRQ(SD_DMAx_Tx_IRQn);   

  }
}




void HAL_SD_MspDeInit(SD_HandleTypeDef* hsd)
{
  if(hsd->Instance==SDIO)
  {
  /* USER CODE BEGIN SDIO_MspDeInit 0 */

  /* USER CODE END SDIO_MspDeInit 0 */
    /* Peripheral clock disable */
    __SDIO_CLK_DISABLE();

    /**SDIO GPIO Configuration   
    PC8     ------> SDIO_D0
    PC9     ------> SDIO_D1
    PC10     ------> SDIO_D2
    PC11     ------> SDIO_D3
    PC12     ------> SDIO_CK
    PD2     ------> SDIO_CMD
    */
    HAL_GPIO_DeInit(GPIOC, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11
                          |GPIO_PIN_12);

    HAL_GPIO_DeInit(GPIOD, GPIO_PIN_2);

    /* Peripheral interrupt Deinit*/
    HAL_NVIC_DisableIRQ(SDIO_IRQn);

  }
}



/**
* @brief This function handles SDIO global interrupt.
*/
void SDIO_IRQHandler(void)
{
  HAL_SD_IRQHandler(&hsd);
}


/**
  * @brief  This function handles DMA2 Stream 3 interrupt request.
  * @param  None
  * @retval None
  */
void SD_DMAx_Rx_IRQHandler(void)
{
  HAL_DMA_IRQHandler(hsd.hdmarx);
}

/**
  * @brief  This function handles DMA2 Stream 6 interrupt request.
  * @param  None
  * @retval None
  */
void SD_DMAx_Tx_IRQHandler(void)
{
  HAL_DMA_IRQHandler(hsd.hdmatx);
}




#define  USER_SD_DMA  1u  // >0u,使用sd的dma功能,否则=0u不使用





DRESULT SD_read(BYTE lun, BYTE *buff, DWORD sector, UINT count)
{
  DRESULT res = RES_OK;

  #if USER_SD_DMA == 0u
    if(BSP_SD_ReadBlocks((uint32_t*)buff,
                         (uint64_t) (sector * BLOCK_SIZE),
                         BLOCK_SIZE,
                         count) != MSD_OK)
    {
      res = RES_ERROR;
    }
       
  #else
    if(BSP_SD_ReadBlocks_DMA((uint32_t*)buff,
                         (uint64_t) (sector * BLOCK_SIZE),
                         BLOCK_SIZE,
                         count) != MSD_OK)
    {
      res = RES_ERROR;
    }
  #endif
  return res;
}



DRESULT SD_write(BYTE lun, const BYTE *buff, DWORD sector, UINT count)
{
  DRESULT res = RES_OK;

  #if USER_SD_DMA == 0u
  if(BSP_SD_WriteBlocks((uint32_t*)buff,
                        (uint64_t)(sector * BLOCK_SIZE),
                        BLOCK_SIZE, count) != MSD_OK)
  {
    res = RES_ERROR;
  }
       
  #else
    if(BSP_SD_WriteBlocks_DMA((uint32_t*)buff,
                          (uint64_t)(sector * BLOCK_SIZE),
                          BLOCK_SIZE, count) != MSD_OK)
    {
      res = RES_ERROR;
    }       
  #endif
  return res;
}



HAL_DMA_Start_IT 这个函数在 HAL_SD_ReadBlocks_DMA、 HAL_SD_WriteBlocks_DMA   这个两个函数里面都有设置,但实际使用就是不行,不知道是什么情况 ??




收藏 1 评论9 发布时间:2016-1-13 15:19

举报

9个回答
mark0668 回答时间:2016-1-13 15:29:50
这只是一个接口,是不能单独用的需要配合SDIO 使用
creep 回答时间:2016-1-13 16:28:02
在类似这样的函数里面设置的:
HAL_DMA_Start();
HAL_DMA_Start_IT();
风子 回答时间:2016-1-13 16:30:14
在开启DMA的时候设置
hpdell 回答时间:2016-1-13 17:05:46
creep 发表于 2016-1-13 16:28
在类似这样的函数里面设置的:
HAL_DMA_Start();
HAL_DMA_Start_IT();

你好,你说的这个HAL_DMA_Start_IT 函数在  HAL_SD_ReadBlocks_DMA、 HAL_SD_WriteBlocks_DMA   函数里面都有调用设置的,但实际使用就是不行,不知道是什么情况 ??
creep 回答时间:2016-1-13 18:56:49
hpdell 发表于 2016-1-13 17:05
你好,你说的这个HAL_DMA_Start_IT 函数在  HAL_SD_ReadBlocks_DMA、 HAL_SD_WriteBlocks_DMA   函数里面 ...

怎么不行?              
hpdell 回答时间:2016-1-14 09:36:40

是我的sd的dma配置有问题,有个mode 配置我配置成了正常模式,结果不行,最后改成 控制模式,完全ok了
eehahaha 回答时间:2016-3-7 22:23:20
我用的轮询的模式,读和写的时候都是不返回OK的,不晓得是什么情况!
流畅的笔记 回答时间:2017-1-5 18:46:27
eehahaha 发表于 2016-3-7 22:23
我用的轮询的模式,读和写的时候都是不返回OK的,不晓得是什么情况!

亲  请问您解决了吗
hpdell 回答时间:2017-1-6 14:59:40
流畅的笔记 发表于 2017-1-5 18:46
亲  请问您解决了吗

亲,7楼已经说明了啊

也就是解决了

所属标签

相似问题

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