逐飞科技STC32G12K128开源库学习(按键调参之如何写入内存)

EEPROM 基础知识

先上逐飞例程

#include "headfile.h"

uint8 write_buff[] = {0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38};
uint8 read_buff[8];


void main()
{
    board_init();			// 初始化寄存器,勿删除此句代码。

	// 使用之前务必查看 ..\Example\11-EEPROM Demo\MDK文件夹下面的【必看】STC-ISP设置.png
	// 使用之前务必查看 ..\Example\11-EEPROM Demo\MDK文件夹下面的【必看】STC-ISP设置.png
	// 使用之前务必查看 ..\Example\11-EEPROM Demo\MDK文件夹下面的【必看】STC-ISP设置.png
    iap_init();				// 初始化EEPROM
    
	// 如果要写入的地址里面有数据。就需要先擦除再写入。
	// 擦除地址0所在的扇区数据,一共512个字节
	iap_erase_page(0);			
	
	// 将write_buff这个数组写入到EEPROM中,地址(0x00-0x07),共8个数据
	iap_write_bytes(0x00, write_buff, 8);
	
	// 将EEPROM中的内容读取到read_str字符串中,地址(0x00-0x07),共8个字符
	iap_read_bytes(0x00, read_buff, 8);
	 
    while(1)
	{
        // 串口发送读取到的数据
		// 使用文本模式,串口助手显示的数据为:12345678
		// 使用HEX模式,串口助手显示的数据为:0x31 0x32 0x33 0x34 0x35 0x36 0x37 0x38 
        uart_putbuff(UART_1, read_buff, 8);				
        delay_ms(500);
    }
}

初始化函数

iap_init(); //没什么说的

清除内存函数

iap_erase_page(0);

//-------------------------------------------------------------------------------------------------------------------
//  @brief      EEPROM擦除目标地址所在的一页(1扇区/512字节)
//  @param      addr            需要写的eeprom地址
//  @return     void
//  Sample usage:               iap_erase_page(0x20);
//                                擦除0x00-0x200的数据
//-------------------------------------------------------------------------------------------------------------------
void iap_erase_page(uint32 addr) 

    IAP_CMD = 3;                 //设置 IAP 擦除命令
    IAP_ADDRL = addr;             //设置 IAP 低地址
    IAP_ADDRH = addr >> 8;      //设置 IAP 高地址
    IAP_ADDRE = addr >> 16;        //设置 IAP 最高地址
    eeprom_trig();    
    
    delay_ms(10);                //擦除1扇区(512字节):约4-6ms
}

写入内存函数

iap_write_bytes(0x00, write_buff, 8);

//-------------------------------------------------------------------------------------------------------------------
//  @brief      EEPROM写多个字节
//  @param      addr            需要写的eeprom地址
//  @param      *buf            需要写的数据地址
//  @param      len                需要写的数据长度
//  @return     void
//  Sample usage:               iap_write_bytes(0x00,(uint8 *)"0123456789",10);
//                                将"0123456789"写入0x00-0x0A地址中;
//-------------------------------------------------------------------------------------------------------------------
void iap_write_bytes(uint32 addr, uint8 *buf, uint16 len)
{

    IAP_CMD = 2;                 //设置 IAP 读命令    
    
    while(len--)
    {
        IAP_ADDRE = 0;
        IAP_ADDRL = addr;         //设置 IAP 低地址
        IAP_ADDRH = addr >> 8;     //设置 IAP 高地址
        IAP_ADDRE = addr >> 16;    //设置 IAP 最高地址
        IAP_DATA = *buf++;         //写 IAP 数据
        addr++;

        eeprom_trig();
    }    
}

读取内存函数

iap_read_bytes(0x00, read_buff, 8);

//-------------------------------------------------------------------------------------------------------------------
//  @brief      EEPROM读取多个字节
//  @param      addr            需要读取的eeprom地址
//  @param      *buf            需要读取的数据地址
//  @param      len                需要读取的数据长度
//  @return     void
//  Sample usage:               uint8 str[10];
//                                iap_read_bytes(0x00,str,10);
//                                将0x00-0x0A地址中的数据,读取到str中。
//-------------------------------------------------------------------------------------------------------------------
void iap_read_bytes(uint32 addr, uint8 *buf, uint16 len)
{

    
    IAP_CMD = 1;                 //设置 IAP 读命令    

    while(len--)
    {
        IAP_ADDRE = 0;
        IAP_ADDRL = addr;         //设置 IAP 低地址
        IAP_ADDRH = addr >> 8;     //设置 IAP 高地址
        IAP_ADDRE = addr >> 16;    //设置 IAP 最高地址
        eeprom_trig();
        *buf++ = IAP_DATA;         //读 IAP 数据
        addr++;
        
    }    
}

在按键调参中的应用

通过上面的例程我们可以知道eeprom可以方便地存储和读取一串串的uint8变量,但是实际上我们平时所使用的、以及我们所需要储存的,大多数并不是uint8变量,而是float、int乃至自己写的结构体等等更加复杂、大小更大的变量,那么这时候该如何利用eeprom来存储这些更加复杂的变量呢?

这就需要用到我们强大的指针、强转和sizeof()大杀器啦,看个下面的例子:

float temp = 1;
float result = 37;

iap_erase_page(0);

iap_write_bytes(0x00, (uint8*)&temp, sizeof(temp));
iap_read_bytes(0x00, (uint8*)&result, sizeof(result));

printf("%f,%f\n",temp,result);

此时一通操作,你会发现到最后printf的时候,float类型的变量——result的值已然由原先的"37"变为了"1"。

想必看懂了这个的你,写起心仪的按键调参来一定毫不费劲吧,lz就说到这儿啦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值