0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于小凌派RK2206開發(fā)板的EEPROM存儲案例

老漁翁 ? 來源:xxl1925 ? 作者:xxl1925 ? 2022-04-18 10:01 ? 次閱讀

一、簡介

在實(shí)際的應(yīng)用中,保存在RAM中的數(shù)據(jù)掉電后就丟失了,保存在FLASH中的數(shù)據(jù)又不能隨意改變,也就是不能用它來記錄變化的數(shù)值。但是在某些特定場合,我們又確實(shí)需要記錄下某些數(shù)據(jù),而它們還時常需要改變或更新,掉電之后數(shù)據(jù)還不能丟失。比如,我們的家用電表度數(shù),電視機(jī)里邊的頻道記憶,一般都是使用EEPROM來保存數(shù)據(jù),特點(diǎn)就是掉電后存儲的數(shù)據(jù)不丟失。

EEPROM (Electrically Erasable Programmable read only memory)是指帶電可擦可編程只讀存儲器。是一種掉電后數(shù)據(jù)不丟失的存儲芯片。EEPROM可以在電腦上或?qū)S迷O(shè)備上擦除已有信息,重新編程。一般用在即插即用。一般情況下,EEPROM擁有30萬到100萬次的壽命,也就是它可以反復(fù)寫入30~100萬次,而讀取次數(shù)是無限的。

本文基于瑞芯微RK2206芯片 + Harmony LiteOS操作系統(tǒng),通過i2c總線控制EEPROM讀寫。

二、硬件電路設(shè)計

我使用的EEPROM型號是K24C02,它是一個常用的基于IIC通信協(xié)議的EEPROM元件,例如ATMEL公司的AT24C02、CATALYST公司的CAT24C02和ST公司的ST24C02等芯片。IIC是一個通信協(xié)議,它擁有嚴(yán)密的通信時序邏輯要求,而EEPROM是一個元件,只是這個元件采樣了IIC協(xié)議的接口單片機(jī)相連而已,二者并沒有必然的聯(lián)系,EEPROM可以用其它接口,I2C也可以用在其它很多器件上。根據(jù)K24C02芯片手冊,可獲知如下:

(1)K24C02芯片的從設(shè)備地址。因本章節(jié)采用的2Kbit的EEPROM,所以該芯片I2C從設(shè)備地址為0x51。如下圖所示:

poYBAGJZJ1mANuFJAABd-7ruzCE909.png

圖K24C02的從設(shè)備地址圖

(2)K24C02芯片的讀操作

K24C02芯片的讀操作共分為3種,分別為當(dāng)前地址讀(Current Address Read)、隨機(jī)讀(Random Read)和連續(xù)讀(Sequential Read)。

其中,當(dāng)前地址讀(Current Address Read)操作是控制i2c與K24C02通信,通信內(nèi)容為:從設(shè)備地址(1個字節(jié),bit0為1,表示讀) + 數(shù)據(jù)(1個字節(jié),K24C02發(fā)送給CPU的存儲內(nèi)容)。該讀操作沒有附帶EEPROM的存儲地址,存儲地址是由上一次存儲地址累加而來。如下圖所示:

poYBAGJZKMOAao4iAABzX0JsFXM824.png

圖 K24C02的當(dāng)前地址讀操作

而隨機(jī)讀操作則控制i2c與K24C02進(jìn)行2次通信:

第1次i2c通信:從設(shè)備地址(1個字節(jié),bit0為0,表示寫) + 存儲地址(1個字節(jié),CPU發(fā)送給K24C02的存儲地址)

第2次i2c通信:從設(shè)備地址(1個字節(jié),bit0為1,表示讀) + 數(shù)據(jù)(1個字節(jié),K24C02發(fā)送給CPU的存儲內(nèi)容)。

具體數(shù)據(jù)傳輸如下圖所示:

pYYBAGJZKO2AGN_0AACWYOUF6ew781.png

