色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于STM32采用CS創世 SD NAND(貼片SD卡)完成FATFS文件系統移植與測試

深圳市雷龍發展有限公司 ? 2023-02-17 16:33 ? 次閱讀

一、前言
STM32項目開發中,經常會用到存儲芯片存儲數據。 比如:關機時保存機器運行過程中的狀態數據,上電再從存儲芯片里讀取數據恢復;在存儲芯片里也會存放很多資源文件。比如,開機音樂,界面上的菜單圖標,字庫文件,方便設備開機加載。
為了讓單片機更加方便的讀寫這些資源文件,通常都會加文件系統,如果沒有文件系統,直接讀取寫扇區的方式,對數據不好管理。 這篇文章就手把手教大家,在STM32上完成FATFS文件系統的移植;主控芯片采用STM32F103ZET6, 存儲芯片我這里采用(雷龍) CS創世 SD NAND 。 SD NAND 簡單來說就是貼片式SD卡,使用起來與普通的SD卡一樣,簡單的區別就是:比TF卡穩定,比eMMC便宜。 下面章節里會詳細介紹下 CS創世 SD NAND。
下面是CS創世 SD NAND 與STM32開發的板的接線實物圖:
這是讀寫扇區測試的結果:
二、SD NAND 介紹
我當前使用的SD NAND型號是,CSNP32GCR01-AOW,容量是4GB。
下面是通過編寫STM32代碼讀取的存儲信息
芯片的詳細參數如下:
【1】不用寫驅動程序自帶壞塊管理
【2】尺寸小巧,簡單易用,兼容性強,穩定可靠,固件可定制,LGA-8封裝
【3】標準SDIO接口,兼容SPI,兼容拔插式TF卡/SD卡,可替代普通TF卡/SD卡
【4】尺寸6.2x8mm,直接貼片,不占空間
【5】內置平均讀寫算法,通過1萬次隨機掉電測試
【6】耐高低溫,機貼手貼都非常方便
【7】速度級別Class10(讀取速度23.5MB/S寫入速度12.3MB/S)
【8】支持標準的SD 2.0協議,用戶可以直接移植標準驅動代碼,省去了驅動代碼編程環節。支持TF卡啟動的SOC都可以用SD NAND
【9】比TF卡穩定,比eMMC便宜
這是官網申請的樣品,焊接了轉接板,可以直接插在SD卡卡槽上測試。 最終選型之后,設計PCB板時,設計接口,直接貼片上去使用,非常穩定,抖動也不會導致,外置卡TF卡這種容易松動的問題。
三、編寫SD NAND驅動代碼
SD NAND 的驅動代碼與正常的SD卡協議是一樣的,支持標準的SD 2.0協議,下面我就直接貼出寫好的驅動代碼。
包括了模擬SPI,硬件SPI,SDIO等3種方式,完成對SD NAND 的讀寫。我當前使用的主控板子是STM32F103ZET6,如果你使用的板子不是這一款,可能還是其他的CPU也沒關系;我這里直接貼出了SPI模擬時序的驅動代碼,可以直接移植到任何單片機上使用,代碼拷貝過去也只需要修改GPIO口即可,非常方便。
3.1 SPI模擬時序驅動方式
(1)整體工程代碼
這是當前工程的截圖: 代碼采用寄存器風格編寫,非常簡潔。
當前工程完成SD NAND卡初始化,扇區的讀寫,測試芯片基本的使用情況。
(2) sd.c
#include "sdcard.h"
static u8 SD_Type=0; //存放SD卡的類型
/*
函數功能:SD卡底層接口,通過SPI時序向SD卡讀寫一個字節
函數參數:data是要寫入的數據
返 回 值:讀到的數據
*/
u8 SDCardReadWriteOneByte(u8 DataTx)
{
u8 i;
u8 data=0;
for(i=0;i<8;i++)
{
SDCARD_SCK=0;
if(DataTx&0x80)SDCARD_MOSI=1;
else SDCARD_MOSI=0;
SDCARD_SCK=1;
DataTx<<=1;
data<<=1;
if(SDCARD_MISO)data|=0x01;
}
return data;
}
//4種: 邊沿兩種、電平是兩種
/*
函數功能:底層SD卡接口初始化
本程序SPI接口如下:
PC11 片選 SDCardCS
PC12 時鐘 SDCardSCLK
PD2 輸出 SPI_MOSI--主機輸出從機輸入
PC8 輸入 SPI_MISO--主機輸入從機輸出
*/
void SDCardSpiInit(void)
{
/*1. 開啟時鐘*/
RCC->APB2ENR|=1<<5; ? ? //使能PORTD時鐘
RCC->APB2ENR|=1<<4; ? ? //使能PORTC時鐘
/*2. 配置GPIO口模式*/
GPIOC->CRH&=0xFFF00FF0;
GPIOC->CRH|=0x00033008;
GPIOD->CRL&=0xFFFFF0FF;
GPIOD->CRL|=0x00000300;
/*3. 上拉*/
GPIOC->ODR|=1<<8;
GPIOC->ODR|=1<<11;
GPIOC->ODR|=1<<12;
GPIOD->ODR|=1<<2;
}
/*
函數功能:取消選擇,釋放SPI總線
*/
void SDCardCancelCS(void)
{
SDCARD_CS=1;
SDCardReadWriteOneByte(0xff);//提供額外的8個時鐘
}
/*
函數 功 能:選擇sd卡,并且等待卡準備OK
函數返回值:0,成功;1,失敗;
*/
void SDCardSelectCS(void)
{
SDCARD_CS=0;
SDCardWaitBusy();//等待成功
}
/*
函數 功 能:等待卡準備好
函數返回值:0,準備好了;其他,錯誤代碼
*/
void SDCardWaitBusy(void)
{
while(SDCardReadWriteOneByte(0XFF)!=0XFF){}
}
/*
函數功能:等待SD卡回應
函數參數:
Response:要得到的回應值
返 回 值:
0,成功得到了該回應值
其他,得到回應值失敗
*/
u8 SDCardGetAck(u8 Response)
{
u16 Count=0xFFFF;//等待次數
while((SDCardReadWriteOneByte(0XFF)!=Response)&&Count)Count--;//等待得到準確的回應
if(Count==0)return SDCard_RESPONSE_FAILURE;//得到回應失敗
else return SDCard_RESPONSE_NO_ERROR;//正確回應
}
/*
函數功能:從sd卡讀取一個數據包的內容
函數參數:
buf:數據緩存區
len:要讀取的數據長度.
返回值:
0,成功;其他,失敗;
*/
u8 SDCardRecvData(u8*buf,u16 len)
{
if(SDCardGetAck(0xFE))return 1;//等待SD卡發回數據起始令牌0xFE
while(len--)//開始接收數據
{
*buf=SDCardReadWriteOneByte(0xFF);
buf++;
}
//下面是2個偽CRC(dummy CRC)
SDCardReadWriteOneByte(0xFF);
SDCardReadWriteOneByte(0xFF);
return 0;//讀取成功
}
/*
函數功能:向sd卡寫入一個數據包的內容 512字節
函數參數:
buf 數據緩存區
cmd 指令
返 回 值:0表示成功;其他值表示失敗;
*/
u8 SDCardSendData(u8*buf,u8 cmd)
{
u16 t;
SDCardWaitBusy(); //等待忙狀態
SDCardReadWriteOneByte(cmd);
if(cmd!=0XFD)//不是結束指令
{
for(t=0;t<512;t++)SDCardReadWriteOneByte(buf[t]);//提高速度,減少函數傳參時間
SDCardReadWriteOneByte(0xFF); //忽略crc
SDCardReadWriteOneByte(0xFF);
t=SDCardReadWriteOneByte(0xFF); //接收響應
if((t&0x1F)!=0x05)return 2; //響應錯誤
}
return 0;//寫入成功
}
/*
函數功能:向SD卡發送一個命令
函數參數:
u8 cmd 命令
u32 arg 命令參數
u8 crc crc校驗值
返回值:SD卡返回的響應
*/
u8 SendSDCardCmd(u8 cmd, u32 arg, u8 crc)
{
u8 r1;
SDCardCancelCS(); //取消上次片選
SDCardSelectCS(); //選中SD卡
//發送數據
SDCardReadWriteOneByte(cmd | 0x40);//分別寫入命令
SDCardReadWriteOneByte(arg >> 24);
SDCardReadWriteOneByte(arg >> 16);
SDCardReadWriteOneByte(arg >> 8);
SDCardReadWriteOneByte(arg);
SDCardReadWriteOneByte(crc);
if(cmd==SDCard_CMD12)SDCardReadWriteOneByte(0xff);//Skip a stuff byte when stop reading
do
{
r1=SDCardReadWriteOneByte(0xFF);
}while(r1&0x80); //等待響應,或超時退出
return r1; //返回狀態值
}
/*
函數功能:獲取SD卡的CID信息,包括制造商信息
函數參數:u8 *cid_data(存放CID的內存,至少16Byte)
返 回 值:
0:成功,1:錯誤
*/
u8 GetSDCardCISDCardOutnfo(u8 *cid_data)
{
u8 r1;
//發SDCard_CMD10命令,讀CID
r1=SendSDCardCmd(SDCard_CMD10,0,0x01);
if(r1==0x00)
{
r1=SDCardRecvData(cid_data,16);//接收16個字節的數據
}
SDCardCancelCS();//取消片選
if(r1)return 1;
else return 0;
}
/*
函數說明:
獲取SD卡的CSD信息,包括容量和速度信息
函數參數:
u8 *cid_data(存放CID的內存,至少16Byte)
返 回 值:
0:成功,1:錯誤
*/
u8 GetSDCardCSSDCardOutnfo(u8 *csd_data)
{
u8 r1;
r1=SendSDCardCmd(SDCard_CMD9,0,0x01); //發SDCard_CMD9命令,讀CSD
if(r1==0)
{
r1=SDCardRecvData(csd_data, 16);//接收16個字節的數據
}
SDCardCancelCS();//取消片選
if(r1)return 1;
else return 0;
}
/*
函數功能:獲取SD卡的總扇區數(扇區數)
返 回 值:
0表示容量檢測出錯,其他值表示SD卡的容量(扇區數/512字節)
說 明:
每扇區的字節數必為512字節,如果不是512字節,則初始化不能通過.
*/
u32 GetSDCardSectorCount(void)
{
u8 csd[16];
u32 Capacity;
u16 csize;
if(GetSDCardCSSDCardOutnfo(csd)!=0) return 0; //取CSD信息,如果期間出錯,返回0
if((csd[0]&0xC0)==0x40) //SDHC卡,按照下面方式計算
{
csize = csd[9] + ((u16)csd[8] << 8) + 1;
Capacity = (u32)csize << 10;//得到扇區數 ? ? ?
}
return Capacity;
}
/*
函數功能: 初始化SD卡
返 回 值: 非0表示初始化失敗!
*/
u8 SDCardDeviceInit(void)
{
u8 r1; // 存放SD卡的返回值
u8 buf[4];
u16 i;
SDCardSpiInit();//初始化底層IO口
for(i=0;i<10;i++)SDCardReadWriteOneByte(0xFF); //發送最少74個脈沖
do
{
r1=SendSDCardCmd(SDCard_CMD0,0,0x95);//進入IDLE狀態 閑置
}while(r1!=0X01);
SD_Type=0; //默認無卡
if(r1==0X01)
{
if(SendSDCardCmd(SDCard_CMD8,0x1AA,0x87)==1) //SD V2.0
{
for(i=0;i<4;i++)buf[i]=SDCardReadWriteOneByte(0XFF);
if(buf[2]==0X01&&buf[3]==0XAA) //卡是否支持2.7~3.6V
{
do
{
SendSDCardCmd(SDCard_CMD55,0,0X01); //發送SDCard_CMD55
r1=SendSDCardCmd(SDCard_CMD41,0x40000000,0X01);//發送SDCard_CMD41
}while(r1);
if(SendSDCardCmd(SDCard_CMD58,0,0X01)==0)//鑒別SD2.0卡版本開始
{
for(i=0;i<4;i++)buf[i]=SDCardReadWriteOneByte(0XFF);//得到OCR值
if(buf[0]&0x40)SD_Type=SDCard_TYPE_V2HC; //檢查CCS
else SD_Type=SDCard_TYPE_V2;
}
}
}
}
printf("SD_Type=0x%X\r\n",SD_Type);
SDCardCancelCS(); //取消片選
if(SD_Type)return 0; //初始化成功返回0
else if(r1)return r1; //返回值錯誤值
return 0xaa; //其他錯誤
}
/*
函數功能:讀SD卡
函數參數:
buf:數據緩存區
sector:扇區
cnt:扇區數
返回值:
0,ok;其他,失敗.
說 明:
SD卡一個扇區大小512字節
*/
u8 SDCardReadData(u8*buf,u32 sector,u32 cnt)
{
u8 r1;
if(SD_Type!=SDCard_TYPE_V2HC)sector<<=9;//轉換為字節地址
if(cnt==1)
{
r1=SendSDCardCmd(SDCard_CMD17,sector,0X01);//讀命令
if(r1==0) //指令發送成功
{
r1=SDCardRecvData(buf,512); //接收512個字節
}
}else
{
r1=SendSDCardCmd(SDCard_CMD18,sector,0X01);//連續讀命令
do
{
r1=SDCardRecvData(buf,512);//接收512個字節
buf+=512;
}while(--cnt && r1==0);
SendSDCardCmd(SDCard_CMD12,0,0X01); //發送停止命令
}
SDCardCancelCS();//取消片選
return r1;//
}
/*
函數功能:向SD卡寫數據
函數參數:
buf:數據緩存區
sector:起始扇區
cnt:扇區數
返回值:
0,ok;其他,失敗.
說 明:
SD卡一個扇區大小512字節
*/
u8 SDCardWriteData(u8*buf,u32 sector,u32 cnt)
{
u8 r1;
if(SD_Type!=SDCard_TYPE_V2HC)sector *= 512;//轉換為字節地址
if(cnt==1)
{
r1=SendSDCardCmd(SDCard_CMD24,sector,0X01);//讀命令
if(r1==0)//指令發送成功
{
r1=SDCardSendData(buf,0xFE);//寫512個字節
}
}
else
{
if(SD_Type!=SDCard_TYPE_MMC)
{
SendSDCardCmd(SDCard_CMD55,0,0X01);
SendSDCardCmd(SDCard_CMD23,cnt,0X01);//發送指令
}
r1=SendSDCardCmd(SDCard_CMD25,sector,0X01);//連續讀命令
if(r1==0)
{
do
{
r1=SDCardSendData(buf,0xFC);//接收512個字節
buf+=512;
}while(--cnt && r1==0);
r1=SDCardSendData(0,0xFD);//接收512個字節
}
}
SDCardCancelCS();//取消片選
return r1;//
}
(3) sd.h
#ifndef SD_H
#define SD_H_
#include "stm32f10x.h"
#include "led.h"
#include "usart.h"
/*----------------------------------------------
本程序SPI接口如下:
PC11 片選 SDCardCS
PC12 時鐘 SDCardSCLK
PD2 輸出 SPI_MOSI--主機輸出從機輸入
PC8 輸入 SPI_MISO--主機輸入從機輸出
------------------------------------------------*/
#define SDCARD_CS PCout(11)
#define SDCARD_SCK PCout(12)
#define SDCARD_MOSI PDout(2)
#define SDCARD_MISO PCin(8)
// SD卡類型定義
#define SDCard_TYPE_ERR 0X00 //卡類型錯誤
#define SDCard_TYPE_MMC 0X01 //MMC卡
#define SDCard_TYPE_V1 0X02
#define SDCard_TYPE_V2 0X04
#define SDCard_TYPE_V2HC 0X06
// SD卡指令表
#define SDCard_CMD0 0 //卡復位
#define SDCard_CMD1 1
#define SDCard_CMD8 8 //命令8 ,SEND_IF_COND
#define SDCard_CMD9 9 //命令9 ,讀CSD數據
#define SDCard_CMD10 10 //命令10,讀CID數據
#define SDCard_CMD12 12 //命令12,停止數據傳輸
#define SDCard_CMD13 16 //命令16,設置扇區大小 應返回0x00
#define SDCard_CMD17 17 //命令17,讀扇區
#define SDCard_CMD18 18 //命令18,讀Multi 扇區
#define SDCard_CMD23 23 //命令23,設置多扇區寫入前預先擦除N個block
#define SDCard_CMD24 24 //命令24,寫扇區
#define SDCard_CMD25 25 //命令25,寫多個扇區
#define SDCard_CMD41 41 //命令41,應返回0x00
#define SDCard_CMD55 55 //命令55,應返回0x01
#define SDCard_CMD58 58 //命令58,讀OCR信息
#define SDCard_CMD59 59 //命令59,使能/禁止CRC,應返回0x00、
/*SD卡回應標記字*/
#define SDCard_RESPONSE_NO_ERROR 0x00 //正確回應
#define SDCard_SD_IN_IDLE_STATE 0x01 //閑置狀態
#define SDCard_SD_ERASE_RESET 0x02 //擦除復位
#define SDCard_RESPONSE_FAILURE 0xFF //響應失敗
//函數聲明
u8 SDCardReadWriteOneByte(u8 data); //底層接口,SPI讀寫字節函數
void SDCardWaitBusy(void); //等待SD卡準備
u8 SDCardGetAck(u8 Response); //獲得應答
u8 SDCardDeviceInit(void); //初始化
u8 SDCardReadData(u8*buf,u32 sector,u32 cnt); //讀塊(扇區)
u8 SDCardWriteData(u8*buf,u32 sector,u32 cnt); //寫塊(扇區)
u32 GetSDCardSectorCount(void); //讀扇區數
u8 GetSDCardCISDCardOutnfo(u8 *cid_data); //讀SD卡CID
u8 GetSDCardCSSDCardOutnfo(u8 *csd_data); //讀SD卡CSD
#endif
(4)運行效果
3.2 SPI硬件時序方式
上面的3.1小節是采用SPI模擬時序驅動SD NAND,STM32本身集成有SPI硬件模塊,可以直接利用STM32硬件SPI接口讀寫。
下面貼出底層的適配代碼。 上面貼出的驅動代碼里,已經將驅動接口部分和協議邏輯部分區分開了,替換底層的SIP讀寫代碼非常方便。
(1)主要替換的代碼
/*
函數功能:SPI初始化(模擬SPI)
硬件連接:
MISO--->PB14
MOSI--->PB15
SCLK--->PB13
*/
void SPI_Init(void)
{
/*開啟時鐘*/
RCC->APB1ENR|=1<<14; ??//開啟SPI2時鐘
RCC->APB2ENR|=1<<3; ? ?//PB
GPIOB->CRH&=0X000FFFFF; //清除寄存器
GPIOB->CRH|=0XB8B00000;
GPIOB->ODR|=0X7<<13; ? ? //PB13/14/15上拉--輸出高電平
/*SPI2基本配置*/
SPI2->CR1=0X0; //清空寄存器
SPI2->CR1|=0<<15; //選擇“雙線雙向”模式
SPI2->CR1|=0<<11; //使用8位數據幀格式進行發送/接收;
SPI2->CR1|=0<<10; //全雙工(發送和接收);
SPI2->CR1|=1<<9; ?//啟用軟件從設備管理
SPI2->CR1|=1<<8; ?//NSS
SPI2->CR1|=0<<7; ?//幀格式,先發送高位
SPI2->CR1|=0x0<<3;//當總線頻率為36MHZ時,SPI速度為18MHZ,高速。
SPI2->CR1|=1<<2; ?//配置為主設備
SPI2->CR1|=1<<1; ?//空閑狀態時, SCK保持高電平。
SPI2->CR1|=1<<0; ?//數據采樣從第二個時鐘邊沿開始。
SPI2->CR1|=1<<6; ?//開啟SPI設備。
}
/*
函數功能:SPI讀寫一個字節
*/
u8 SPI_ReadWriteOneByte(u8 data_tx)
{
u16 cnt=0;
while((SPI2->SR&1<<1)==0) ?//等待發送區空--等待發送緩沖為空
{
cnt++;
if(cnt>=65530)return 0; //超時退出 u16=2個字節
}
SPI2->DR=data_tx; //發送一個byte
cnt=0;
while((SPI2->SR&1<<0)==0) ?//等待接收完一個byte ??
{
cnt++;
if(cnt>=65530)return 0; //超時退出
}
return SPI2->DR; //返回收到的數據
}
函數功能:SD卡底層接口,通過SPI時序向SD卡讀寫一個字節
函數參數:data是要寫入的數據
返 回 值:讀到的數據
*/
u8 SDCardReadWriteOneByte(u8 DataTx)
{
return SPI_ReadWriteOneByte(DataTx);
}
(2)運行效果

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 測試
    +關注

    關注

    8

    文章

    5281

    瀏覽量

    126604
  • 嵌入式
    +關注

    關注

    5082

    文章

    19111

    瀏覽量

    304845
  • STM32
    +關注

    關注

    2270

    文章

    10896

    瀏覽量

    355767
