循环写flash逻辑

写入的固定字节的逻辑
刚上电需要查找到上次写入的位置

运行的时候就按照找到的位置一直写下去

uint32_t timer_value;//找到刚上电flash 的起始地址和 SEQ
uint32_t timer_start_addr;//
static uint32_t check_last_place_and_timer_value(void)
{
static uint32_t *(value_p)=NULL;
value_p =(uint32_t *)(timer_fstorage.start_addr);
static uint16_t cnt =0;
cnt=((timer_fstorage.end_addr+1- timer_fstorage.start_addr)/4)-1;
static uint64_t sum1=0;
static uint64_t sum2=0;

for(uint16_t j=0;j<cnt;j++)
{
		sum1=0;
		sum2=0;
		
		for(uint8_t i=0;i<1;i++)//第一个值
		{
			sum1+=*(value_p);
			value_p+=1;
		}
		for(uint8_t i=0;i<1;i++)//第二个值
		{
			sum2+=*(value_p);
			value_p++;
		}
		
		if((sum1!=0xFFFFFFFF)&&(sum2==0xFFFFFFFF))
		{
			value_p-=2;//存SEQ——NUM的位置
		//	uint32_t  *alarm_msg_p=(alarm_msg_t * )value_p;
				//cur_seq_num =alarm_msg_p->seq_num;
			timer_value=* value_p;
				timer_start_addr=(uint32_t)value_p+4	;
				PINFO("timer_start_addr   %x",timer_start_addr);
			PINFO("timer_value   %d",timer_value);
			return 1;
			break;
		}
		value_p-=1;//
}
//需要考虑最后一个字节是数据   timer_fstorage.end_addr是数据  timer_fstorage.start_addr是全0xFF 
sum2 =*((uint32_t *)(timer_fstorage.start_addr));//

 static uint32_t  flash=0;
flash=(timer_fstorage.end_addr+1-4);//
sum1 =*(uint32_t *)flash;
if((sum1!=0xFFFFFFFF)&&(sum2==0xFFFFFFFF))//
{
					value_p-=2;//存SEQ——NUM的位置
		//	uint32_t  *alarm_msg_p=(alarm_msg_t * )value_p;
				//cur_seq_num =alarm_msg_p->seq_num;
		  nrf_fstorage_erase(&timer_fstorage, fstorage.start_addr, 1, NULL);//erase one page
			wait_for_flash_ready(&timer_fstorage);
			timer_value=sum1;
			timer_start_addr=timer_fstorage.start_addr;//;(timer_fstorage.end_addr+1-4)	;
			PINFO("timer_start_addr   %x",timer_start_addr);
			PINFO("timer_value   %d",timer_value);
	return 1;
}
	timer_value= 0;
	timer_start_addr=timer_fstorage.start_addr;

//cur_seq_num =0;
 //cur_start_addr=	timer_fstorage.start_addr;//从0地址开始的数据需要擦除第一页
					PINFO("timer_start_addr   %x",timer_start_addr);
			PINFO("timer_value   %d",timer_value);
  nrf_fstorage_erase(&timer_fstorage, fstorage.start_addr, 1, NULL);//erase one page
	 wait_for_flash_ready(&timer_fstorage);
	return 0;

}

static void write_timer_flash_func( uint32_t * timer)//ʵÏÖÑ­»·Ð´ flash µÄ¹¦ÄÜ
{
ret_code_t rc;
ret_code_t err_code;
//static uint32_t a=1000;
//static uint32_t end_addr;
//end_addr =0;
if(write_timer_addr<timer_fstorage.end_addr)
{
rc = nrf_fstorage_write(&timer_fstorage, write_timer_addr,timer, sizeof(uint32_t), NULL);
APP_ERROR_CHECK(rc);
wait_for_flash_ready(&timer_fstorage);
write_timer_addr+=sizeof(uint32_t);
alarm_msg.seq_num++;
// //PINFO("seq_num “%d”, alarm_msg_p->seq_num);
// //дµ½Ã¿Ò»Ò³µÄ×îºóÁ½¸öÊý¾Ý¿é ¾Í²Á³ýÏÂÒ»Ò³
if(((write_timer_addr%0x1000)(0x1000-0x4))||((write_timer_addr%0x1000)(0x1000-0x8)))
{

					//NRF_LOG_INFO("erase next  page 4096 \"%x\"  .", write_timer_addr);
					uint32_t temp_addr=0;
					
					if((write_timer_addr%0x1000)==(0x1000-0x4))
					{
						temp_addr=write_timer_addr+0x4;
						if(temp_addr>timer_fstorage.end_addr)
						{
								temp_addr	=timer_fstorage.start_addr;
						}
								nrf_gpio_pin_set(30);
	
		
								err_code = nrf_fstorage_erase(&timer_fstorage, temp_addr, 1, NULL);//erase one page
								APP_ERROR_CHECK(err_code);
								wait_for_flash_ready(&timer_fstorage);
						nrf_gpio_pin_clear(30);
					}
					else
					{
						temp_addr=write_timer_addr+0x8;
						if(temp_addr>timer_fstorage.end_addr)
						{
								temp_addr	=timer_fstorage.start_addr;
						}
						nrf_gpio_pin_set(30);
								err_code = nrf_fstorage_erase(&timer_fstorage, temp_addr, 1, NULL);//erase one page
								APP_ERROR_CHECK(err_code);
								wait_for_flash_ready(&timer_fstorage);
						nrf_gpio_pin_clear(30);
					}
					PINFO("erase next  page 4096 \"%x\"  .", temp_addr);
				}
				if(write_timer_addr>timer_fstorage.end_addr)
				{
					write_timer_addr=timer_fstorage.start_addr;
				}
				
				if(write_timer_addr==0x60000)
				{
					static uint8_t a;
					a++;
				}
	//			NRF_LOG_INFO("write_timer_addr \"%x\"  .", write_timer_addr);
			}	

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值