圖 K24C02的隨機(jī)地址讀操作

連續(xù)讀操作(Sequential Read)則控制控制i2c往K24C02發(fā)送N個字節(jié),通信內(nèi)容為:從設(shè)備地址(bit0為1,表示讀) + N個數(shù)據(jù)(K24C02發(fā)送給CPU)。具體數(shù)據(jù)傳輸如下圖所示:

poYBAGJZJ7uAJCgjAACNk3By7Wg161.png

圖 K24C02的連續(xù)讀操作

(3)K24C02芯片的寫操作

K24C02芯片寫數(shù)據(jù)操作可分為2種,分別為字節(jié)寫操作(Byte Write)和頁寫操作(Page Write)。

其中,字節(jié)寫操作(Byte Write)控制i2c與K24C02通信,通信內(nèi)容為:從設(shè)備地址(1個字節(jié),bit0為0,表示寫) + 存儲地址(1個字節(jié)) + 數(shù)據(jù)(1個字節(jié),CPU發(fā)送給K24C0的存儲內(nèi)容)。具體數(shù)據(jù)傳輸如下圖所示:

pYYBAGJZJ9-AYEhLAABljTReqeM948.png

圖 K24C02的字節(jié)寫操作

頁寫操作(Page Write)則控制i2c與K24C02通信,通信內(nèi)容為:從設(shè)備地址(1個字節(jié),bit0為0,表示寫) + 存儲地址(1個字節(jié)) + 數(shù)據(jù)(N個字節(jié),CPU發(fā)送給K24C0的存儲內(nèi)容)。其中,存儲數(shù)據(jù)的N個字節(jié),N不能超過Page大小(K24C02的頁大小為8個字節(jié))。

三、程序設(shè)計

程序控制RK2206芯片的I2C與K24C02芯片通信,每5秒往某一塊存儲空間(該存儲空間地址依次累加)寫入不同數(shù)據(jù),然后再讀取出來。

1、主程序設(shè)計

如圖所示為EEPROM存儲主程序流程圖,開機(jī)LiteOS系統(tǒng)初始化后,進(jìn)入主程序后。主程序首先初始化i2c總線。其次,程序進(jìn)入主循環(huán),每5秒將不同的數(shù)據(jù)寫入到一塊存儲空間,然后再讀取回去。其中,存儲空間地址每次循環(huán)都累加32,數(shù)據(jù)也隨著循環(huán)而累加1。

pYYBAGJZKReABri2AABbTIyKOfw297.png
圖主程序流程圖