收藏 人收藏

    評論

    相關推薦

    關于SD NAND 的概述

    以其卓越的性能、可靠性和小巧的尺寸,受到市場的廣泛關注和應用。   2.CS創世SD NAND的特點   1. 小巧的尺寸:采用6x8mm
    發表于 12-06 11:22

    SD NAND 概述

    SD NAND是一種小型、可表面貼裝的存儲解決方案,適用于各種嵌入式系統和便攜式設備。SD NAND技術是近年來在存儲領域內的一項創新,它結
    的頭像 發表于 12-06 11:21 ?156次閱讀

    雷龍CS SD NAND貼片式TF體驗與性能測試

    最近有幸獲得了雷龍發展提供的貼片式TF樣品,收到的快遞中包含兩片 CS SD NAND 芯片和一個轉接板。以下是芯片和轉接板的實物照片:
    發表于 11-26 10:04

    Arduino程序:實現SD NAND貼片sd)的讀寫功能

      單片機上傳程序的時候,有時候感覺它的rom和 ram有時直接限制了他的使用,之前使用eeprom,和sd模塊. []()   然后最近看到了出的SD NAND 就是下面這個
    發表于 11-07 17:45

    貼片SD功能介紹【MK SD NAND

    SDNAND,通常稱為嵌入式SD貼片式TFSD Flash、直接貼裝SD
    的頭像 發表于 07-05 17:03 ?772次閱讀
    <b class='flag-5'>貼片</b>式<b class='flag-5'>SD</b><b class='flag-5'>卡</b>功能介紹【MK <b class='flag-5'>SD</b> <b class='flag-5'>NAND</b>】

    SD NAND文件系統:技術解析與應用指南

    MK米客方德的SD NAND是一種使用NAND閃存技術的貼片式TF,因起耐用性和較小的體積而受到廣泛歡迎。
    的頭像 發表于 06-07 14:45 ?424次閱讀
    <b class='flag-5'>SD</b> <b class='flag-5'>NAND</b>與<b class='flag-5'>文件系統</b>:技術解析與應用指南

    SD NAND 簡介

    SD NAND是一種創新的存儲芯片,可直接貼片,又名貼片式TF貼片式T
    的頭像 發表于 05-29 16:34 ?1190次閱讀
    <b class='flag-5'>SD</b> <b class='flag-5'>NAND</b> 簡介

    NAND Flash(貼片式TF)存儲新突破,基礎示例

    with FatFs \\\\r\\\\nSTM32FATFS文件系統測試\\\\r\\\\n \"; // 在外部
    發表于 05-21 17:13

    STM32F412使用SD,SDIO,FATFS系統SD掛載文件系統失敗的原因?

    求助,STM32F412RET6 使用SD,使用SDIO接口,FATFS系統SD
    發表于 04-11 07:15

    【嵌入式SD NAND】基于FATFS/Littlefs文件系統的日志框架實現

    `deinit`3.5全部代碼匯總4.測試5.總結1.概述那么在移植好了文件系統之后,我們又應該如何應用文件系統呢?很多人會說,這個簡單,就操作文件
    的頭像 發表于 03-14 18:12 ?1157次閱讀
    【嵌入式<b class='flag-5'>SD</b> <b class='flag-5'>NAND</b>】基于<b class='flag-5'>FATFS</b>/Littlefs<b class='flag-5'>文件系統</b>的日志框架實現

    CS 創世SD NAND FLASH 存儲芯片,比TF更小巧輕便易用的大容量存儲,TF替代方案

    ,符合標準SD2.0協議,且外形尺寸為8.5mm x 7mm。   CS創世SD NAND也被許多開發者朋友稱為
    發表于 01-24 18:30

    stm32 CubeMx 怎么實現SD/sd nand FATFS讀寫測試

    本實驗僅用于記錄和分享技術經驗若涉及侵權請聯系我刪除。   stm32 CubeMx 實現SD/sd nand
    發表于 01-09 17:37

    什么是SD NAND存儲芯片? SD NAND與TF的區別

    什么是SD NAND?它俗稱貼片式T貼片式TF貼片
    的頭像 發表于 01-06 14:35 ?1775次閱讀
    什么是<b class='flag-5'>SD</b> <b class='flag-5'>NAND</b>存儲芯片? <b class='flag-5'>SD</b> <b class='flag-5'>NAND</b>與TF<b class='flag-5'>卡</b>的區別

    什么是SD NAND存儲芯片?

    前言   大家好,我們一般在STM32項目開發中或者在其他嵌入式開發中,經常會用到存儲芯片存儲數據。今天我和大家來介紹一款存儲芯片,我這里采用(雷龍) CS創世
    發表于 01-05 17:54

    什么是SD NAND存儲芯片?

    前言大家好,我們一般在STM32項目開發中或者在其他嵌入式開發中,經常會用到存儲芯片存儲數據。今天我和大家來介紹一款存儲芯片,我這里采用(雷龍)CS創世SDNAND。SDNAND介紹
    的頭像 發表于 01-05 17:53 ?1284次閱讀
    什么是<b class='flag-5'>SD</b> <b class='flag-5'>NAND</b>存儲芯片?
    主站蜘蛛池模板: WWW国产色情在线观看APP| 色吧电影院| 97公开超碰在线视频| 绞尽奶汁by菊花开| 亚洲综合国产精品| 精品欧美小视频在线观看| 一二三四电影完整版免费观看| 黄色三级三级三级免费看| 亚洲宅男天堂a在线| 久久se精品一区二区国产| 中文字幕按摩| 男人有噶坏| music radio在线收听| 人人澡人人擦人人免费| 俄罗斯性xxxx| 午夜视频无码国产在线观看| 国产亚洲精品成人AV久久| 亚洲免费观看| 久久丫线这里只精品| 99精品影视| 日韩亚射吧| 国产久久re6免费热在线| 亚洲精品第一页中文字幕| 久久99综合国产精品亚洲首页| 中国女人内谢69xxxxxx直播| 蜜柚视频网在线观看免费| 99视频福利| 入禽太深免费观看| 国产亚洲精品久久久久久白晶晶| 亚洲国产成人99精品激情在线| 蝴蝶中文娱乐| 2021久久99国产熟女人妻| 青草伊人久久| 国产麻豆精品人妻无码A片| 亚洲中文在线偷拍| 男女高潮又爽又黄又无遮挡| 成人毛片手机版免费看| 亚洲精品久久久一区| 麻豆免费观看高清完整视频在线| free性欧美xxx狂欢| 午夜射精日本三级|