联合体实战--W24Q64-SPIFLASH-设计flag = flag & (~i);

硬盘一个巧妙的设计 
不要用1234这样的数值 而是一个一个的位 
这样的好处?比如1234你需要擦除2个的话需要2个函数

没有说到点子上  位的话 也是要去执行2个函数 区别是位 一个一个清的 不是一下子到0

硬盘分区设计-
1获得华邦的型号比如是8M的 
比如我现在分为1M一个盘符那就是有8个空间需要控制了 
比如名字都是SPIFLASH12345678这样的 
我每个对应一个位也就是U8可以控制好 
我现在执行擦除
1暴力的可以调用一个全部擦除 
2分开的话我在一个死循环里面定一个U8通过函数接口把U8分享出去 
接口外面可以给U8的某一个位写1 而我的死循环就一直在问U8是不是0 
如果不是0说明外面接口给他拉1了 那个位是1我就去擦对应的盘符然后U8的这个位清0 
所以外面可以同时拉多个位是1  
我以前的传统思路是做一个/8外面写123然后我死循环里面U8为0 这样就不能同时擦多个盘符
代码:

#include "gflashctl.h"

typedef union _memctl
{
	struct 
	{
		unsigned  char    bit0:1; 
		unsigned  char    bit1:1; 
		unsigned  char    bit2:1; 
		unsigned  char    bit3:1; 
		unsigned  char    bit4:1; 
		unsigned  char    bit5:1; 
		unsigned  char    bit6:1; 
		unsigned  char    bit7:1; 
	} bflag;
	unsigned  char    flag;
}memctl;


memctl gflash;

//外部接口
void set_flash_clearp1(void){gflash.bflag.bit0=1;};
void set_flash_clearp2(void){gflash.bflag.bit1=1;};
void set_flash_clearp3(void){gflash.bflag.bit2=1;};
void set_flash_clearp4(void){gflash.bflag.bit3=1;};
void set_flash_clearp5(void){gflash.bflag.bit4=1;};
void set_flash_clearp6(void){gflash.bflag.bit5=1;};
void set_flash_clearp7(void){gflash.bflag.bit6=1;};
void set_flash_clearp8(void){gflash.bflag.bit7=1;};

//内部放在死循环 异步
void memctl_loop(void)
{
	if(gflash.flag==0)
		return;
	if(gflash.bflag.bit0)
	{
		gflash.bflag.bit0=0;
		flash_clear(p1);	
	}
	if(gflash.bflag.bit1)
	{
		gflash.bflag.bit1=0;
		flash_clear(p2);	
	}
	if(gflash.bflag.bit2)
	{
		gflash.bflag.bit2=0;
		flash_clear(p3);	
	}
	if(gflash.bflag.bit3)
	{
		gflash.bflag.bit3=0;
		flash_clear(p4);	
	}
	if(gflash.bflag.bit4)
	{
		gflash.bflag.bit4=0;
		flash_clear(p5);	
	}
	if(gflash.bflag.bit5)
	{
		gflash.bflag.bit5=0;
		flash_clear(p6);	
	}
	if(gflash.bflag.bit6)
	{
		gflash.bflag.bit6=0;
		flash_clear(p7);	
	}
	if(gflash.bflag.bit7)
	{
		gflash.bflag.bit7=0;
		flash_clear(p8);	
	}	
	
}

可以看到 比较冗余

我需要1一个初始化 把全局变量=0  2我每个位的处理函数是传入一个W24Q64的地址 这样其实

深入理解前面 最强串口 我传入的是一个函数 说道点子 是 注册技术!

我也用注册技术!

类似如下

#include "gflashctl.h"
typedef void (*_callback)	(uint32_t);
typedef union _memctl
{
	struct 
	{
		unsigned  char    bit0:1; 
		unsigned  char    bit1:1; 
		unsigned  char    bit2:1; 
		unsigned  char    bit3:1; 
		unsigned  char    bit4:1; 
		unsigned  char    bit5:1; 
		unsigned  char    bit6:1; 
		unsigned  char    bit7:1; 
	} bflag;
	unsigned  char    flag;
	_callback  callback[8];
}memctl;


memctl gflash;

