在货物监控设备研发工作中,如何向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光敏二极管

货物监控设备研发中,睡眠功能的应用

在货物监控设备的研发过程中,如何对设备进行电量采集?

在货物监控设备研发的过程中,如何对MT MC MLT进行判定?

货物监控设备研发过程中,如何实现GPS的数据转换?

在货物监控设备研发中,如何对单片机进行实时时钟配置?