資源簡介
本代碼是為基于RTThread操作系統的STM32F407單片機開發的SD卡驅動,能夠進行文件讀寫功能。

代碼片段和文件信息
/*
?*?@File:???drv_sdcard.c?
?*?@Author:?tianqf?
?*?@Date:???2018-1-23?17:35:46
?*?
?*?@LICENSE:?
?*?The?code?owner?is?tianqf.?Other?personnel?may?
?*?not?be?used?or?modified.
?*?
?*?Change?Logs:?
?*?Date???????????Author???????Notes?
?*?2018-1-23??????tianqf?????The?first?version.?
?*/?
?
#include?“drv_sdcard.h“
#include?“stm32f4xx.h“
#include?“sdio_sd.h“
#ifndef?SDCARD_SECTOR_SIZE
#define?SDCARD_SECTOR_SIZE?512
#endif
rt_err_t?sdcard_init(void)
{
????rt_uint8_t?ret?=?SD_OK;
???
????ret?=?SD_Init();
????if?(ret?==?SD_OK)
{
return?SD_OK;
}
else
{
return?SD_ERROR;
}
}
rt_uint8_t?sdcard_read_blocks(rt_uint32_t?*buf?uint64_t?sector?rt_uint32_t?cnt)
{
????rt_uint8_t?ret?=?SD_OK;
#if?defined?(SD_DMA_MODE)
????ret?=?SD_ReadBlock((uint8_t?*)buf?sector?cnt);
????if(ret?!=?SD_OK)
????{
????????return?RT_ERROR;
????}
????ret?=?SD_WaitReadOperation();
????if(ret?!=?SD_OK)
????{
????????return?RT_ERROR;
????}
#else
????ret?=?SD_ReadBlock((uint8_t?*)buf?sector?cnt);
????if(ret?!=?SD_OK)
????{
????????return?RT_ERROR;
????}
#endif
????return?RT_EOK;
}
rt_uint8_t?sdcard_write_blocks(rt_uint32_t?*buf?uint64_t?sector?rt_uint32_t?cnt)
{
????rt_uint8_t?ret?=?SD_OK;
????
#if?defined?(SD_DMA_MODE)
????ret?=?SD_WriteBlock((uint8_t?*)buf?sector?cnt);
????if(ret?!=?SD_OK)
????{
????????return?RT_ERROR;
????}
????ret?=?SD_WaitWriteOperation();
????if(ret?!=?SD_OK)
????{
????????return?RT_ERROR;
????}
????
#else
????ret?=?SD_WriteBlock((uint8_t?*)buf?sector?cnt);
????if(ret?!=?SD_OK)
????{
????????return?RT_ERROR;
????}
#endif
????return?RT_EOK;
}
static?struct?rt_device?sdcard_device;
static?struct?rt_semaphore?sd_lock;
/*?RT-Thread?Device?Driver?Interface?*/
static?rt_err_t?rt_sdcard_init(rt_device_t?dev)
{
????
????if?(rt_sem_init(&sd_lock?“sdlock“?1?RT_IPC_FLAG_FIFO)?!=?RT_EOK)
????{
????????return?RT_ERROR;
????}
????return?RT_EOK;
}
static?rt_err_t?rt_sdcard_open(rt_device_t?dev?rt_uint16_t?oflag)
{
????return?RT_EOK;
}
static?rt_err_t?rt_sdcard_close(rt_device_t?dev)
{
????return?RT_EOK;
}
static?rt_uint32_t?sdio_buffer[512/sizeof(uint32_t)];
static?rt_size_t?rt_sdcard_read(rt_device_t?dev?rt_off_t?pos?void*?buffer?rt_size_t?size)
{
????rt_uint8_t?status?=?SD_OK;
????rt_sem_take(&sd_lock?RT_WAITING_FOREVER);
????if(((rt_uint32_t)buffer?&?0x03)?!=?0)
????{
????????/*?non-aligned.?*/
????????uint32_t?i;
????????uint64_t?sector_adr;
????????uint8_t*?copy_buffer;
????????sector_adr??=?(uint64_t)pos*SDCARD_SECTOR_SIZE;
????????copy_buffer?=?(uint8_t*)buffer;
????????for(i=0;?i ????????{
????????????status?=?sdcard_read_blocks(sdio_buffer?sector_adr?1);?
????????????rt_memcpy(copy_buffer?sdio_buffer?SDCARD_SECTOR_SIZE);?
????????????sector_adr??+=?SDCARD_SECTOR_SIZE;
????????????copy_buffer?+=?SDCARD_SECTOR_SIZE;
????????}
????}
????else
????{
????????status?=
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????????6072??2018-05-25?13:42??drv_sdcard.c
?????文件?????????478??2018-05-25?13:42??drv_sdcard.h
?????文件???????90898??2018-05-25?13:42??sdio_sd.c
?????文件???????18540??2018-05-25?13:42??sdio_sd.h
- 上一篇:bme280溫濕度大氣壓強傳感器驅動程序
- 下一篇:NS2中輸出隊列長度!!!
評論
共有 條評論