nuc123将结构体对象写入flash的操作

本文介绍了一个用于嵌入式系统的设备参数结构,包括设备编号、工作模式、频率设置等,并详细展示了如何使用C语言进行初始化、保存到闪存及从闪存中读取的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <stdint.h>

#pragma pack (1) /*指定按1字节对齐*/
struct Testing_Equipment
{
    uint8_t     IDString[4];                      // 设备编号及软件版本号
    uint8_t     LED_Stauts;                     // LED及屏幕背光状态
    uint8_t     Channel;                        // 当前选择的通道号
    uint8_t     Test;                           // 启动测试模式标志位
    uint8_t     Remote;                         // 启动远程模式标志位
    uint8_t     Output_Mode;                    // 设置选择通道的输出模式
    uint8_t     Output_Enable;                  // 选择输出通道使能或禁用
    uint8_t     INT_EXT_Mode;                   // 选择是内部触发还是外部触发
    uint8_t     Save;                           // 保持设置值标志位
    uint8_t     Reset;                          // 恢复出厂设置标注位
    uint16_t    Delay;                          // 测试模式电平持续时间
    uint16_t    Modulation_Freq;                // 设置选择通道的调制频率
    uint16_t    Base_Freq;                      // 设置选择通道的基础频率
    uint16_t    Input_Signal;                   // 设置输入信号的频率范围
    float       Voltage_Increment;				// 测试模式电平增量
    float       Current_Channel_Voltage;        // ADC通道的反馈电压值
    float       Current_last_offset;            // ADC通道最近一次偏移值
    float       MAX_Voltage;                    // 测试模式最大电压
    float       MIN_Voltage;                    // 测试模式最小电压
    float       High_Voltage_A;                 // 设置选择通道的高电压
    float       High_Voltage_B;                 // 设置选择通道的高电压
    float       Low_Voltage_A;                  // 设置选择通道的低电压
    float       Low_Voltage_B;                  // 设置选择通道的低电压
    float       temperature;                    // 温度
};
#pragma pack ()
struct Testing_Equipment t1;	// 创建一个结构体对象

const uint32_t dataflashbase = 0x0001F000;	// nuc123默认的数据存储区的起始地址
uint8_t length = 0;
uint8_t byte[4] = {0};
void Init_Equipment(struct Testing_Equipment *t)
{
    memcpy(&t->IDString[0], "LCC1", 4);
    t->LED_Stauts = 0;
    t->Channel = 1;
    t->Test = 0;
    t->Remote = 0;
    t->Output_Enable = 0;
    t->Output_Mode = 0;
    t->INT_EXT_Mode = 0;
    t->Save = 0;
    t->Reset = 0;
    t->Delay = 0;
    t->Modulation_Freq = 200;
    t->Base_Freq = 2000;
    t->Input_Signal = 0;
    t->Voltage_Increment = 0.0;
    t->Current_Channel_Voltage = 0.0;
    t->Current_last_offset = 0.0;
    t->MAX_Voltage = 0.0;
    t->MIN_Voltage = 0.0;
    t->High_Voltage_A = 9.0;
    t->High_Voltage_B = -9.0;
    t->Low_Voltage_A = 5.0;
    t->Low_Voltage_B = -5.0;
}
// flash的操作顺序是先擦除,然后写入,读取的时候可以不擦除
void flash_erase_size(uint32_t addr, uint32_t size)
{
    SYS_UnlockReg();
    FMC_ENABLE_AP_UPDATE();
    for (size_t i = 0; i < size; i += 4)
    {
        FMC_Erase(addr + i);
    }
    FMC_DISABLE_AP_UPDATE();
    SYS_LockReg();
}

void flash_write_buff(uint32_t addr, uint8_t *buff, uint8_t len)
{
    SYS_UnlockReg();
    FMC_ENABLE_AP_UPDATE();
    size_t j = 0;
    for (size_t i = 0; i < len * 4; i += 4)
    {
        if(j < len)
        {
            FMC_Write(addr + i, buff[j]);
            j += 1;
        }
    }
    FMC_DISABLE_AP_UPDATE();
    SYS_LockReg();
}

void flash_read_tobuff(uint32_t addr, uint8_t *buff, uint8_t len)
{
    SYS_UnlockReg();
    FMC_ENABLE_AP_UPDATE();
    size_t j = 0;
    for (size_t i = 0; i < len * 4; i += 4)
    {
        buff[j] = FMC_Read(addr + i);
        j++;
    }
    FMC_DISABLE_AP_UPDATE();
    SYS_LockReg();
}

uint8_t *float_to_byte(float f, uint8_t *byte, uint8_t len)
{
    uint8_t *ptr = (uint8_t*)&f;
    for (size_t i = 0; i < len; i++)
    {
        byte[i] = *ptr++;
    }
    return byte;
}
// float 和 int 都是4个byte,此函数返回类型改为int即是转为int,如果返回类型是uint16_t,这里只要把len的长度改为2,把返回类型改为uint16_t就行,内部的临时变量记得跟随
float byte_to_float(uint8_t *byte, uint8_t len)
{
    float temp;
    uint8_t *ptr = (uint8_t*)&temp;
    for (size_t i = 0; i < len; i++)
    {
        ptr[i] = byte[i];
    }
    return temp;
}

uint8_t flash_save_buff[1024] = {0};

int main(int argc, char *argv[])
{
	length = sizeof(t1);
    uint8_t *ptr = (uint8_t*)&t1;//这里强转一下,为下面的cpy做准备
    memcpy(&flash_save_buff[0], ptr, sizeof (t1));
    flash_write_buff(dataflashbase, flash_save_buff, length);
    for (int i = 0; i < 4; i++) {
        printf("%c", buff[i]);
    }
    printf("\n");
    for (int i = 4; i < 19; i++) {
        printf("%d ", buff[i]);
    }
    printf("\n");
    for (int i = 20; i < 56; i++) {
        printf("%#x ", buff[i]);
    }
    
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值