硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2515|回复: 4
收起左侧

[SD/SDIO] STM32H7配套的几个SDIO使用自带DMA的实例测试学习

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107041
QQ
发表于 2018-9-28 11:25:17 | 显示全部楼层 |阅读模式
硬件接线图,官方综合评估板:

QQ截图20180928112457.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107041
QQ
 楼主| 发表于 2018-9-28 11:52:28 | 显示全部楼层
例子:SD_ReadWrite_DMA
实现了一个简单的状态机思想来调用函数HAL_SD_WriteBlocks_DMA和HAL_SD_ReadBlocks_DMA。




注意引脚的复用设置,有GPIO_AF7_SDIO1,GPIO_AF8_SDIO1和GPIO_AF12_SDIO1

  1. /**
  2.   * @brief SD MSP Initialization
  3.   *        This function configures the hardware resources used in this example:
  4.   *           - Peripheral's clock enable
  5.   *           - Peripheral's GPIO Configuration
  6.   *           - DMA configuration for requests by peripheral
  7.   *           - NVIC configuration for DMA and SD interrupts
  8.   * @param hsd: SD handle pointer
  9.   * @retval None
  10.   */

  11. void HAL_SD_MspInit(SD_HandleTypeDef *hsd)
  12. {
  13.   GPIO_InitTypeDef gpio_init_structure;
  14.   
  15.   /* Enable SDIO clock */
  16.   __HAL_RCC_SDMMC1_CLK_ENABLE();
  17.   
  18.   /* Enable GPIOs clock */
  19.   __HAL_RCC_GPIOB_CLK_ENABLE();
  20.   __HAL_RCC_GPIOC_CLK_ENABLE();
  21.   __HAL_RCC_GPIOD_CLK_ENABLE();

  22.   gpio_init_structure.Mode      = GPIO_MODE_AF_PP;
  23.   gpio_init_structure.Pull      = GPIO_NOPULL;
  24.   gpio_init_structure.Speed     = GPIO_SPEED_FREQ_VERY_HIGH;
  25.   
  26.   /* D0(PC8), D1(PC9), D2(PC10), D3(PC11), CK(PC12), CMD(PD2) */
  27.   /* Common GPIO configuration */
  28.   gpio_init_structure.Alternate = GPIO_AF12_SDIO1;
  29.   
  30.   /* GPIOC configuration */
  31.   gpio_init_structure.Pin = GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12;
  32.   HAL_GPIO_Init(GPIOC, &gpio_init_structure);

  33.   /* GPIOD configuration */
  34.   gpio_init_structure.Pin = GPIO_PIN_2;
  35.   HAL_GPIO_Init(GPIOD, &gpio_init_structure);

  36.   /* D0DIR(PC6), D123DIR(PC7) */
  37.   gpio_init_structure.Alternate = GPIO_AF8_SDIO1;
  38.   /* GPIOC configuration */
  39.   gpio_init_structure.Pin = GPIO_PIN_6 | GPIO_PIN_7;
  40.   HAL_GPIO_Init(GPIOC, &gpio_init_structure);

  41.   /* CKIN(PB8), CDIR(PB9) */
  42.   gpio_init_structure.Alternate = GPIO_AF7_SDIO1;
  43.   /* GPIOB configuration */
  44.   gpio_init_structure.Pin = GPIO_PIN_8 | GPIO_PIN_9;
  45.   HAL_GPIO_Init(GPIOB, &gpio_init_structure);

  46.   __HAL_RCC_SDMMC1_FORCE_RESET();
  47.   __HAL_RCC_SDMMC1_RELEASE_RESET();

  48.   /* NVIC configuration for SDIO interrupts */
  49.   HAL_NVIC_SetPriority(SDMMC1_IRQn, 5, 0);
  50.   HAL_NVIC_EnableIRQ(SDMMC1_IRQn);

  51. }

  52. /**
  53.   * @brief SD MSP De-Initialization
  54.   *        This function frees the hardware resources used in this example:
  55.   *          - Disable the Peripheral's clock
  56.   *          - Revert GPIO, DMA and NVIC configuration to their default state
  57.   * @param hsd: SD handle pointer
  58.   * @retval None
  59.   */
  60. void HAL_SD_MspDeInit(SD_HandleTypeDef *hsd)
  61. {
  62.   
  63.   /* DeInit GPIO pins can be done in the application
  64.   (by surcharging this __weak function) */
  65.   
  66.     /* Enable GPIOs clock */
  67.   __HAL_RCC_GPIOB_CLK_DISABLE();
  68.   __HAL_RCC_GPIOC_CLK_DISABLE();
  69.   __HAL_RCC_GPIOD_CLK_DISABLE();
  70.   
  71.   /* Disable SDMMC1 clock */
  72.   __HAL_RCC_SDMMC1_CLK_DISABLE();
  73. }
复制代码

