#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;
}
nuc123将结构体对象写入flash的操作
最新推荐文章于 2024-08-20 16:23:44 发布
本文介绍了一个用于嵌入式系统的设备参数结构,包括设备编号、工作模式、频率设置等,并详细展示了如何使用C语言进行初始化、保存到闪存及从闪存中读取的过程。
4057

被折叠的 条评论
为什么被折叠?



