单片机学习笔记(一)
单片机FLASH存取结构体的方法
在日常开发中,经常遇到要保存一些配置数据到flash中,而普通的保存方法虽然粗暴简单,但是当数据类型多时,这种方法就不适用了,所以需要使用结构体的存储方法。
编写底层flash读写驱动
我使用的是EFM32单片机,不同的单片机flash读写驱动不相同,需要自行开发,部分代码如下所示, 其中主要使用 iap_write_appbin(),与efmflash_read()函数。
#include "main.h"
#include "iap.h"
#include "userpage.h"
#include <string.h>
#include "em_device.h"
#include "em_msc.h"
#include "em_usart.h"
#include "em_leuart.h"
iapfun jump2app;
#if STM32_FLASH_SIZE<256 //flash大小< 256k
#define STM_SECTOR_SIZE 512 //定义每个扇区512字节
#else
#define STM_SECTOR_SIZE 2048
#endif
uint32_t STMFLASH_BUF[STM_SECTOR_SIZE/4]={
0};//efm32:最多是2K字节 (长度为扇区长度,单位为字节)
extern msc_Return_TypeDef currentError;
/***************************************************
* 函数名称: iap_write_appbin
* 功能描述: 固件写入
* 输入参数: appxaddr:应用程序的起始地址
appbuf:应用程序CODE.
appsize:应用程序大小(字节). (必须小于一个扇区512字节)
* 输出参数: 无
* 返 回 值
* 其它说明: 无
* 修改日期:
修改人
****************************************************/
uint8_t iap_write_appbin(uint32_t appxaddr,uint8_t *appbuf,uint32_t appsize)
{
uint32_t iapbuf[128];
uint16_t t;
uint16_t i=0;
uint32_t temp;
uint32_t fwaddr=appxaddr;//当前写入的地址
uint8_t *dfu=appbuf;
if(appsize>512)
{
return 1;
}
memset(iapbuf, '\0',sizeof(iapbuf));
memset(STMFLASH_BUF, '\0',sizeof(STMFLASH_BUF));
for(t=0;t<appsize;t+=4)
{
temp=(uint32_t)dfu[3]<<24;
temp+=(uint32_t)dfu[2]<<16;
temp+=(uint32_t)dfu[1]<<8;
temp+=(uint32_t)dfu[0];
dfu+=4;//偏移4个字节
iapbuf[i++]=temp;
}
if(i)STMFLASH_Write(fwaddr