主实现函数如下:
  1. /* Private define ------------------------------------------------------------*/
  2. #define DATA_SIZE              ((uint32_t)0x06400000U) /* Data Size 100Mo */

  3. /* ------ Buffer Size ------ */
  4. #define BUFFER_SIZE            ((uint32_t)0x00040000U) /* 256Ko */

  5. #define NB_BUFFER              DATA_SIZE / BUFFER_SIZE
  6. #define NB_BLOCK_BUFFER        BUFFER_SIZE / BLOCKSIZE /* Number of Block (512o) by Buffer */
  7. #define BUFFER_WORD_SIZE       (BUFFER_SIZE>>2)        /* Buffer size in Word */


  8. #define SD_TIMEOUT             ((uint32_t)0x00100000U)
  9. #define ADDRESS                ((uint32_t)0x00000400U) /* SD Address to write/read data */
  10. #define DATA_PATTERN           ((uint32_t)0xB5F3A5F3U) /* Data pattern to write */
  11. /* Private macro -------------------------------------------------------------*/
  12. /* Private variables ---------------------------------------------------------*/
  13. SD_HandleTypeDef SDHandle;
  14. __IO uint8_t RxCplt, TxCplt;

  15. /******** SD Transmission Buffer definition *******/
  16. #if defined ( __ICCARM__ )
  17. #pragma location = 0x24000000
  18. #elif defined ( __CC_ARM )
  19. __attribute__((section (".RAM_D1")))
  20. #elif defined ( __GNUC__ )
  21. __attribute__((section (".RAM_D1")))
  22. #endif
  23. uint8_t aTxBuffer[BUFFER_WORD_SIZE*4];
  24. /**************************************************/

  25. /******** SD Receive Buffer definition *******/
  26. #if defined ( __ICCARM__ )
  27. #pragma location = 0x24040000
  28. #elif defined ( __CC_ARM )
  29. __attribute__((section (".RAM_D1")))
  30. #elif defined ( __GNUC__ )
  31. __attribute__((section (".RAM_D1")))
  32. #endif
  33. uint8_t aRxBuffer[BUFFER_WORD_SIZE*4];
  34. /**************************************************/
  35. /* UART handler declaration, used for printf */
  36. UART_HandleTypeDef UartHandle;

  37. __IO uint8_t step = 0;
  38. uint32_t start_time = 0;
  39. uint32_t stop_time = 0;

  40. /* Private function prototypes -----------------------------------------------*/
  41. static void SystemClock_Config(void);
  42. static void Error_Handler(void);
  43. static void CPU_CACHE_Enable(void);
  44. static void UART_Config(void);
  45. static uint8_t Wait_SDCARD_Ready(void);


  46. #ifdef __GNUC__ /* __GNUC__ */
  47. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
  48. #else
  49. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
  50. #endif /* __GNUC__ */


  51. /* Private functions ---------------------------------------------------------*/
  52. void Fill_Buffer(uint32_t *pBuffer, uint16_t BufferLength, uint32_t Offset);

  53. /**
  54.   * @brief  Main program
  55.   * @param  None
  56.   * @retval None
  57.   */
  58. int main(void)
  59. {
  60.   uint32_t index = 0;

  61.   /* Enable the CPU Cache */
  62.   CPU_CACHE_Enable();
  63.   HAL_SD_CardCIDTypedef pCID;
  64.   HAL_SD_CardCSDTypedef pCSD;

  65.   /* STM32H7xx HAL library initialization:
  66.        - Configure the Systick to generate an interrupt each 1 msec
  67.        - Set NVIC Group Priority to 4
  68.        - Low Level Initialization
  69.      */
  70.   HAL_Init();

  71.   /* Configure the system clock to 400 MHz */
  72.   SystemClock_Config();

  73.   /*##-1- Initialize LEDs mounted on STM32H743I-EVAL board #####################*/
  74.   BSP_LED_Init(LED_GREEN);
  75.   BSP_LED_Init(LED_ORANGE);
  76.   BSP_LED_Init(LED_RED);
  77.   
  78.   /*##-2- Configure USART for printf messages #####################*/
  79.   UART_Config();
  80.   
  81.   /*##-2- Initialize IO functionalities (MFX) #####################*/
  82.   BSP_IO_Init();
  83.   
  84.   /* Initialise Transciver MFXPIN to enable 1.8V Switch mode */
  85.   BSP_IO_ConfigPin(SD_LDO_SEL_PIN, IO_MODE_OUTPUT_PP_PU);
  86.   
  87.   /*##-3- Initialize SD instance #####################*/
  88.   SDHandle.Instance = SDMMC1;
  89.   HAL_SD_DeInit(&SDHandle);
  90.    
  91.   /* SDMMC IP clock 200Mhz, SDCard clock 100Mhz  */
  92.   SDHandle.Init.ClockEdge           = SDMMC_CLOCK_EDGE_RISING;
  93.   SDHandle.Init.ClockPowerSave      = SDMMC_CLOCK_POWER_SAVE_DISABLE;
  94.   SDHandle.Init.BusWide             = SDMMC_BUS_WIDE_4B;
  95.   SDHandle.Init.HardwareFlowControl = SDMMC_HARDWARE_FLOW_CONTROL_DISABLE;
  96.   SDHandle.Init.ClockDiv            = 1;
  97.   
  98.   if(HAL_SD_Init(&SDHandle) != HAL_OK)
  99.   {
  100.     Error_Handler();
  101.   }
  102.   
  103.   if(HAL_SD_Erase(&SDHandle, ADDRESS, ADDRESS+BUFFERSIZE) != HAL_OK)
  104.   {
  105.     Error_Handler();
  106.   }
  107.   if(Wait_SDCARD_Ready() != HAL_OK)
  108.   {
  109.     Error_Handler();
  110.   }
  111.   
  112.   HAL_SD_GetCardCID(&SDHandle, &pCID);
  113.   HAL_SD_GetCardCSD(&SDHandle, &pCSD);
  114.   
  115.   while(1)
  116.   {
  117.     switch(step)
  118.     {
  119.       case 0:
  120.       {
  121.         /*##- 4 - Initialize Transmission buffer #####################*/
  122.         for (index = 0; index < BUFFERSIZE; index++)
  123.         {
  124.           aTxBuffer[index] = DATA_PATTERN + index;
  125.         }
  126.         SCB_CleanDCache_by_Addr((uint32_t*)aTxBuffer, BUFFER_WORD_SIZE*4);
  127.         printf(" ****************** Start Write test ******************* \n");
  128.         printf(" - Buffer size to write: %lu MB   \n", (DATA_SIZE>>20));
  129.         index = 0;
  130.         start_time = HAL_GetTick();
  131.         step++;
  132.       }
  133.       break;
  134.       case 1:
  135.       {
  136.         TxCplt = 0;
  137.         /*##- 5 - Start Transmission buffer #####################*/
  138.         if(HAL_SD_WriteBlocks_DMA(&SDHandle, aTxBuffer, ADDRESS, NB_BLOCK_BUFFER) != HAL_OK)
  139.         {
  140.           Error_Handler();
  141.         }
  142.         step++;
  143.       }
  144.       break;
  145.       case 2:
  146.       {
  147.         if(TxCplt != 0)
  148.         {
  149.           /* Toogle Led Orange, Transfer of Buffer OK */
  150.           BSP_LED_Toggle(LED_ORANGE);
  151.          
  152.           /* Transfer of Buffer completed */
  153.           index++;
  154.           if(index<NB_BUFFER)
  155.           {
  156.             /* More data need to be trasnfered */
  157.             step--;
  158.           }
  159.           else
  160.           {
  161.             stop_time = HAL_GetTick();
  162.             printf(" - Write Time(ms): %lu  -  Write Speed: %02.2f MB/s  \n", stop_time - start_time, (float)((float)(DATA_SIZE>>10)/(float)(stop_time - start_time)));
  163.             /* All data are transfered */
  164.             step++;
  165.           }
  166.         }
  167.       }
  168.       break;
  169.       case 3:
  170.       {
  171.         /*##- 6 - Initialize Reception buffer #####################*/
  172.         for (index = 0; index < BUFFERSIZE; index++)
  173.         {
  174.           aRxBuffer[index] = 0;
  175.         }
  176.         SCB_CleanDCache_by_Addr((uint32_t*)aRxBuffer, BUFFER_WORD_SIZE*4);
  177.         printf(" ******************* Start Read test ******************* \n");
  178.         printf(" - Buffer size to read: %lu MB   \n", (DATA_SIZE>>20));
  179.         start_time = HAL_GetTick();
  180.         index = 0;
  181.         step++;
  182.       }
  183.       break;
  184.       case 4:
  185.       {
  186.         /*##- 7 - Initialize Reception buffer #####################*/
  187.         RxCplt = 0;
  188.         if(HAL_SD_ReadBlocks_DMA(&SDHandle, aRxBuffer, ADDRESS, NB_BLOCK_BUFFER) != HAL_OK)
  189.         {
  190.           Error_Handler();
  191.         }
  192.         step++;
  193.       }
  194.       break;
  195.       case 5:
  196.       {
  197.         if(RxCplt != 0)
  198.         {
  199.           /* Toogle Led Orange, Transfer of Buffer OK */
  200.           BSP_LED_Toggle(LED_ORANGE);
  201.           /* Transfer of Buffer completed */
  202.           index++;
  203.           if(index<NB_BUFFER)
  204.           {
  205.             /* More data need to be trasnfered */
  206.             step--;
  207.           }
  208.           else
  209.           {
  210.             stop_time = HAL_GetTick();
  211.             printf(" - Read Time(ms): %lu  -  Read Speed: %02.2f MB/s  \n", stop_time - start_time, (float)((float)(DATA_SIZE>>10)/(float)(stop_time - start_time)));
  212.             /* All data are transfered */
  213.             step++;
  214.           }
  215.         }
  216.       }
  217.       break;
  218.       case 6:
  219.       {
  220.         /*##- 8 - Check Reception buffer #####################*/
  221.         index=0;
  222.         printf(" ********************* Check data ********************** \n");
  223.         while((index<BUFFERSIZE) && (aRxBuffer[index] == aTxBuffer[index]))
  224.         {
  225.           index++;
  226.         }
  227.         
  228.         if(index != BUFFERSIZE)
  229.         {
  230.           printf(" - Check data Error !!!!   \n");
  231.           Error_Handler();
  232.         }
  233.         printf(" - Check data OK  \n");
  234.         /* Toogle Green LED, Check Transfer OK */
  235.         BSP_LED_Toggle(LED_GREEN);
  236.         step = 0;
  237.       }
  238.       break;
  239.       default :
  240.         Error_Handler();
  241.     }
  242.   }
  243. }


  244. /**
  245.   * @brief  System Clock Configuration
  246.   *         The system Clock is configured as follow :
  247.   *            System Clock source            = PLL (HSE)
  248.   *            SYSCLK(Hz)                     = 400000000 (CPU Clock)
  249.   *            HCLK(Hz)                       = 200000000 (AXI and AHBs Clock)
  250.   *            AHB Prescaler                  = 2
  251.   *            D1 APB3 Prescaler              = 2 (APB3 Clock  100MHz)
  252.   *            D2 APB1 Prescaler              = 2 (APB1 Clock  100MHz)
  253.   *            D2 APB2 Prescaler              = 2 (APB2 Clock  100MHz)
  254.   *            D3 APB4 Prescaler              = 2 (APB4 Clock  100MHz)
  255.   *            HSE Frequency(Hz)              = 25000000
  256.   *            PLL_M                          = 5
  257.   *            PLL_N                          = 160
  258.   *            PLL_P                          = 2
  259.   *            PLL_Q                          = 4
  260.   *            PLL_R                          = 2
  261.   *            VDD(V)                         = 3.3
  262.   *            Flash Latency(WS)              = 4
  263.   * @param  None
  264.   * @retval None
  265.   */
  266. static void SystemClock_Config(void)
  267. {
  268.   RCC_ClkInitTypeDef RCC_ClkInitStruct;
  269.   RCC_OscInitTypeDef RCC_OscInitStruct;
  270.   HAL_StatusTypeDef ret = HAL_OK;

  271.   /*!< Supply configuration update enable */
  272.   MODIFY_REG(PWR->CR3, PWR_CR3_SCUEN, 0);

  273.   /* The voltage scaling allows optimizing the power consumption when the device is
  274.      clocked below the maximum system frequency, to update the voltage scaling value
  275.      regarding system frequency refer to product datasheet.  */
  276.   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

  277.   while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}

  278.   /* Enable HSE Oscillator and activate PLL with HSE as source */
  279.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  280.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  281.   RCC_OscInitStruct.HSIState = RCC_HSI_OFF;
  282.   RCC_OscInitStruct.CSIState = RCC_CSI_OFF;
  283.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  284.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;

  285.   RCC_OscInitStruct.PLL.PLLM = 5;
  286.   RCC_OscInitStruct.PLL.PLLN = 160;
  287.   RCC_OscInitStruct.PLL.PLLP = 2;
  288.   RCC_OscInitStruct.PLL.PLLR = 2;
  289.   RCC_OscInitStruct.PLL.PLLQ = 4;

  290.   RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
  291.   RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;
  292.   ret = HAL_RCC_OscConfig(&RCC_OscInitStruct);
  293.   if(ret != HAL_OK)
  294.   {
  295.     Error_Handler();
  296.   }
  297.   
  298. /* Select PLL as system clock source and configure  bus clocks dividers */
  299.   RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_D1PCLK1 | RCC_CLOCKTYPE_PCLK1 | \
  300.                                   RCC_CLOCKTYPE_PCLK2  | RCC_CLOCKTYPE_D3PCLK1);
  301.   
  302.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  303.   RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
  304.   RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
  305.   RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;  
  306.   RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
  307.   RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
  308.   RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;
  309.   ret = HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4);
  310.   if(ret != HAL_OK)
  311.   {
  312.     Error_Handler();
  313.   }


  314.   /*activate CSI clock mondatory for I/O Compensation Cell*/  
  315.   __HAL_RCC_CSI_ENABLE() ;
  316.    
  317.   /* Enable SYSCFG clock mondatory for I/O Compensation Cell */
  318.   __HAL_RCC_SYSCFG_CLK_ENABLE() ;
  319.   
  320.   /* Enables the I/O Compensation Cell */   
  321.   HAL_EnableCompensationCell();
  322.   
  323. }

  324. /**
  325.   * @brief  Enable the SD Transciver 1.8V Mode Callback.
  326.   * @param  None
  327.   * @retval None
  328.   */
  329. void HAL_SD_DriveTransciver_1_8V_Callback(FlagStatus status)
  330. {
  331.   if(status == SET)
  332.   {
  333.     BSP_IO_WritePin(IO_PIN_13, BSP_IO_PIN_SET);  
  334.   }
  335.   else
  336.   {
  337.     BSP_IO_WritePin(IO_PIN_13, BSP_IO_PIN_RESET);
  338.   }
  339. }

  340. /**
  341.   * @brief Rx Transfer completed callbacks
  342.   * @param hsd: SD handle
  343.   * @retval None
  344.   */
  345. void HAL_SD_RxCpltCallback(SD_HandleTypeDef *hsd)
  346. {
  347.   if(Wait_SDCARD_Ready() != HAL_OK)
  348.   {
  349.     Error_Handler();
  350.   }
  351.   SCB_InvalidateDCache_by_Addr((uint32_t*)aRxBuffer, BUFFER_WORD_SIZE*4);
  352.   RxCplt=1;
  353. }

  354. /**
  355.   * @brief Tx Transfer completed callbacks
  356.   * @param hsd: SD handle
  357.   * @retval None
  358.   */
  359. void HAL_SD_TxCpltCallback(SD_HandleTypeDef *hsd)
  360. {
  361.   if(Wait_SDCARD_Ready() != HAL_OK)
  362.   {
  363.     Error_Handler();
  364.   }
  365.   TxCplt=1;
  366. }
