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

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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版