|
工程是通过cubemax 生成 通过按键1控制轮询方式读写SD卡正常 但通过按键2控制 “DMA方式无法正常读写”@硬汉 能不能帮忙看看问题出在哪 感谢!
初始化部分代码
- /**
- ******************************************************************************
- * @file sdio.c
- * @brief This file provides code for the configuration
- * of the SDIO instances.
- ******************************************************************************
- * @attention
- *
- * <h2><center>© Copyright (c) 2022 STMicroelectronics.
- * All rights reserved.</center></h2>
- *
- * This software component is licensed by ST under BSD 3-Clause license,
- * the "License"; You may not use this file except in compliance with the
- * License. You may obtain a copy of the License at:
- * opensource.org/licenses/BSD-3-Clause
- *
- ******************************************************************************
- */
- /* Includes ------------------------------------------------------------------*/
- #include "sdio.h"
- /* USER CODE BEGIN 0 */
- /* USER CODE END 0 */
- SD_HandleTypeDef hsd;
- DMA_HandleTypeDef hdma_sdio_rx;
- DMA_HandleTypeDef hdma_sdio_tx;
- /* SDIO init function */
- 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 = 0;
- if (HAL_SD_Init(&hsd) != HAL_OK)
- {
- Error_Handler();
- }
- if (HAL_SD_ConfigWideBusOperation(&hsd, SDIO_BUS_WIDE_4B) != HAL_OK)
- {
- Error_Handler();
- }
- }
- void HAL_SD_MspInit(SD_HandleTypeDef* sdHandle)
- {
- GPIO_InitTypeDef GPIO_InitStruct = {0};
- if(sdHandle->Instance==SDIO)
- {
- /* USER CODE BEGIN SDIO_MspInit 0 */
- /* USER CODE END SDIO_MspInit 0 */
- /* SDIO clock enable */
- __HAL_RCC_SDIO_CLK_ENABLE();
- __HAL_RCC_GPIOC_CLK_ENABLE();
- __HAL_RCC_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_FREQ_VERY_HIGH;
- GPIO_InitStruct.Alternate = GPIO_AF12_SDIO;
- HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
- GPIO_InitStruct.Pin = GPIO_PIN_2;
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
- GPIO_InitStruct.Pull = GPIO_PULLUP;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
- GPIO_InitStruct.Alternate = GPIO_AF12_SDIO;
- HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
- /* SDIO DMA Init */
- /* SDIO_RX Init */
- hdma_sdio_rx.Instance = DMA2_Stream3;
- hdma_sdio_rx.Init.Channel = DMA_CHANNEL_4;
- hdma_sdio_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
- hdma_sdio_rx.Init.PeriphInc = DMA_PINC_DISABLE;
- hdma_sdio_rx.Init.MemInc = DMA_MINC_ENABLE;
- hdma_sdio_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
- hdma_sdio_rx.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
- hdma_sdio_rx.Init.Mode = DMA_PFCTRL;
- hdma_sdio_rx.Init.Priority = DMA_PRIORITY_LOW;
- hdma_sdio_rx.Init.FIFOMode = DMA_FIFOMODE_ENABLE;
- hdma_sdio_rx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
- hdma_sdio_rx.Init.MemBurst = DMA_MBURST_INC4;
- hdma_sdio_rx.Init.PeriphBurst = DMA_PBURST_INC4;
- if (HAL_DMA_Init(&hdma_sdio_rx) != HAL_OK)
- {
- Error_Handler();
- }
- __HAL_LINKDMA(sdHandle,hdmarx,hdma_sdio_rx);
- /* SDIO_TX Init */
- hdma_sdio_tx.Instance = DMA2_Stream6;
- hdma_sdio_tx.Init.Channel = DMA_CHANNEL_4;
- hdma_sdio_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
- hdma_sdio_tx.Init.PeriphInc = DMA_PINC_DISABLE;
- hdma_sdio_tx.Init.MemInc = DMA_MINC_ENABLE;
- hdma_sdio_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
- hdma_sdio_tx.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
- hdma_sdio_tx.Init.Mode = DMA_PFCTRL;
- hdma_sdio_tx.Init.Priority = DMA_PRIORITY_LOW;
- hdma_sdio_tx.Init.FIFOMode = DMA_FIFOMODE_ENABLE;
- hdma_sdio_tx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
- hdma_sdio_tx.Init.MemBurst = DMA_MBURST_INC4;
- hdma_sdio_tx.Init.PeriphBurst = DMA_PBURST_INC4;
- if (HAL_DMA_Init(&hdma_sdio_tx) != HAL_OK)
- {
- Error_Handler();
- }
- __HAL_LINKDMA(sdHandle,hdmatx,hdma_sdio_tx);
- /* SDIO interrupt Init */
- HAL_NVIC_SetPriority(SDIO_IRQn, 0, 0);
- HAL_NVIC_EnableIRQ(SDIO_IRQn);
- /* USER CODE BEGIN SDIO_MspInit 1 */
- /* USER CODE END SDIO_MspInit 1 */
- }
- }
- void HAL_SD_MspDeInit(SD_HandleTypeDef* sdHandle)
- {
- if(sdHandle->Instance==SDIO)
- {
- /* USER CODE BEGIN SDIO_MspDeInit 0 */
- /* USER CODE END SDIO_MspDeInit 0 */
- /* Peripheral clock disable */
- __HAL_RCC_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);
- /* SDIO DMA DeInit */
- HAL_DMA_DeInit(sdHandle->hdmarx);
- HAL_DMA_DeInit(sdHandle->hdmatx);
- /* SDIO interrupt Deinit */
- HAL_NVIC_DisableIRQ(SDIO_IRQn);
- /* USER CODE BEGIN SDIO_MspDeInit 1 */
- /* USER CODE END SDIO_MspDeInit 1 */
- }
- }
- /* USER CODE BEGIN 1 */
- /* USER CODE END 1 */
- /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
复制代码
用户部分代码
- #include "user_sdcard.h"
- #include "sdio.h"
- #include <string.h>
- extern uint8_t KEY_Value; //按键值
- HAL_StatusTypeDef Status;
- HAL_SD_CardCIDTypeDef SDCard_CID;
- HAL_SD_CardInfoTypeDef SDCardInfo;
- __align(4) uint8_t SDBuffer_Tx[512], SDBuffer_Rx[512];
- uint32_t i;
- uint64_t CardCap; //SD容量大小
- #define BLOCK_START_ADDR 0 //块起始地址
- #define NUM_OF_BLOCKS 1 //块数量
- //打印SD卡信息
- void SDCARD_Info(void)
- {
- HAL_SD_GetCardInfo(&hsd,&SDCardInfo);
- HAL_SD_GetCardCID(&hsd,&SDCard_CID);
- CardCap=(uint64_t)(SDCardInfo.LogBlockNbr)*(uint64_t)(SDCardInfo.LogBlockSize); //¼ÆËãSD¿¨′óD¡ Âß¼-¿é¸öêy*¿é′óD¡
- printf(" SD card information! \r\n");
- printf("Card ManufacturerID:%d\r\n",SDCard_CID.ManufacturerID); //ÖÆÔìéìID
- printf("Card CardType:%d\r\n",SDCardInfo.CardType); //SD¿¨ààDí
- printf("Card RCA:%d\r\n",SDCardInfo.RelCardAdd); //¿¨Ïà¶ÔμØÖ·
- printf("LogBlockNbr:%d \r\n",(uint32_t)(SDCardInfo.LogBlockNbr)); //Âß¼-¿é¸öêy
- printf("LogBlockSize:%d \r\n",(uint32_t)(SDCardInfo.LogBlockSize)); //Âß¼-¿é′óD¡
- printf("Card Capacity:%d MB\r\n",(uint32_t)(CardCap>>20)); //èYá¿Mb
- printf("Card BlockSize:%d\r\n\r\n",SDCardInfo.BlockSize); //¿é′óD¡
- }
- void SDCARD_Task(void)
- {
- /******************************************轮询方式**************************************/
- //按键1单击读取
- if(KEY_Value == 0x01){
- KEY_Value=0;
- printf("------------------- Read SD card block data ------------------\r\n");
- if(HAL_SD_ReadBlocks(&hsd, SDBuffer_Rx, BLOCK_START_ADDR, NUM_OF_BLOCKS, 10) == HAL_OK)
- {
- while(HAL_SD_GetCardState(&hsd) != HAL_SD_CARD_TRANSFER)
- {
- }
- printf("\r\nRead Block Success!\r\n");
- for(i = 0; i < sizeof(SDBuffer_Rx); i++)
- {
- printf("%03d:0x%02x ", i, SDBuffer_Rx[i]);
- }
- printf("\r\n");
- }
- else
- {
- printf("\r\nRead Block Failed!\r\n");
- }
- }
- //按键1双击写入
- else if(KEY_Value == 0x02){
- KEY_Value=0;
- memset(SDBuffer_Tx, 0x5A, sizeof(SDBuffer_Tx));
- printf("------------------- Write SD card block data ------------------\r\n");
- if(HAL_SD_WriteBlocks(&hsd, SDBuffer_Tx, BLOCK_START_ADDR, NUM_OF_BLOCKS, 10) == HAL_OK)
- {
- while(HAL_SD_GetCardState(&hsd) != HAL_SD_CARD_TRANSFER)
- {
- }
- printf("\r\nWrite Block Success!\r\n");
- for(i = 0; i < sizeof(SDBuffer_Tx); i++)
- {
- printf("%03d:0x%02x ", i, SDBuffer_Tx[i]);
- }
- printf("\r\n");
- }
- else
- {
- printf("\r\nWrite Block Failed!\r\n");
- }
- }
- //按键1长按擦除
- else if(KEY_Value == 0x04){
- KEY_Value=0;
- printf("------------------- Block Erase ------------------------------\r\n");
- if(HAL_SD_Erase(&hsd, BLOCK_START_ADDR, NUM_OF_BLOCKS) == HAL_OK)
- {
- /* Wait until SD cards are ready to use for new operation */
- while(HAL_SD_GetCardState(&hsd) != HAL_SD_CARD_TRANSFER)
- {
- }
- printf("\r\nErase Block Success!\r\n");
- }
- else
- {
- printf("\r\nErase Block Failed!\r\n");
- }
- }
- /******************************************DMA方式**************************************/
- //按键2 单击读取
- if(KEY_Value == 0x10){
- KEY_Value=0;
- printf("------------------- Read SD card block data By DMA------------------\r\n");
- if(HAL_SD_ReadBlocks_DMA(&hsd, SDBuffer_Rx, 0, 1) == HAL_OK)
- {
- while(HAL_SD_GetCardState(&hsd) != HAL_SD_CARD_TRANSFER)
- {
- }
- printf("\r\n Read block successfully!\r\n");
- for(i=0;i<sizeof(SDBuffer_Rx)>>2;i++)
- {
- printf("%03d:0x%08x ",i,SDBuffer_Rx[i]);
- }
- printf("\r\n");
- }
- }
- //按键2双击写入
- else if(KEY_Value == 0x20){
- KEY_Value=0;
- memset(SDBuffer_Tx, 0xA5, sizeof(SDBuffer_Tx));
- printf("------------------- Write SD card block data By DMA------------------\r\n");
- if(HAL_SD_WriteBlocks_DMA(&hsd, SDBuffer_Tx, 0, 1) == HAL_OK)
- {
- while(HAL_SD_GetCardState(&hsd) != HAL_SD_CARD_TRANSFER)
- {
- }
- printf("\r\n Write block successfully!\r\n");
- for(i=0;i<sizeof(SDBuffer_Tx)>>2;i++)
- {
- printf("%03d:0x%08x ",i,SDBuffer_Tx[i]);
- }
- printf("\r\n");
- }
- }
- //按键2长按擦除
- else if(KEY_Value == 0x40){
- KEY_Value=0;
- printf("------------------- Block Erase ------------------------------\r\n");
- if(HAL_SD_Erase(&hsd, BLOCK_START_ADDR, NUM_OF_BLOCKS) == HAL_OK)
- {
- /* Wait until SD cards are ready to use for new operation */
- while(HAL_SD_GetCardState(&hsd) != HAL_SD_CARD_TRANSFER)
- {
- }
- printf("\r\nErase Block Success!\r\n");
- }
- else
- {
- printf("\r\nErase Block Failed!\r\n");
- }
- }
- }
复制代码
|
|