复制代码



回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107041
QQ
 楼主| 发表于 2018-9-28 12:25:02 | 显示全部楼层
例子:SD_ReadWrite_DMA_HS

跟上面的SD_ReadWrite_DMA例程一样,不同的地方是采用的PLL2时钟,配置速度为145MHz

  1.   /*  SDMMC Clk: (((25/5) * 175) / 6) = 145Mhz */
  2.   RCC_PeriphCLKInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SDMMC;
  3.   RCC_PeriphCLKInitStruct.SdmmcClockSelection = RCC_SDMMCCLKSOURCE_PLL2;
  4.   RCC_PeriphCLKInitStruct.PLL2.PLL2RGE = RCC_PLL1VCIRANGE_2;
  5.   RCC_PeriphCLKInitStruct.PLL2.PLL2M = 5;
  6.   RCC_PeriphCLKInitStruct.PLL2.PLL2N = 175;
  7.   RCC_PeriphCLKInitStruct.PLL2.PLL2P = 2;
  8.   RCC_PeriphCLKInitStruct.PLL2.PLL2R = 6;
  9.   RCC_PeriphCLKInitStruct.PLL2.PLL2Q = 4;
  10.   RCC_PeriphCLKInitStruct.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;
  11.   ret = HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInitStruct);
  12.   if(ret != HAL_OK)
  13.   {
  14.     Error_Handler();
  15.   }
