#include "sd.h" SD_HandleTypeDef _handle; #define NUM_OF_BLOCKS 1 #define TEST_ADDRESS 0 #define TEST_BLOCK_SIZE ((BLOCKSIZE * NUM_OF_BLOCKS) >> 2) // 定义数据大小,SD块大小为512字节,因为是32位的数组,所以这里除以4 void sd_test(void) { BOOL ret = FALSE; uint32_t i = 0; uint32_t write_buffer[TEST_BLOCK_SIZE]; uint32_t read_buffer[TEST_BLOCK_SIZE]; for (i = 0; i < TEST_BLOCK_SIZE; i++) // 将要写入SD卡的数据写入数组 { write_buffer[i] = i + 3; } ret = sd_erase(TEST_ADDRESS, NUM_OF_BLOCKS); DBG_ASSERT(ret == TRUE __DBG_LINE); while (sd_get_card_state() == FALSE) ; } /** * @brief 获取SD卡的状态 * * 该函数用于获取SD卡的当前状态,并返回一个布尔值表示SD卡是否处于传输状态。 * * @return BOOL - 如果SD卡处于传输状态,则返回TRUE,否则返回FALSE。 */ BOOL sd_get_card_state(void) { return ((HAL_SD_GetCardState(&_handle) == HAL_SD_CARD_TRANSFER) ? TRUE : FALSE); } /** * @brief 擦除SD卡指定地址范围的数据 * * 该函数用于擦除SD卡上从指定的起始地址到结束地址之间的数据。 * * @param start_address - 擦除操作的起始地址 * @param end_address - 擦除操作的结束地址 * @return BOOL - 如果擦除操作成功,则返回TRUE,否则返回FALSE。 */ BOOL sd_erase(uint32_t start_address, uint32_t end_address) { if (HAL_SD_Erase(&_handle, start_address, end_address) != HAL_OK) { return FALSE; } else { return TRUE; } } /** * @brief 使用DMA方式从SD卡读取多个数据块 * * 该函数用于通过DMA方式从SD卡的指定地址读取多个数据块,并将数据存储在指定的缓冲区中。 * * @param data - 指向存储读取数据的缓冲区的指针 * @param read_address - 读取操作的起始地址 * @param blocks - 要读取的数据块数量 * @return BOOL - 如果读取操作成功,则返回TRUE,否则返回FALSE。 */ BOOL sd_read_blocks_dma(uint32_t *data, uint32_t read_address, uint32_t blocks) { if (HAL_SD_ReadBlocks_DMA(&_handle, (uint8_t *)data, read_address, blocks) != HAL_OK) { return FALSE; } else { return TRUE; } } /** * @brief 使用DMA方式向SD卡写入多个数据块 * * 该函数用于通过DMA方式向SD卡的指定地址写入多个数据块。 * * @param data - 指向要写入数据的缓冲区的指针 * @param write_address - 写入操作的起始地址 * @param blocks - 要写入的数据块数量 * @return BOOL - 如果写入操作成功,则返回TRUE,否则返回FALSE。 */ BOOL sd_write_blocks_dma(uint32_t *data, uint32_t write_address, uint32_t blocks) { if (HAL_SD_WriteBlocks_DMA(&_handle, (uint8_t *)data, write_address, blocks) != HAL_OK) { return FALSE; } else { return TRUE; } }