在货物监控设备研发工作中,如何向Stm32 flash写入数据
Posted 瑞奇Ricky
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在货物监控设备研发工作中,如何向Stm32 flash写入数据相关的知识,希望对你有一定的参考价值。
笔者最近在进行货物监控设备的研发工作。研发工作是繁琐而枯燥的,但是产品功能研发成功带来的喜悦也是无法言表的。货物监控设备具有多种非常实用的功能。例如:货物位置定位功能,货物运输环境温度、湿度、光感度监测功能,货物运输环境异常报警功能,货物丢失位置定位寻找功能,货物运输过程中防拆箱监测功能等等。
这些功能可以非常好的运用在货物运输的不同领域和环节之中。笔者在进行货物监控设备的研发工作时,会经常向Stm32 flash写入数据,相信很多产品研发的小伙伴也会需要使用到这个步骤。那么具体如何操作呢?笔者已经把代码步骤写在下面了,希望对各位有所帮助!
向Stm32 flash写入数据
#define STM32_SOCTER_SIZE (1024)
#define STM32_SOCTER_NUM (128)
#define STM32_FLASH_BASE (0x08000000)
#define STM32_FLASH_BASE_MAX (STM32_FLASH_BASE+STM32_SOCTER_SIZE*STM32_SOCTER_NUM - 1)
/*******************************************
函数:void WriteAppToFlash(uint32_t addr,uint16_t *pbuff,uint32_t datalength)
功能:向Stm32 flash写入数据
输入:addr:写入起始地址
pbuff:写入缓存
datalength:写入长度
输出:无
********************************************/
void WriteAppToFlash(uint32_t addr,uint16_t *pbuff,uint32_t datalength)
{
uint32_t i,j;
uint32_t writetoflashcount = 0;
uint16_t WriteFlashBuff[STM32_SOCTER_SIZE/2];//写入flash的缓存 按照半字长度计算
//地址
uint32_t head_addr = addr; //起始地址
uint32_t end_addr = head_addr + 2*datalength; //结束地址
//地址偏移
uint32_t head_addr_off; //起始地址的偏移
uint32_t end_addr_off; //结束地址的偏移
//扇区
uint32_t head_sector; //起始地址所在扇区
uint32_t end_sector; //结束地址所在扇区
uint16_t sector_num; //写入数据占用扇区数目
//起始、结束扇区写入数据长度(半字长度单位)
uint32_t head_addr_sector_remain; //起始地址所在扇区剩余长度
uint32_t end_addr_sector_off; //结束地址所在扇区内部偏移位置
//起始扇区内地址的偏移
uint32_t head_sector_addr_off;
//地址
head_addr = addr; //起始地址
end_addr = head_addr + 2*datalength; //结束地址
//地址偏移
head_addr_off = head_addr - STM32_FLASH_BASE; //起始地址的偏移
end_addr_off = end_addr - STM32_FLASH_BASE; //结束地址的偏移
//扇区
head_sector = head_addr_off/STM32_SOCTER_SIZE;//起始地址所在扇区
end_sector = end_addr_off/STM32_SOCTER_SIZE;//结束地址所在扇区
sector_num = end_sector - head_sector + 1; //写入数据占用扇区数目
//起始、结束扇区写入数据长度(半字长度单位)
head_addr_sector_remain = (STM32_SOCTER_SIZE - head_addr_off%STM32_SOCTER_SIZE)/2;//起始地址所在扇区剩余长度
end_addr_sector_off = (end_addr_off%STM32_SOCTER_SIZE)/2; //结束地址所在扇区内部偏移位置
//起始扇区内地址的偏移
head_sector_addr_off = (head_addr_off%STM32_SOCTER_SIZE)/2;
//检查地址合法性 地址超过STM32_FLASH_BASE_MAX或者小于STM32_FLASH_BASE 地址错误
if( (addr > STM32_FLASH_BASE_MAX) || (STM32_FLASH_BASE > addr))
return;
FLASH_Unlock();//解锁
for(i = 0;i < sector_num;i++)
{
//读取全部数据
ReadDataFromFlash(STM32_FLASH_BASE + STM32_SOCTER_SIZE*(head_sector+i),WriteFlashBuff,STM32_SOCTER_SIZE/2);
//页擦除
FLASH_ErasePage(STM32_FLASH_BASE + STM32_SOCTER_SIZE*(head_sector+i));
//数据替换
if(i == 0)//所占用的第一页数据替换
{
if(head_addr_sector_remain > datalength)
{
for(j = 0;j < datalength;j++)
{
WriteFlashBuff[head_sector_addr_off+j] = pbuff[j];
}
}
else
{
for(j = 0;j < head_addr_sector_remain;j++)
{
WriteFlashBuff[head_sector_addr_off+j] = pbuff[writetoflashcount];
writetoflashcount++;
}
}
}
else if(i == sector_num - 1)//最后一页数据替换
{
for(j = 0;j < end_addr_sector_off;j++)
{
WriteFlashBuff[j] = pbuff[writetoflashcount];
writetoflashcount++;
}
}
else //替换整个扇区
{
for(j = 0;j < STM32_SOCTER_SIZE/2;j++)
{
WriteFlashBuff[j] = pbuff[writetoflashcount];
writetoflashcount++;
}
}
//写入数据
WriteDataToFlash(STM32_FLASH_BASE + STM32_SOCTER_SIZE*(head_sector+i),WriteFlashBuff,STM32_SOCTER_SIZE/2);
}
}
以上是关于在货物监控设备研发工作中,如何向Stm32 flash写入数据的主要内容,如果未能解决你的问题,请参考以下文章
在货物监控设备的研发工作中,如何驱动PT1206AC光敏二极管