复制代码

  1. /*##-3- Initialize SD instance #####################*/
  2.   SDHandle.Instance = SDMMC1;
  3.   HAL_SD_DeInit(&SDHandle);
  4.    
  5.   /* SDMMC IP clock 200Mhz, SDCard clock 100Mhz  */
  6.   SDHandle.Init.ClockEdge           = SDMMC_CLOCK_EDGE_RISING;
  7.   SDHandle.Init.ClockPowerSave      = SDMMC_CLOCK_POWER_SAVE_DISABLE;
  8.   SDHandle.Init.BusWide             = SDMMC_BUS_WIDE_4B;
  9.   SDHandle.Init.HardwareFlowControl = SDMMC_HARDWARE_FLOW_CONTROL_DISABLE;
  10.   SDHandle.Init.ClockDiv            = 0;
  11.   
  12.   if(HAL_SD_Init(&SDHandle) != HAL_OK)
  13.   {
  14.     Error_Handler();
  15.   }
  16.   
  17.   if(HAL_SD_Erase(&SDHandle, ADDRESS, ADDRESS+BUFFERSIZE) != HAL_OK)
  18.   {
  19.     Error_Handler();
  20.   }
  21.   if(Wait_SDCARD_Ready() != HAL_OK)
  22.   {
  23.     Error_Handler();
  24.   }
复制代码


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107041
QQ
 楼主| 发表于 2018-9-29 15:58:39 | 显示全部楼层
实例:SD_ReadWrite_DMADoubleBuffer

此例子主要是DMA双缓冲的使用方法。

主要是函数HAL_SDEx_ConfigDMAMultiBuffer,HAL_SDEx_WriteBlocksDMAMultiBuffer和HAL_SDEx_ReadBlocksDMAMultiBuffer的使用。

另外特别注意回调函数,当前那个缓冲使用完毕,那个缓冲在使用中。