while (1)
  {
    printf("************ Eeprom Process ************\n");
    printf("BlockSize = 0x%x\n", eeprom_get_blocksize());
    
    /* 寫EEPROM */
    memset(buffer, 0, sizeof(buffer));
    for (unsigned int i = 0; i < FOR_CHAR; i++)
? ? ? ? {
? ? ? ? ? ? buffer[i] = data_offset + i;
? ? ? ? ? ? printf("Write Byte: %d = %c\n", addr_offset + i, buffer[i]);
? ? ? ? }
? ? ? ? ret = eeprom_write(addr_offset, buffer, FOR_CHAR);
? ? ? ? if (ret != FOR_CHAR)
? ? ? ? {
? ? ? ? ? ? printf("EepromWrite failed(%d)\n", ret);
? ? ? ? }
? ? ? ? 
? ? ? ? /* 讀EEPROM */
? ? ? ? memset(buffer, 0, sizeof(buffer));
? ? ? ? ret = eeprom_read(addr_offset, buffer, FOR_CHAR);
? ? ? ? if (ret != FOR_CHAR)
? ? ? ? {
? ? ? ? ? ? printf("Read Bytes: failed!\n");
? ? ? ? }
? ? ? ? else
? ? ? ? {
? ? ? ? ? ? for (unsigned int i = 0; i < FOR_CHAR; i++)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? printf("Read Byte: %d = %c\n", addr_offset + i, buffer[i]);
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? 
? ? ? ? data_offset++;
? ? ? ? if (data_offset >= CHAR_END)
    {
      data_offset = CHAR_START;
    }
    
    addr_offset += FOR_ADDRESS;
    if (addr_offset >= 200)
    {
      addr_offset = 0;
    }
    printf("\n");
    
    LOS_Msleep(5000);
  }

2、EEPROM初始化程序設(shè)計

主程序通過控制RK2206芯片的接口對i2c總線進(jìn)行初始化。

#define EEPROM_I2C_BUS     0
#define EEPROM_I2C_ADDRESS   0x51

static I2cBusIo m_i2cBus = {
  .scl = {.gpio = GPIO0_PA1, .func = MUX_FUNC3, .type = PULL_NONE, .drv = DRIVE_KEEP, .dir = LZGPIO_DIR_KEEP, .val = LZGPIO_LEVEL_KEEP},
  .sda = {.gpio = GPIO0_PA0, .func = MUX_FUNC3, .type = PULL_NONE, .drv = DRIVE_KEEP, .dir = LZGPIO_DIR_KEEP, .val = LZGPIO_LEVEL_KEEP},
  .id = FUNC_ID_I2C0,
  .mode = FUNC_MODE_M2,
};

static unsigned int m_i2c_freq = 100000;


unsigned int eeprom_init()
{
  if (I2cIoInit(m_i2cBus) != LZ_HARDWARE_SUCCESS) {
    printf("%s, %d: I2cIoInit failed!\n", __FILE__, __LINE__);
    return __LINE__;
  }
  if (LzI2cInit(EEPROM_I2C_BUS, m_i2c_freq) != LZ_HARDWARE_SUCCESS) {
    printf("%s, %d: I2cInit failed!\n", __FILE__, __LINE__);
    return __LINE__;
  }

  /* GPIO0_A0 => I2C1_SDA_M1 */
  PinctrlSet(GPIO0_PA0, MUX_FUNC3, PULL_NONE, DRIVE_KEEP);
  /* GPIO0_A1 => I2C1_SCL_M1 */
PinctrlSet(GPIO0_PA1, MUX_FUNC3, PULL_NONE, DRIVE_KEEP);

  return 0;
}

3、EEPROM讀操作程序設(shè)計

蜂鳴器控制程序當(dāng)開啟蜂鳴器時,打開蜂鳴器,并且設(shè)置PWM波的周期為100毫秒,其中占空比50%;當(dāng)關(guān)閉蜂鳴器時,則停止蜂鳴器。

#define EEPROM_I2C_BUS     0
#define EEPROM_I2C_ADDRESS   0x51

/* EEPROM型號:K24C02,2Kbit(256Byte),32頁,每頁8個字節(jié)(Byte) */
#define EEPROM_ADDRESS_MAX   256
#define EEPROM_PAGE       8

unsigned int eeprom_readbyte(unsigned int addr, unsigned char *data)
{
  unsigned int ret = 0;
  unsigned char buffer[1];
  LzI2cMsg msgs[2];

  /* K24C02的存儲地址是0~255 */
  if (addr >= EEPROM_ADDRESS_MAX) {
    printf("%s, %s, %d: addr(0x%x) >= EEPROM_ADDRESS_MAX(0x%x)\n", __FILE__, __func__, __LINE__, addr, EEPROM_ADDRESS_MAX);
    return 0;
}

  buffer[0] = (unsigned char)addr;
  msgs[0].addr = EEPROM_I2C_ADDRESS;
  msgs[0].flags = 0;
  msgs[0].buf = &buffer[0];
  msgs[0].len = 1;
  msgs[1].addr = EEPROM_I2C_ADDRESS;
  msgs[1].flags = I2C_M_RD;
  msgs[1].buf = data;
  msgs[1].len = 1;
 ret = LzI2cTransfer(EEPROM_I2C_BUS, msgs, 2);
 if (ret != LZ_HARDWARE_SUCCESS) {
   printf("%s, %s, %d: LzI2cTransfer failed(%d)!\n", __FILE__, __func__, __LINE__, ret);
   return 0;
 }

 return 1;
}

unsigned int eeprom_read(unsigned int addr, unsigned char *data, unsigned int data_len) 
{
  unsigned int ret = 0;

  if (addr >= EEPROM_ADDRESS_MAX) {
    printf("%s, %s, %d: addr(0x%x) >= EEPROM_ADDRESS_MAX(0x%x)\n", __FILE__, __func__, __LINE__, addr, EEPROM_ADDRESS_MAX);
    return 0;
}

  if ((addr + data_len) > EEPROM_ADDRESS_MAX) {
    printf("%s, %s, %d: addr + len(0x%x) > EEPROM_ADDRESS_MAX(0x%x)\n", __FILE__, __func__, __LINE__, addr + data_len, EEPROM_ADDRESS_MAX);
    return 0;
}  

  ret = eeprom_readbyte(addr, data);
  if (ret != 1) {
    printf("%s, %s, %d: EepromReadByte failed(%d)\n", __FILE__, __func__, __LINE__, ret);
    return 0;
}

  if (data_len > 1) {
    ret = LzI2cRead(EEPROM_I2C_BUS, EEPROM_I2C_ADDRESS, &data[1], data_len - 1);
    if (ret < 0) {
? ? ? ? ? ? printf("%s, %s, %d: LzI2cRead failed(%d)!\n", __FILE__, __func__, __LINE__, ret);
? ? ? ? ? ? return 0;
? ? ? ? }
}

? ? return data_len;
}

4、EEPROM寫操作程序設(shè)計

主程序根據(jù)存儲地址、存儲數(shù)據(jù)和數(shù)據(jù)長度的不同,選用字節(jié)寫操作或頁寫操作。具體源代碼如下所示:

#define EEPROM_I2C_BUS     0
#define EEPROM_I2C_ADDRESS   0x51

/* EEPROM型號:K24C02,2Kbit(256Byte),32頁,每頁8個字節(jié)(Byte) */
#define EEPROM_ADDRESS_MAX   256
#define EEPROM_PAGE       8

unsigned int eeprom_writebyte(unsigned int addr, unsigned char data)
{
  unsigned int ret = 0;
  LzI2cMsg msgs[1];
  unsigned char buffer[2];

  /* K24C02的存儲地址是0~255 */
  if (addr >= EEPROM_ADDRESS_MAX) {
    printf("%s, %s, %d: addr(0x%x) >= EEPROM_ADDRESS_MAX(0x%x)\n", __FILE__, __func__, __LINE__, addr, EEPROM_ADDRESS_MAX);
    return 0;
}

  buffer[0] = (unsigned char)(addr & 0xFF);
  buffer[1] = data;

  msgs[0].addr = EEPROM_I2C_ADDRESS;
  msgs[0].flags = 0;
  msgs[0].buf = &buffer[0];
  msgs[0].len = 2;
  ret = LzI2cTransfer(EEPROM_I2C_BUS, msgs, 1);
  if (ret != LZ_HARDWARE_SUCCESS) {
   printf("%s, %s, %d: LzI2cTransfer failed(%d)!\n", __FILE__, __func__, __LINE__, ret);
   return 0;
}

  /* K24C02芯片需要時間完成寫操作,在此之前不響應(yīng)其他操作*/
  eeprog_delay_usec(1000);
  return 1;
}

unsigned int eeprom_writepage(unsigned int addr, unsigned char *data, unsigned int data_len)
{
  unsigned int ret = 0;
  LzI2cMsg msgs[1];
  unsigned char buffer[EEPROM_PAGE + 1];
  
  /* K24C02的存儲地址是0~255 */
  if (addr >= EEPROM_ADDRESS_MAX) {
    printf("%s, %s, %d: addr(0x%x) >= EEPROM_ADDRESS_MAX(0x%x)\n", __FILE__, __func__, __LINE__, addr, EEPROM_ADDRESS_MAX);
    return 0;
  }

  if ((addr % EEPROM_PAGE) != 0) {
    printf("%s, %s, %d: addr(0x%x) is not page addr(0x%x)\n", __FILE__, __func__, __LINE__, addr, EEPROM_PAGE);
    return 0;
}

  if ((addr + data_len) > EEPROM_ADDRESS_MAX) {
    printf("%s, %s, %d: addr + data_len(0x%x) > EEPROM_ADDRESS_MAX(0x%x)\n", __FILE__, __func__, __LINE__, addr + data_len, EEPROM_ADDRESS_MAX);
    return 0;
}

  if (data_len > EEPROM_PAGE) {
    printf("%s, %s, %d: data_len(%d) > EEPROM_PAGE(%d)\n", __FILE__, __func__, __LINE__, data_len, EEPROM_PAGE);
    return 0;
}

  buffer[0] = addr;
  memcpy(&buffer[1], data, data_len);
  msgs[0].addr = EEPROM_I2C_ADDRESS;
  msgs[0].flags = 0;
  msgs[0].buf = &buffer[0];
  msgs[0].len = 1 + data_len;
  ret = LzI2cTransfer(EEPROM_I2C_BUS, msgs, 1);
  if (ret != LZ_HARDWARE_SUCCESS) {
   printf("%s, %s, %d: LzI2cTransfer failed(%d)!\n", __FILE__, __func__, __LINE__, ret);
   return 0;
}

  /* K24C02芯片需要時間完成寫操作,在此之前不響應(yīng)其他操作*/
  eeprog_delay_usec(1000);
  return data_len;
}

unsigned int eeprom_write(unsigned int addr, unsigned char *data, unsigned int data_len)
{
  unsigned int ret = 0;
  unsigned int offset_current = 0;
  unsigned int page_start, page_end;
  unsigned char is_data_front = 0;
  unsigned char is_data_back = 0;
  unsigned int len;

  if (addr >= EEPROM_ADDRESS_MAX) {
    printf("%s, %s, %d: addr(0x%x) >= EEPROM_ADDRESS_MAX(0x%x)\n", __FILE__, __func__, __LINE__, addr, EEPROM_ADDRESS_MAX);
    return 0;
}

  if ((addr + data_len) > EEPROM_ADDRESS_MAX) {
    printf("%s, %s, %d: addr + len(0x%x) > EEPROM_ADDRESS_MAX(0x%x)\n", __FILE__, __func__, __LINE__, addr + data_len, EEPROM_ADDRESS_MAX);
    return 0;
}

  /* 判斷addr是否是頁地址 */
  page_start = addr / EEPROM_PAGE;
  if ((addr % EEPROM_PAGE) != 0) {
    page_start += 1;
    is_data_front = 1;
}

  /* 判斷addr + data_len是否是頁地址 */
  page_end = (addr + data_len) / EEPROM_PAGE;
  if ((addr + data_len) % EEPROM_PAGE != 0) {
    page_end += 1;
    is_data_back = 1;
}

  offset_current = 0;
  
  /* 處理前面非頁地址的數(shù)據(jù),如果是頁地址則不執(zhí)行 */
  for (unsigned int i = addr; i < (page_start * EEPROM_PAGE); i++) {
? ? ? ? ret = eeprom_writebyte(i, data[offset_current]);
? ? ? ? if (ret != 1) {
? ? ? ? ? ? printf("%s, %s, %d: EepromWriteByte failed(%d)\n", __FILE__, __func__, __LINE__, ret);
? ? ? ? ? ? return offset_current;
? ? ? ? }
? ? ? ? offset_current++;
}

? ? /* 處理后續(xù)的數(shù)據(jù),如果數(shù)據(jù)長度不足一個Page,則不執(zhí)行 */
? ? for (unsigned int page = page_start; page < page_end; page++) {
? ? ? ? len = EEPROM_PAGE;
? ? ? ? if ((page == (page_end - 1)) && (is_data_back)) {
? ? ? ? ? ? len = (addr + data_len) % EEPROM_PAGE;
? ? ? ? }
? ? 
? ? ? ? ret = eeprom_writepage(page * EEPROM_PAGE, &data[offset_current], len);
? ? ? ? if (ret != len) {
? ? ? ? ? ? printf("%s, %s, %d: EepromWritePage failed(%d)\n", __FILE__, __func__, __LINE__, ret);
? ? ? ? ? ? return offset_current;
? ? ? ? }
? ? ? ? offset_current += EEPROM_PAGE;
}

? ? return data_len;

四、編譯過程

1、搭建和下載源代碼

我已將OpenHarmony源代碼上傳到Gitee社區(qū)中,大家可以根據(jù)以下網(wǎng)址下載。

https://gitee.com/Lockzhiner-Electronics/lockzhiner-rk2206-openharmony3.0lts

注意:編譯環(huán)境可根據(jù)以下網(wǎng)址來操作:https://gitee.com/Lockzhiner-Electronics/lockzhiner-rk2206-openharmony3.0lts/blob/master/vendor/lockzhiner/rk2206/README_zh.md

2、打開sdk下面路徑的文件

/vendor/lockzhiner/rk2206/samples/b3_eeprom/eeprom_example.c

注意:Gitee上的EEPROM案例為通用案例,請大家根據(jù)上述的需求修改相關(guān)源代碼。

3、修改編譯腳本

修改 vendor/lockzhiner/rk2206/sample 路徑下 BUILD.gn 文件,指定 eeprom_example 參與編譯。

"./b3_eeprom:eeprom_example",

修改 device/lockzhiner/rk2206/sdk_liteos 路徑下 Makefile 文件,添加 -leeprom_example 參與編譯。

hardware_LIBS = -lhal_iothardware -lhardware -leeprom_example

4、編譯固件

hb set -root .

hb set

hb build -f

5、燒寫固件

請參考Gitee網(wǎng)址的說明手冊(“燒錄打印”章節(jié)):https://gitee.com/Lockzhiner-Electronics/lockzhiner-rk2206-openharmony3.0lts/blob/master/device/rockchip/README_zh.md

五、實(shí)驗(yàn)結(jié)果

程序編譯燒寫到開發(fā)板后,按下開發(fā)板的RESET按鍵,通過串口軟件查看日志如下:

************ Eeprom Process ************
BlockSize = 0x8
Write Byte: 3 = !
Write Byte: 4 = "
Write Byte: 5 = #
Write Byte: 6 = $
Write Byte: 7 = %
Write Byte: 8 = &
Write Byte: 9 = '
Write Byte: 10 = (
Write Byte: 11 = )
Write Byte: 12 = *
Write Byte: 13 = +
Write Byte: 14 = ,
Write Byte: 15 = -
Write Byte: 16 = .
Write Byte: 17 = /
Write Byte: 18 = 0
Write Byte: 19 = 1
Write Byte: 20 = 2
Write Byte: 21 = 3
Write Byte: 22 = 4
Write Byte: 23 = 5
Write Byte: 24 = 6
Write Byte: 25 = 7
Write Byte: 26 = 8
Write Byte: 27 = 9
Write Byte: 28 = :
Write Byte: 29 = ;
Write Byte: 30 = <
Write Byte: 31 = =
Write Byte: 32 = >
Read Byte: 3 = !
Read Byte: 4 = "
Read Byte: 5 = #
Read Byte: 6 = $
Read Byte: 7 = %
Read Byte: 8 = &
Read Byte: 9 = '
Read Byte: 10 = (
Read Byte: 11 = )
Read Byte: 12 = *
Read Byte: 13 = +
Read Byte: 14 = ,
Read Byte: 15 = -
Read Byte: 16 = .
Read Byte: 17 = /
Read Byte: 18 = 0
Read Byte: 19 = 1
Read Byte: 20 = 2
Read Byte: 21 = 3
Read Byte: 22 = 4
Read Byte: 23 = 5
Read Byte: 24 = 6
Read Byte: 25 = 7
Read Byte: 26 = 8
Read Byte: 27 = 9
Read Byte: 28 = :
Read Byte: 29 = ;
Read Byte: 30 = <
Read Byte: 31 = =
Read Byte: 32 = >
......

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • EEPROM
    +關(guān)注

    關(guān)注

    9

    文章

    1007

    瀏覽量

    81223
  • 開發(fā)板
    +關(guān)注

    關(guān)注

    25

    文章

    4838

    瀏覽量

    96845
  • RK2206
    +關(guān)注

    關(guān)注

    0

    文章

    34

    瀏覽量

    1747
  • 小凌派
    +關(guān)注

    關(guān)注

    0

    文章

    27

    瀏覽量

    1186
收藏 人收藏

    評論

    相關(guān)推薦

    RK2206開發(fā)板EEPROM存儲案例詳解

    需要改變或更新,掉電之后數(shù)據(jù)還不能丟失。比如,我們的家用電表度數(shù),電視機(jī)里邊的頻道記憶,一般都是使用EEPROM來保存數(shù)據(jù),特點(diǎn)就是掉電后存儲的數(shù)據(jù)不丟失。 EEPROM (Electrically Erasable Progr
    發(fā)表于 04-15 19:10 ?2247次閱讀
    小<b class='flag-5'>凌</b><b class='flag-5'>派</b><b class='flag-5'>RK2206</b><b class='flag-5'>開發(fā)板</b><b class='flag-5'>EEPROM</b><b class='flag-5'>存儲</b>案例詳解

    基于OpenHarmony+小RK2206開發(fā)板制作的簡易示波器

    基于OpenHarmony + 小RK2206開發(fā)板制作的簡易示波器,實(shí)時采集波形,實(shí)時計算并實(shí)時顯示對應(yīng)的波形。OpenHarmony實(shí)時性較高,穩(wěn)定性好,瑞芯微
    的頭像 發(fā)表于 05-10 09:02 ?4284次閱讀

    RK2206鴻蒙開發(fā)板原理圖硬件資料分享

    RK2206鴻蒙開發(fā)板原理圖和硬件datasheet資料分享,需要的自取~
    發(fā)表于 04-01 17:16

    RK2206鴻蒙開發(fā)板原理圖硬件資料

    RK2206鴻蒙開發(fā)板原理圖和硬件datasheet資料分享,需要的自取~
    發(fā)表于 04-01 17:39

    輕量系統(tǒng)開發(fā)套件介紹:睿智捷 | 小-RK2206 開發(fā)板套件

    睿智捷 | 小-RK2206 開發(fā)板套件是由福州市睿智捷電子有限公司出品,主控器為瑞芯微
    發(fā)表于 04-21 13:39

    【小RK2206開發(fā)板試用體驗(yàn)】第2章 源碼編譯與固件下載

    開發(fā)環(huán)境:開發(fā)系統(tǒng):Ubuntu 20.04開發(fā)板:小-RK2206
    發(fā)表于 05-08 14:02

    【小RK2206開發(fā)板試用體驗(yàn)】第3章 應(yīng)用開發(fā)

    開發(fā)環(huán)境:開發(fā)系統(tǒng):Ubuntu 20.04開發(fā)板:小-RK2206
    發(fā)表于 05-08 14:07

    【小RK2206開發(fā)板試用體驗(yàn)】鴻蒙應(yīng)用開發(fā)和鴻蒙線程創(chuàng)建

    開發(fā)系統(tǒng):Ubuntu 20.04開發(fā)板:小-RK2206開發(fā)板OpenHARMony版本:
    發(fā)表于 05-25 01:32

    【小RK2206開發(fā)板試用體驗(yàn)】二運(yùn)行

    入手后,我申請的是人體感應(yīng)套件,所以首先 查詢資料docsoard硬件原理圖小開發(fā)板原理圖只提供底板的原理圖,核心原理圖可在開發(fā)板
    發(fā)表于 06-02 10:23

    RK2206開發(fā)板順利通過開放原子開源基金會XTS認(rèn)證

    -RK2206開發(fā)板與 OpenHarmony 良好兼容、系統(tǒng)互通,符合 OpenHarmony 兼容性設(shè)計要求及認(rèn)證標(biāo)準(zhǔn)。 未來,智電子也將以自身行業(yè)沉淀與深厚研發(fā)積累為依托,基于 OpenHarmony
    的頭像 發(fā)表于 03-23 16:18 ?4897次閱讀
    小<b class='flag-5'>凌</b><b class='flag-5'>派</b><b class='flag-5'>RK2206</b><b class='flag-5'>開發(fā)板</b>順利通過開放原子開源基金會XTS認(rèn)證

    基于OpenHarmony系統(tǒng)和小RK2206開發(fā)板的避障小車

    這是一款基于OpenHarmony系統(tǒng)和小-RK2206開發(fā)板的避障小車。同時,小車上搭載了超聲波測距模塊、舵機(jī)模塊、紅外尋跡模塊、直流電機(jī)模塊。
    的頭像 發(fā)表于 04-21 07:58 ?4770次閱讀

    基于小RK2206開發(fā)板所制作的簡易示波器

    基于OpenHarmony + 小RK2206開發(fā)板制作的簡易示波器,實(shí)時采集波形,實(shí)時計算并實(shí)時顯示對應(yīng)的波形。OpenHarmony實(shí)時性較高,穩(wěn)定性好,瑞芯微
    的頭像 發(fā)表于 05-06 17:09 ?1703次閱讀
    基于小<b class='flag-5'>凌</b><b class='flag-5'>派</b><b class='flag-5'>RK2206</b><b class='flag-5'>開發(fā)板</b>所制作的簡易示波器

    智電子:小-RK2206開發(fā)板順利通過開放原子開源基金會兼容性測評

    3月18日,智電子小-RK2206開發(fā)套件順利完成OpenAtomOpenHarmony(以下簡稱“OpenHarmony”)3.0L
    的頭像 發(fā)表于 04-13 09:56 ?939次閱讀
    <b class='flag-5'>凌</b>智電子:小<b class='flag-5'>凌</b><b class='flag-5'>派</b>-<b class='flag-5'>RK2206</b><b class='flag-5'>開發(fā)板</b>順利通過開放原子開源基金會兼容性測評

    -RK2206開發(fā)板:UART控制案例

    -RK2206開發(fā)板:UART控制案例一、簡介通用異步收發(fā)傳輸器(UniversalAsynchronousReceiver/Transmitter),通常稱作UART。它將要傳
    的頭像 發(fā)表于 06-14 11:12 ?932次閱讀
    小<b class='flag-5'>凌</b><b class='flag-5'>派</b>-<b class='flag-5'>RK2206</b><b class='flag-5'>開發(fā)板</b>:UART控制案例

    基于小RK2206開發(fā)板wifi-tcp通信實(shí)驗(yàn)

    基于小RK2206開發(fā)板wifi-tcp通信實(shí)驗(yàn)在開發(fā)過程中想要與開發(fā)板進(jìn)行通信一般使用串口
    的頭像 發(fā)表于 06-14 11:10 ?1166次閱讀
    基于小<b class='flag-5'>凌</b><b class='flag-5'>派</b><b class='flag-5'>RK2206</b><b class='flag-5'>開發(fā)板</b>wifi-tcp通信實(shí)驗(yàn)