硬汉嵌入式论坛

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

[SD/SDIO] STM32H7的SDIO中断实现方式比较特殊,需要在中断里面调用阻塞函数Wait_SDCARD_Ready查询

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2018-9-30 00:05:35 | 显示全部楼层 |阅读模式
还是DMA方式更加实用。

官方对此有配套一个例子:SD_ReadWrite_IT



实现的测试代码:

  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-16 06:19 , Processed in 0.141470 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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