测试代码如下:
  1. /* Private typedef -----------------------------------------------------------*/

  2. /* Private define ------------------------------------------------------------*/
  3. #define DATA_SIZE              ((uint32_t)0x06400000U) /* Data Size 100MB */

  4. /* ------ Buffer0 & Buffer1 Size ------ */
  5. #define BUFFER_SIZE            ((uint32_t)0x00001000U) /* 4KB */
  6. #define BUFFER_WORD_SIZE       (BUFFER_SIZE>>2)        /* Buffer size in Word */
  7. #define NB_BLOCK_BUFFER        BUFFER_SIZE / BLOCKSIZE /* Number of Block (512B) by Buffer */

  8. #define LOOP_BUFFER_SIZE       ((uint32_t)0x01900000U) /* 25MB */

  9. #define NB_LOOP                ((uint32_t)DATA_SIZE / LOOP_BUFFER_SIZE)

  10. #define SD_TIMEOUT             ((uint32_t)0x01000000U)
  11. #define DATA_ADDRESS           ((uint32_t)0x00000000U) /* SD Address to write/read data */
  12. #define DATA_PATTERN0          ((uint32_t)0x01000000U) /* Data pattern for buffer0*/
  13. #define DATA_PATTERN1          ((uint32_t)0x02000000U) /* Data pattern for buffer1 */

  14. /* Private macro -------------------------------------------------------------*/
  15. /* Private variables ---------------------------------------------------------*/
  16. SD_HandleTypeDef SDHandle;
  17. __IO uint8_t RxCplt, TxCplt;

  18. /******** SD Buffer0 definition *******/
  19. #if defined ( __ICCARM__ )
  20. #pragma location = 0x24000000
  21. #elif defined ( __CC_ARM )
  22. __attribute__((section (".RAM_D1")))
  23. #elif defined ( __GNUC__ )
  24. __attribute__((section (".RAM_D1")))
  25. #endif
  26. uint32_t Buffer0[BUFFER_WORD_SIZE];
  27. /**************************************************/

  28. /******** SD Buffer1 definition *******/
  29. #if defined ( __ICCARM__ )
  30. #pragma location = 0x24010000
  31. #elif defined ( __CC_ARM )
  32. __attribute__((section (".RAM_D1")))
  33. #elif defined ( __GNUC__ )
  34. __attribute__((section (".RAM_D1")))
  35. #endif
  36. uint32_t Buffer1[BUFFER_WORD_SIZE];

  37. /**************************************************/
  38. /* UART handler declaration, used for printf */
  39. UART_HandleTypeDef UartHandle;

  40. __IO uint8_t step = 0;
  41. uint32_t start_time = 0;
  42. uint32_t stop_time = 0;
  43. __IO uint32_t RBuff_0=0;
  44. __IO uint32_t RBuff_1=0;
  45. __IO uint32_t WBuff_0=0;
  46. __IO uint32_t WBuff_1=0;
  47. uint32_t address = DATA_ADDRESS;
  48. HAL_StatusTypeDef ReadError= HAL_OK;

  49. /* Private function prototypes -----------------------------------------------*/
  50. static void SystemClock_Config(void);
  51. static void Error_Handler(void);
  52. static void UART_Config(void);
  53. static void CPU_CACHE_Enable(void);

  54. #ifdef __GNUC__ /* __GNUC__ */
  55. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
  56. #else
  57. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
  58. #endif /* __GNUC__ */


  59. /* Private functions ---------------------------------------------------------*/
  60. static void Fill_Buffer(uint32_t *pBuffer, uint16_t BufferLength, uint32_t Offset);
  61. static HAL_StatusTypeDef Buffercmp(uint32_t* pBuffer, uint16_t BufferLength, uint32_t Offset);

  62. /**
  63.   * @brief  Main program
  64.   * @param  None
  65.   * @retval None
  66.   */
  67. int main(void)
  68. {
  69.   uint8_t index=0;

  70.   /* Enable the CPU Cache */
  71.   CPU_CACHE_Enable();
  72.   /* STM32H7xx HAL library initialization:
  73.        - Configure the Systick to generate an interrupt each 1 msec
  74.        - Set NVIC Group Priority to 4
  75.        - Low Level Initialization
  76.      */
  77.   HAL_Init();

  78.   /* Configure the system clock to 400 MHz */
  79.   SystemClock_Config();

  80.   /*##-1- Initialize LEDs mounted on STM32H743I-EVAL board #####################*/
  81.   BSP_LED_Init(LED_GREEN);
  82.   BSP_LED_Init(LED_ORANGE);
  83.   BSP_LED_Init(LED_RED);
  84.   
  85.   /*##-2- Configure USART for printf messages #####################*/
  86.   UART_Config();
  87.   
  88.   /*##-2- Initialize IO functionalities (MFX) #####################*/
  89.   BSP_IO_Init();
  90.   
  91.   /* Initialise Transciver MFXPIN to enable 1.8V Switch mode */
  92.   BSP_IO_ConfigPin(SD_LDO_SEL_PIN, IO_MODE_OUTPUT_PP_PU);
  93.   
  94.   /*##-3- Initialize SD instance #####################*/
  95.   SDHandle.Instance = SDMMC1;
  96.   HAL_SD_DeInit(&SDHandle);
  97.   
  98.   /* SDMMC IP clock 200Mhz, SDCard clock 100Mhz  */
  99.   SDHandle.Init.ClockEdge           = SDMMC_CLOCK_EDGE_RISING;
  100.   SDHandle.Init.ClockPowerSave      = SDMMC_CLOCK_POWER_SAVE_DISABLE;
  101.   SDHandle.Init.BusWide             = SDMMC_BUS_WIDE_4B;
  102.   SDHandle.Init.HardwareFlowControl = SDMMC_HARDWARE_FLOW_CONTROL_DISABLE;
  103.   SDHandle.Init.ClockDiv            = 1;
  104.   
  105.   if(HAL_SD_Init(&SDHandle) != HAL_OK)
  106.   {
  107.     Error_Handler();
  108.   }
  109.   
  110.   while(1)
  111.   {
  112.     switch(step)
  113.     {
  114.       case 0:
  115.       {
  116.         /*##- 4 - Initialize Transmission buffers #####################*/
  117.         Fill_Buffer(Buffer0, BUFFERSIZE, DATA_PATTERN0);
  118.         Fill_Buffer(Buffer1, BUFFERSIZE, DATA_PATTERN1);
  119.         
  120.         address = DATA_ADDRESS;
  121.         index=0;
  122.         RBuff_0=0;
  123.         RBuff_1=0;
  124.         WBuff_0=0;
  125.         WBuff_1=0;

  126.         /* Configure Buffers Address and Buffer Size */
  127.         if(HAL_SDEx_ConfigDMAMultiBuffer(&SDHandle, Buffer0, Buffer1, BUFFER_SIZE) != HAL_OK)
  128.         {
  129.           Error_Handler();
  130.         }
  131.         printf(" ****************** Start Write test ******************* \n");
  132.         printf(" - Buffer size to write: %lu MB   \n", (DATA_SIZE>>20));

  133.         start_time = HAL_GetTick();
  134.         step++;
  135.       }
  136.       break;
  137.       case 1:
  138.       {
  139.         TxCplt = 0;
  140.         /*##- 5 - Start Transmission buffer #####################*/
  141.         if(HAL_SDEx_WriteBlocksDMAMultiBuffer(&SDHandle, address, LOOP_BUFFER_SIZE/BLOCKSIZE) != HAL_OK)
  142.         {
  143.           Error_Handler();
  144.         }
  145.         
  146.         step++;
  147.       }
  148.       break;
  149.       case 2:
  150.       {
  151.         if(TxCplt != 0)
  152.         {
  153.           /* Toogle Led Orange, Transfer of Buffer OK */
  154.           BSP_LED_Toggle(LED_ORANGE);
  155.          
  156.           index++;
  157.           address += LOOP_BUFFER_SIZE/BLOCKSIZE;
  158.          
  159.           if(index < NB_LOOP)
  160.           {
  161.             /* More data need to be trasnfered */
  162.             step--;
  163.           }
  164.           else
  165.           {
  166.             stop_time = HAL_GetTick();
  167.             printf(" - Write Time(ms): %lu  -  Write Speed: %02.2f MB/s  \n", stop_time - start_time, (float)((float)(DATA_SIZE>>10)/(float)(stop_time - start_time)));
  168.             /* All data are transfered */
  169.             step++;
  170.           }
  171.          
  172.         }
  173.       }
  174.       break;
  175.       case 3:
  176.       {
  177.         /*##- 6 - Initialize Reception buffer #####################*/
  178.         Fill_Buffer(Buffer0, BUFFERSIZE, 0);
  179.         Fill_Buffer(Buffer1, BUFFERSIZE, 0);
  180.         address = DATA_ADDRESS;
  181.         index=0;
  182.         
  183.         printf(" ******************* Start Read test ******************* \n");
  184.         printf(" - Buffer size to read: %lu MB   \n", (DATA_SIZE>>20));
  185.         start_time = HAL_GetTick();

  186.         step++;
  187.       }
  188.       break;
  189.       case 4:
  190.       {
  191.         /*##- 7 - Initialize Reception buffer #####################*/
  192.         RxCplt = 0;
  193.         if(HAL_SDEx_ReadBlocksDMAMultiBuffer(&SDHandle, address, LOOP_BUFFER_SIZE/BLOCKSIZE) != HAL_OK)
  194.         {
  195.           Error_Handler();
  196.         }

  197.         step++;
  198.       }
  199.       break;
  200.       case 5:
  201.       {
  202.         if(RxCplt != 0)
  203.         {
  204.           /* Toogle Led Orange, Transfer of Buffer OK */
  205.           BSP_LED_Toggle(LED_ORANGE);
  206.          
  207.          
  208.           /* Transfer of Buffer completed */
  209.           address += LOOP_BUFFER_SIZE/BLOCKSIZE;
  210.           index++;
  211.           if(index<NB_LOOP)
  212.           {
  213.             /* More data need to be trasnfered */
  214.             step--;
  215.           }
  216.           else
  217.           {
  218.             stop_time = HAL_GetTick();
  219.             printf(" - Read Time(ms): %lu  -  Read Speed: %02.2f MB/s  \n", stop_time - start_time, (float)((float)(DATA_SIZE>>10)/(float)(stop_time - start_time)));
  220.             /* All data are transfered */
  221.             step++;
  222.           }

  223.         }
  224.       }
  225.       break;
  226.       case 6:
  227.       {
  228.         /*##- 8 - Check Reception buffer #####################*/
  229.         
  230.         printf(" ********************* Check data ********************** \n");
  231.         
  232.         if(ReadError != HAL_OK)
  233.         {
  234.           printf(" - Check data Error !!!!   \n");
  235.           Error_Handler();
  236.         }
  237.         else
  238.         {
  239.           printf(" - Check data OK  \n");
  240.           /* Toogle Green LED, Check Transfer OK */
  241.           BSP_LED_Toggle(LED_GREEN);
  242.           step=0;
  243.         }
  244.       }
  245.       break;
  246.       default :
  247.         Error_Handler();
  248.     }
  249.   }
  250. }


  251. /**
  252.   * @brief  System Clock Configuration
  253.   *         The system Clock is configured as follow :
  254.   *            System Clock source            = PLL (HSE)
  255.   *            SYSCLK(Hz)                     = 400000000 (CPU Clock)
  256.   *            HCLK(Hz)                       = 200000000 (AXI and AHBs Clock)
  257.   *            AHB Prescaler                  = 2
  258.   *            D1 APB3 Prescaler              = 2 (APB3 Clock  100MHz)
  259.   *            D2 APB1 Prescaler              = 2 (APB1 Clock  100MHz)
  260.   *            D2 APB2 Prescaler              = 2 (APB2 Clock  100MHz)
  261.   *            D3 APB4 Prescaler              = 2 (APB4 Clock  100MHz)
  262.   *            HSE Frequency(Hz)              = 25000000
  263.   *            PLL_M                          = 5
  264.   *            PLL_N                          = 160
  265.   *            PLL_P                          = 2
  266.   *            PLL_Q                          = 4
  267.   *            PLL_R                          = 2
  268.   *            VDD(V)                         = 3.3
  269.   *            Flash Latency(WS)              = 4
  270.   * @param  None
  271.   * @retval None
  272.   */
  273. static void SystemClock_Config(void)
  274. {
  275.   RCC_ClkInitTypeDef   RCC_ClkInitStruct;
  276.   RCC_OscInitTypeDef   RCC_OscInitStruct;
  277.   HAL_StatusTypeDef ret = HAL_OK;

  278.   /*!< Supply configuration update enable */
  279.   MODIFY_REG(PWR->CR3, PWR_CR3_SCUEN, 0);

  280.   /* The voltage scaling allows optimizing the power consumption when the device is
  281.      clocked below the maximum system frequency, to update the voltage scaling value
  282.      regarding system frequency refer to product datasheet.  */
  283.   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

  284.   while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}

  285.   /* Enable HSE Oscillator and activate PLL with HSE as source */
  286.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  287.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  288.   RCC_OscInitStruct.HSIState = RCC_HSI_OFF;
  289.   RCC_OscInitStruct.CSIState = RCC_CSI_OFF;
  290.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  291.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;

  292.   RCC_OscInitStruct.PLL.PLLM = 5;
  293.   RCC_OscInitStruct.PLL.PLLN = 160;
  294.   RCC_OscInitStruct.PLL.PLLP = 2;
  295.   RCC_OscInitStruct.PLL.PLLR = 2;
  296.   RCC_OscInitStruct.PLL.PLLQ = 4;

  297.   RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
  298.   RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;
  299.   ret = HAL_RCC_OscConfig(&RCC_OscInitStruct);
  300.   if(ret != HAL_OK)
  301.   {
  302.     Error_Handler();
  303.   }
  304.   
  305. /* Select PLL as system clock source and configure  bus clocks dividers */
  306.   RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_D1PCLK1 | RCC_CLOCKTYPE_PCLK1 | \
  307.                                   RCC_CLOCKTYPE_PCLK2  | RCC_CLOCKTYPE_D3PCLK1);
  308.   
  309.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  310.   RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
  311.   RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
  312.   RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;  
  313.   RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
  314.   RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
  315.   RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;
  316.   ret = HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4);
  317.   if(ret != HAL_OK)
  318.   {
  319.     Error_Handler();
  320.   }
  321.   
  322.     /*activate CSI clock mondatory for I/O Compensation Cell*/
  323.   __HAL_RCC_CSI_ENABLE() ;

  324.   /* Enable SYSCFG clock mondatory for I/O Compensation Cell */
  325.   __HAL_RCC_SYSCFG_CLK_ENABLE() ;

  326.   /* Enables the I/O Compensation Cell */
  327.   HAL_EnableCompensationCell();
  328. }

  329. /**
  330.   * @brief  Enable the SD Transciver 1.8V Mode Callback.
  331.   * @param  None
  332.   * @retval None
  333.   */
  334. void HAL_SD_DriveTransciver_1_8V_Callback(FlagStatus status)
  335. {
  336.   if(status == SET)
  337.   {
  338.     BSP_IO_WritePin(IO_PIN_13, BSP_IO_PIN_SET);  
  339.   }
  340.   else
  341.   {
  342.     BSP_IO_WritePin(IO_PIN_13, BSP_IO_PIN_RESET);
  343.   }
  344. }

  345. /**
  346.   * @brief Rx Transfer completed callbacks
  347.   * @param hsd: SD handle
  348.   * @retval None
  349.   */
  350. void HAL_SD_RxCpltCallback(SD_HandleTypeDef *hsd)
  351. {
  352.   RxCplt=1;
  353. }

  354. /**
  355.   * @brief Tx Transfer completed callbacks
  356.   * @param hsd: SD handle
  357.   * @retval None
  358.   */
  359. void HAL_SD_TxCpltCallback(SD_HandleTypeDef *hsd)
  360. {
  361.   TxCplt=1;
  362. }

  363. /**
  364.   * @brief SD error callbacks
  365.   * @param hsd: SD handle
  366.   * @retval None
  367.   */
  368. void HAL_SD_ErrorCallback(SD_HandleTypeDef *hsd)
  369. {
  370.   Error_Handler();
  371. }

  372. /**
  373.   * @brief Read DMA Buffer 0 Transfer completed callbacks
  374.   * @param hsd: SD handle
  375.   * @retval None
  376.   */
  377. void HAL_SDEx_Read_DMADoubleBuffer0CpltCallback(SD_HandleTypeDef *hsd)
  378. {
  379.   SCB_InvalidateDCache_by_Addr(Buffer0, BUFFER_WORD_SIZE*4);
  380.   ReadError += Buffercmp(Buffer0, BUFFERSIZE, DATA_PATTERN0 + (RBuff_0 * (uint32_t)0x00010000));
  381.   RBuff_0++;
  382.   
  383. }

  384. /**
  385.   * @brief Read DMA Buffer 1 Transfer completed callbacks
  386.   * @param hsd: SD handle
  387.   * @retval None
  388.   */
  389. void HAL_SDEx_Read_DMADoubleBuffer1CpltCallback(SD_HandleTypeDef *hsd)
  390. {
  391.   SCB_InvalidateDCache_by_Addr(Buffer1, BUFFER_WORD_SIZE*4);
  392.   ReadError += Buffercmp(Buffer1, BUFFERSIZE, DATA_PATTERN1 + (RBuff_1 * (uint32_t)0x00010000));
  393.   RBuff_1++;
  394. }

  395. /**
  396.   * @brief Write DMA Buffer 0 Transfer completed callbacks
  397.   * @param hsd: SD handle
  398.   * @retval None
  399.   */
  400. void HAL_SDEx_Write_DMADoubleBuffer0CpltCallback(SD_HandleTypeDef *hsd)
  401. {
  402.   WBuff_0++;
  403.   Fill_Buffer(Buffer0, BUFFERSIZE, DATA_PATTERN0 + (WBuff_0 * (uint32_t)0x00010000));
  404.   
  405. }

  406. /**
  407.   * @brief Write DMA Buffer 1 Transfer completed callbacks
  408.   * @param hsd: SD handle
  409.   * @retval None
  410.   */
  411. void HAL_SDEx_Write_DMADoubleBuffer1CpltCallback(SD_HandleTypeDef *hsd)
  412. {
  413.   WBuff_1++;
  414.   Fill_Buffer(Buffer1, BUFFERSIZE, DATA_PATTERN1 + (WBuff_1 * (uint32_t)0x00010000));
  415. }
