一.创建工程
1.版本状态:
芯片:STM32F767IG
固件版本:HAL1.9.0
FatFs版本:R0.12c
2.创建过程
2.1选择好芯片 开启外部时钟,根据TF卡连接的引脚开启SDMMC1
2.2设置时钟 /25 X432 P:/2 Q:/9 APB1:/4 APB2:/4
2.3设置 SDMMC1的时钟: PLL48CLK
2.4配置工程:
选择:FATFS --> SD Card
配置FATFS :
USE_STRFUNC (String functions) | Enabled without LF -> CRLF conversion |
CODE_PAGE (Code page on target) | Simplified Chinese (DBCS) |
USE_LFN (Use Long Filename) | Enabled with dynamic working buffer on the STACK |
2.5配置 SDMMC1 DMA RX TX
2.6配置中断优先级
SDMMC1 global interrupt | true | 4 | 0 |
DMA2 stream3 global interrupt | true | 5 | 0 |
DMA2 stream6 global interrupt | true | 5 | 0 |
2.7选择 生成独立文件夹
2.8根据你的IDE 生成 工程文件
二.修改工程文件
新生成的文件无法直接运行
经过调试发现会卡在
sd_diskio.c
DRESULT SD_read(BYTE lun, BYTE *buff, DWORD sector, UINT count)
这个函数的如下位置:
退出的条件一个是 超时 一个是ReadStatus =1
这个超时是默认 30秒,没问题,然后全局查找 ReadStatus 找到如下 ReadStatus = 1 的 执行函数
在 sd_diskio.c 中找到如下
注释中有提示:
===============================================================================
Select the correct function signature depending on your platform.
please refer to the file "stm32xxxx_eval_sd.h" to verify the correct function
prototype
===============================================================================
意思就是 要根据你自己的平台去配置这个调用,参考 stm32xxxx_eval_sd.h
从如下路径找到
en.stm32cubef7\STM32Cube_FW_F7_V1.9.0\Drivers\BSP\STM32F769I_EVAL\stm32xxxx_eval_sd.c
发现这个 BSP_SD_ReadCpltCallback 被 HAL_SD_RxCpltCallback 调用
回到我们自己创建的工程 全局查找 : HAL_SD_RxCpltCallback
在 stm32f7xx_hal_sd.c 中 分别被 如下两个函数调用:
然后根据 stm32xxxx_eval_sd.c 里面的实现 添加 一下函数 到 自己工程的 sd_diskio.c 文件下
1 /** 2 3 * @brief BSP SD Abort callbacks 4 5 * @retval None 6 7 */ 8 9 __weak void BSP_SD_AbortCallback(void) 10 11 { 12 13 14 15 } 16 17 18 19 /** 20 21 * @brief BSP Tx Transfer completed callbacks 22 23 * @retval None 24 25 */ 26 27 //__weak void BSP_SD_WriteCpltCallback(void) 28 29 //{ 30 31 // 32 33 //} 34 35 36 37 /** 38 39 * @brief BSP Rx Transfer completed callbacks 40 41 * @retval None 42 43 */ 44 45 //__weak void BSP_SD_ReadCpltCallback(void) 46 47 //{ 48 49 // 50 51 //} 52 53 54 55 56 57 /** 58 59 * @brief BSP Error callbacks 60 61 * @retval None 62 63 */ 64 65 __weak void BSP_SD_ErrorCallback(void) 66 67 { 68 69 70 71 } 72 73 74 75 76 77 78 79 80 81 /** 82 83 * @brief BSP SD Transceiver 1.8V Mode Callback. 84 85 */ 86 87 __weak void BSP_SD_DriveTransciver_1_8V_Callback(FlagStatus status) 88 89 { 90 91 92 93 } 94 95 96 97 /* USER CODE BEGIN lastSection */ 98 99 /** 100 101 * @brief SD Abort callbacks 102 103 * @param hsd: SD handle 104 105 * @retval None 106 107 */ 108 109 void HAL_SD_AbortCallback(SD_HandleTypeDef *hsd) 110 111 { 112 113 BSP_SD_AbortCallback(); 114 115 } 116 117 118 119 120 121 /** 122 123 * @brief Tx Transfer completed callbacks 124 125 * @param hsd: SD handle 126 127 * @retval None 128 129 */ 130 131 void HAL_SD_TxCpltCallback(SD_HandleTypeDef *hsd) 132 133 { 134 135 BSP_SD_WriteCpltCallback(); 136 137 } 138 139 140 141 /** 142 143 * @brief Rx Transfer completed callbacks 144 145 * @param hsd: SD handle 146 147 * @retval None 148 149 */ 150 151 void HAL_SD_RxCpltCallback(SD_HandleTypeDef *hsd) 152 153 { 154 155 BSP_SD_ReadCpltCallback(); 156 157 } 158 159 160 161 /** 162 163 * @brief Error callbacks 164 165 * @param hsd: SD handle 166 167 * @retval None 168 169 */ 170 171 void HAL_SD_ErrorCallback(SD_HandleTypeDef *hsd) 172 173 { 174 175 BSP_SD_ErrorCallback(); 176 177 } 178 179 /** 180 181 * @brief Enable the SD Transceiver 1.8V Mode Callback. 182 183 */ 184 185 void HAL_SD_DriveTransciver_1_8V_Callback(FlagStatus status) 186 187 { 188 189 BSP_SD_DriveTransciver_1_8V_Callback(status); 190 191 }