freertos_f407/User/board/sd.c

102 lines
2.9 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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;
}
}