复制代码


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107041
QQ
 楼主| 发表于 2018-9-29 16:09:55 | 显示全部楼层
实例:SD_ReadWrite_IT

这个函数的读写是采用的中断方式,另外一个重要特点是需要在中断函数里面调用函数Wait_SDCARD_Ready等操作完成


  1. /* Private typedef -----------------------------------------------------------*/

  2. /* Private define ------------------------------------------------------------*/
  3. #define DATA_SIZE              ((uint32_t)0x06400000U) /* Data Size 100Mo */

  4. /* ------ Buffer Size ------ */
  5. #define BUFFER_SIZE            ((uint32_t)0x00040000U) /* 256Ko */

  6. #define NB_BUFFER              DATA_SIZE / BUFFER_SIZE
  7. #define NB_BLOCK_BUFFER        BUFFER_SIZE / BLOCKSIZE /* Number of Block (512o) by Buffer */
  8. #define BUFFER_WORD_SIZE       (BUFFER_SIZE>>2)        /* Buffer size in Word */


  9. #define SD_TIMEOUT             ((uint32_t)0x00100000U)
  10. #define ADDRESS                ((uint32_t)0x00000400U) /* SD Address to write/read data */
  11. #define DATA_PATTERN           ((uint32_t)0xB5F3A5F3U) /* Data pattern to write */
  12. /* Private macro -------------------------------------------------------------*/
  13. /* Private variables ---------------------------------------------------------*/
  14. SD_HandleTypeDef SDHandle;
  15. __IO uint8_t RxCplt, TxCplt;

  16. /******** SD Transmission Buffer definition *******/
  17. #if defined ( __ICCARM__ )
  18. #pragma location = 0x24000000
  19. #elif defined ( __CC_ARM )
  20. __attribute__((section (".RAM_D1")))
  21. #elif defined ( __GNUC__ )
  22. __attribute__((section (".RAM_D1")))
  23. #endif
  24. uint8_t aTxBuffer[BUFFER_WORD_SIZE*4];
  25. /**************************************************/

  26. /******** SD Receive Buffer definition *******/
  27. #if defined ( __ICCARM__ )
  28. #pragma location = 0x24040000
  29. #elif defined ( __CC_ARM )
  30. __attribute__((section (".RAM_D1")))
  31. #elif defined ( __GNUC__ )
  32. __attribute__((section (".RAM_D1")))
  33. #endif
  34. uint8_t aRxBuffer[BUFFER_WORD_SIZE*4];
  35. /**************************************************/
  36. /* UART handler declaration, used for printf */
  37. UART_HandleTypeDef UartHandle;

  38. __IO uint8_t step = 0;
  39. uint32_t start_time = 0;
  40. uint32_t stop_time = 0;

  41. /* Private function prototypes -----------------------------------------------*/
  42. static void SystemClock_Config(void);
  43. static void Error_Handler(void);
  44. static void CPU_CACHE_Enable(void);
  45. static void UART_Config(void);
  46. static uint8_t Wait_SDCARD_Ready(void);

  47. #ifdef __GNUC__ /* __GNUC__ */
  48. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
  49. #else
  50. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
  51. #endif /* __GNUC__ */


  52. /* Private functions ---------------------------------------------------------*/
  53. void Fill_Buffer(uint32_t *pBuffer, uint16_t BufferLength, uint32_t Offset);

  54. /**
  55.   * @brief  Main program
  56.   * @param  None
  57.   * @retval None
  58.   */
  59. int main(void)
  60. {
  61.   uint32_t index = 0;

  62.   /* Enable the CPU Cache */
  63.   CPU_CACHE_Enable();
  64.   HAL_SD_CardCIDTypedef pCID;
  65.   HAL_SD_CardCSDTypedef pCSD;

  66.   /* STM32H7xx HAL library initialization:
  67.        - Configure the Systick to generate an interrupt each 1 msec
  68.        - Set NVIC Group Priority to 4
  69.        - Low Level Initialization
  70.      */
  71.   HAL_Init();

  72.   /* Configure the system clock to 400 MHz */
  73.   SystemClock_Config();

  74.   /*##-1- Initialize LEDs mounted on STM32H743I-EVAL board #####################*/
  75.   BSP_LED_Init(LED_GREEN);
  76.   BSP_LED_Init(LED_ORANGE);
  77.   BSP_LED_Init(LED_RED);
  78.   
  79.   /*##-2- Configure USART for printf messages #####################*/
  80.   UART_Config();
  81.   
  82.   /*##-2- Initialize IO functionalities (MFX) #####################*/
  83.   BSP_IO_Init();
  84.   
  85.   /* Initialise Transciver MFXPIN to enable 1.8V Switch mode */
  86.   BSP_IO_ConfigPin(SD_LDO_SEL_PIN, IO_MODE_OUTPUT_PP_PU);
  87.   
  88.   /*##-3- Initialize SD instance #####################*/
  89.   SDHandle.Instance = SDMMC1;
  90.   HAL_SD_DeInit(&SDHandle);
  91.    
  92.   /* SDMMC IP clock 200Mhz, SDCard clock 100Mhz  */
  93.   SDHandle.Init.ClockEdge           = SDMMC_CLOCK_EDGE_RISING;
  94.   SDHandle.Init.ClockPowerSave      = SDMMC_CLOCK_POWER_SAVE_DISABLE;
  95.   SDHandle.Init.BusWide             = SDMMC_BUS_WIDE_4B;
  96.   SDHandle.Init.HardwareFlowControl = SDMMC_HARDWARE_FLOW_CONTROL_DISABLE;
  97.   SDHandle.Init.ClockDiv            = 1;
  98.   
  99.   if(HAL_SD_Init(&SDHandle) != HAL_OK)
  100.   {
  101.     Error_Handler();
  102.   }
  103.   
  104.   if(HAL_SD_Erase(&SDHandle, ADDRESS, ADDRESS+BUFFERSIZE) != HAL_OK)
  105.   {
  106.     Error_Handler();
  107.   }
  108.   if(Wait_SDCARD_Ready() != HAL_OK)
  109.   {
  110.     Error_Handler();
  111.   }
  112.   
  113.   HAL_SD_GetCardCID(&SDHandle, &pCID);
  114.   HAL_SD_GetCardCSD(&SDHandle, &pCSD);
  115.   
  116.   while(1)
  117.   {
  118.     switch(step)
  119.     {
  120.       case 0:
  121.       {
  122.         /*##- 4 - Initialize Transmission buffer #####################*/
  123.         for (index = 0; index < BUFFERSIZE; index++)
  124.         {
  125.           aTxBuffer[index] = DATA_PATTERN + index;
  126.         }
  127.         printf(" ****************** Start Write test ******************* \n");
  128.         printf(" - Buffer size to write: %lu MB   \n", (DATA_SIZE>>20));
  129.         index = 0;
  130.         start_time = HAL_GetTick();
  131.         step++;
  132.       }
  133.       break;
  134.       case 1:
  135.       {
  136.         TxCplt = 0;
  137.         /*##- 5 - Start Transmission buffer #####################*/
  138.         if(HAL_SD_WriteBlocks_IT(&SDHandle, aTxBuffer, ADDRESS, NB_BLOCK_BUFFER) != HAL_OK)
  139.         {
  140.           Error_Handler();
  141.         }
  142.         step++;
  143.       }
  144.       break;
  145.       case 2:
  146.       {
  147.         if(TxCplt != 0)
  148.         {
  149.           /* Toogle Led Orange, Transfer of Buffer OK */
  150.           BSP_LED_Toggle(LED_ORANGE);
  151.          
  152.           /* Transfer of Buffer completed */
  153.           index++;
  154.           if(index<NB_BUFFER)
  155.           {
  156.             /* More data need to be trasnfered */
  157.             step--;
  158.           }
  159.           else
  160.           {
  161.             stop_time = HAL_GetTick();
  162.             printf(" - Write Time(ms): %lu  -  Write Speed: %02.2f MB/s  \n", stop_time - start_time, (float)((float)(DATA_SIZE>>10)/(float)(stop_time - start_time)));
  163.             /* All data are transfered */
  164.             step++;
  165.           }
  166.         }
  167.       }
  168.       break;
  169.       case 3:
  170.       {
  171.         /*##- 6 - Initialize Reception buffer #####################*/
  172.         for (index = 0; index < BUFFERSIZE; index++)
  173.         {
  174.           aRxBuffer[index] = 0;
  175.         }
  176.         printf(" ******************* Start Read test ******************* \n");
  177.         printf(" - Buffer size to read: %lu MB   \n", (DATA_SIZE>>20));
  178.         start_time = HAL_GetTick();
  179.         index = 0;
  180.         step++;
  181.       }
  182.       break;
  183.       case 4:
  184.       {
  185.         /*##- 7 - Initialize Reception buffer #####################*/
  186.         RxCplt = 0;
  187.         if(HAL_SD_ReadBlocks_IT(&SDHandle, aRxBuffer, ADDRESS, NB_BLOCK_BUFFER) != HAL_OK)
  188.         {
  189.           Error_Handler();
  190.         }
  191.         step++;
  192.       }
  193.       break;
  194.       case 5:
  195.       {
  196.         if(RxCplt != 0)
  197.         {
  198.           /* Toogle Led Orange, Transfer of Buffer OK */
  199.           BSP_LED_Toggle(LED_ORANGE);
  200.           /* Transfer of Buffer completed */
  201.           index++;
  202.           if(index<NB_BUFFER)
  203.           {
  204.             /* More data need to be trasnfered */
  205.             step--;
  206.           }
  207.           else
  208.           {
  209.             stop_time = HAL_GetTick();
  210.             printf(" - Read Time(ms): %lu  -  Read Speed: %02.2f MB/s  \n", stop_time - start_time, (float)((float)(DATA_SIZE>>10)/(float)(stop_time - start_time)));
  211.             /* All data are transfered */
  212.             step++;
  213.           }
  214.         }
  215.       }
  216.       break;
  217.       case 6:
  218.       {
  219.         /*##- 8 - Check Reception buffer #####################*/
  220.         index=0;
  221.         printf(" ********************* Check data ********************** \n");
  222.         while((index<BUFFERSIZE) && (aRxBuffer[index] == aTxBuffer[index]))
  223.         {
  224.           index++;
  225.         }
  226.         
  227.         if(index != BUFFERSIZE)
  228.         {
  229.           printf(" - Check data Error !!!!   \n");
  230.           Error_Handler();
  231.         }
  232.         printf(" - Check data OK  \n");
  233.         /* Toogle Green LED, Check Transfer OK */
  234.         BSP_LED_Toggle(LED_GREEN);
  235.         step = 0;
  236.       }
  237.       break;
  238.       default :
  239.         Error_Handler();
  240.     }
  241.   }
  242. }


  243. /**
  244.   * @brief  System Clock Configuration
  245.   *         The system Clock is configured as follow :
  246.   *            System Clock source            = PLL (HSE)
  247.   *            SYSCLK(Hz)                     = 400000000 (CPU Clock)
  248.   *            HCLK(Hz)                       = 200000000 (AXI and AHBs Clock)
  249.   *            AHB Prescaler                  = 2
  250.   *            D1 APB3 Prescaler              = 2 (APB3 Clock  100MHz)
  251.   *            D2 APB1 Prescaler              = 2 (APB1 Clock  100MHz)
  252.   *            D2 APB2 Prescaler              = 2 (APB2 Clock  100MHz)
  253.   *            D3 APB4 Prescaler              = 2 (APB4 Clock  100MHz)
  254.   *            HSE Frequency(Hz)              = 25000000
  255.   *            PLL_M                          = 5
  256.   *            PLL_N                          = 160
  257.   *            PLL_P                          = 2
  258.   *            PLL_Q                          = 4
  259.   *            PLL_R                          = 2
  260.   *            VDD(V)                         = 3.3
  261.   *            Flash Latency(WS)              = 4
  262.   * @param  None
  263.   * @retval None
  264.   */
  265. static void SystemClock_Config(void)
  266. {
  267.   RCC_ClkInitTypeDef RCC_ClkInitStruct;
  268.   RCC_OscInitTypeDef RCC_OscInitStruct;
  269.   HAL_StatusTypeDef ret = HAL_OK;

  270.   /*!< Supply configuration update enable */
  271.   MODIFY_REG(PWR->CR3, PWR_CR3_SCUEN, 0);

  272.   /* The voltage scaling allows optimizing the power consumption when the device is
  273.      clocked below the maximum system frequency, to update the voltage scaling value
  274.      regarding system frequency refer to product datasheet.  */
  275.   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

  276.   while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}

  277.   /* Enable HSE Oscillator and activate PLL with HSE as source */
  278.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  279.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  280.   RCC_OscInitStruct.HSIState = RCC_HSI_OFF;
  281.   RCC_OscInitStruct.CSIState = RCC_CSI_OFF;
  282.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  283.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;

  284.   RCC_OscInitStruct.PLL.PLLM = 5;
  285.   RCC_OscInitStruct.PLL.PLLN = 160;
  286.   RCC_OscInitStruct.PLL.PLLP = 2;
  287.   RCC_OscInitStruct.PLL.PLLR = 2;
  288.   RCC_OscInitStruct.PLL.PLLQ = 4;

  289.   RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
  290.   RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;
  291.   ret = HAL_RCC_OscConfig(&RCC_OscInitStruct);
  292.   if(ret != HAL_OK)
  293.   {
  294.     Error_Handler();
  295.   }
  296.   
  297. /* Select PLL as system clock source and configure  bus clocks dividers */
  298.   RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_D1PCLK1 | RCC_CLOCKTYPE_PCLK1 | \
  299.                                   RCC_CLOCKTYPE_PCLK2  | RCC_CLOCKTYPE_D3PCLK1);
  300.   
  301.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  302.   RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
  303.   RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
  304.   RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;  
  305.   RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
  306.   RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
  307.   RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;
  308.   ret = HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4);
  309.   if(ret != HAL_OK)
  310.   {
  311.     Error_Handler();
  312.   }

  313.   
  314.   /*activate CSI clock mondatory for I/O Compensation Cell*/  
  315.   __HAL_RCC_CSI_ENABLE() ;
  316.    
  317.   /* Enable SYSCFG clock mondatory for I/O Compensation Cell */
  318.   __HAL_RCC_SYSCFG_CLK_ENABLE() ;
  319.   
  320.   /* Enables the I/O Compensation Cell */   
  321.   HAL_EnableCompensationCell();
  322. }

  323. /**
  324.   * @brief  Enable the SD Transciver 1.8V Mode Callback.
  325.   * @param  None
  326.   * @retval None
  327.   */
  328. void HAL_SD_DriveTransciver_1_8V_Callback(FlagStatus status)
  329. {
  330.   if(status == SET)
  331.   {
  332.     BSP_IO_WritePin(IO_PIN_13, BSP_IO_PIN_SET);  
  333.   }
  334.   else
  335.   {
  336.     BSP_IO_WritePin(IO_PIN_13, BSP_IO_PIN_RESET);
  337.   }
  338. }

  339. /**
  340.   * @brief Rx Transfer completed callbacks
  341.   * @param hsd: SD handle
  342.   * @retval None
  343.   */
  344. void HAL_SD_RxCpltCallback(SD_HandleTypeDef *hsd)
  345. {
  346.   if(Wait_SDCARD_Ready() != HAL_OK)
  347.   {
  348.     Error_Handler();
  349.   }
  350.   RxCplt=1;
  351. }

  352. /**
  353.   * @brief Tx Transfer completed callbacks
  354.   * @param hsd: SD handle
  355.   * @retval None
  356.   */
  357. void HAL_SD_TxCpltCallback(SD_HandleTypeDef *hsd)
  358. {
  359.   if(Wait_SDCARD_Ready() != HAL_OK)
  360.   {
  361.     Error_Handler();
  362.   }
  363.   TxCplt=1;
  364. }

  365. /**
  366.   * @brief SD error callbacks
  367.   * @param hsd: SD handle
  368.   * @retval None
  369.   */
  370. void HAL_SD_ErrorCallback(SD_HandleTypeDef *hsd)
  371. {
  372.   Error_Handler();
  373. }
复制代码



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-15 10:07 , Processed in 0.187106 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表