//外部接口
void set_flash_clearp1(void){gflash.bflag.bit0=1;};
void set_flash_clearp2(void){gflash.bflag.bit1=1;};
void set_flash_clearp3(void){gflash.bflag.bit2=1;};
void set_flash_clearp4(void){gflash.bflag.bit3=1;};
void set_flash_clearp5(void){gflash.bflag.bit4=1;};
void set_flash_clearp6(void){gflash.bflag.bit5=1;};
void set_flash_clearp7(void){gflash.bflag.bit6=1;};
void set_flash_clearp8(void){gflash.bflag.bit7=1;};

//内部放在死循环 异步
void memctl_loop(void)
{
	if(gflash.flag==0)
		return;
	if(gflash.bflag.bit0)
	{
		gflash.callback[0]();	
	}
	if(gflash.bflag.bit1)
	{
		gflash.callback[1]();	
	}
	if(gflash.bflag.bit2)
	{
		gflash.callback[2]();	
	}
	if(gflash.bflag.bit3)
	{
		gflash.callback[3]();	
	}
	if(gflash.bflag.bit4)
	{
		gflash.callback[4]();	
	}
	if(gflash.bflag.bit5)
	{
		gflash.callback[5]();	
	}
	if(gflash.bflag.bit6)
	{
		gflash.callback[6]();		
	}
	if(gflash.bflag.bit7)
	{
		gflash.callback[7]();		
	}	
	
}

void flash_clear_0(u32 add)
{flashclesr(add);gflash.bflag.bit0=0;}
void memctl_init(void)
{
	gflash.flag=0;
	callback[0]=flash_clear_0;
	callback[1]=flash_clear_1;
	callback[2]=flash_clear_2;	
	callback[3]=flash_clear_3;
	callback[4]=flash_clear_4;
	callback[5]=flash_clear_5;	
	callback[6]=flash_clear_6;
	callback[7]=flash_clear_7;
}

现在看上去 void memctl_loop(void) 还是冗余

 

看看

for(unsigned  char i=1;i;i = i<<1)
    printf("%02X  ",i);

这样位 移动就是8个

截取一下

这样可以把拉的位 表现出来

 

完成清位模型:

int main(int argc,char **argv)
{
	unsigned  char    flag=0X18;
		printf("---%02X\r\n",flag);
	for(unsigned  char i=1;i;i = i<<1)
	{
		if( (i & flag) == i)
				{
						printf("%02X  ",i);
						flag = flag & (~i);
				}
	}
	printf("\r\n---%02X  ",flag);
	return 1;
}

 

继续完美自己的模型:

#include "gflashctl.h"
typedef void (*_callback)	(uint32_t);
typedef union _memctl
{
	struct 
	{
		unsigned  char    bit0:1; 
		unsigned  char    bit1:1; 
		unsigned  char    bit2:1; 
		unsigned  char    bit3:1; 
		unsigned  char    bit4:1; 
		unsigned  char    bit5:1; 
		unsigned  char    bit6:1; 
		unsigned  char    bit7:1; 
	} bflag;
	unsigned  char    flag;
	_callback  callback;
}memctl;


memctl gflash;

//外部接口
void set_flash_clearp1(void){gflash.bflag.bit0=1;};
void set_flash_clearp2(void){gflash.bflag.bit1=1;};
void set_flash_clearp3(void){gflash.bflag.bit2=1;};
void set_flash_clearp4(void){gflash.bflag.bit3=1;};
void set_flash_clearp5(void){gflash.bflag.bit4=1;};
void set_flash_clearp6(void){gflash.bflag.bit5=1;};
void set_flash_clearp7(void){gflash.bflag.bit6=1;};
void set_flash_clearp8(void){gflash.bflag.bit7=1;};

//内部放在死循环 异步
void memctl_loop(void)
{
	if(gflash.flag==0)
		return;
	for(unsigned  char i=1;i;i = i<<1)
	{
		if( (i & gflash.flag) == i)
		gflash.callback(i);//这样最好 这个函数1清除对应的位 2去格式化对应的硬盘
	}

	
}

void flash_clear_bit_clear(u8 i)
{
	flashclesr(add);//清除对应的盘符做一个switch case
	gflash.flag = gflash.flag & (~i);;//清除bit
}
void memctl_init(void)
{
	gflash.flag=0;
	callback =flash_clear_0;

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值