指针移位操作在STM32中的应用

指针移位操作通常指对指针进行地址的偏移或移位,以便于访问连续的内存区域。

在C语言中,可以通过以下方式对指针进行移位操作:

int a[10] = {1, 2, ..., 10};
int *p = &a[0];       // 将指针p指向数组a的第一个元素
p += 3;               // 将指针p向右移动3个位置

在以上代码中,首先定义了一个整型数组a和一个指向其第一个元素的指针p。然后,将指针p向右移动3个位置,即将其指向a[3]位置的地址。这里使用了指针算术运算中的加法运算,由于指针p指向的数据类型是int类型,因此每次移动时应该增加4个字节的偏移量(或称大小)。

需要注意的是,在进行指针移位操作时,应该确保指针类型和指向的数据类型一致,并遵循C语言指针算术运算的规则。此外,还应该考虑指针越界和未定义行为等问题,以确保程序正常运行和可靠性。

需要注意的是,在进行指针移位操作时,应该确保指针类型和指向的数据类型一致,并遵循C语言指针算术运算的规则。此外,还应该考虑指针越界和未定义行为等问题,以确保程序正常运行和可靠性。

 以下代码是STM32的SPI实验中有关页写自动换页函数代码,其中指针位移操作的应用代码部分为:pBuffer+=pageremain;//数组指针左移pageremain位

具体作用是在写入数据字节数超过写入地址那一页剩余的字节数时,首先将写入地址那一页剩余字节数写满,然后跳转到下一页。完成换页后,我们不能将需要写入的数据再从头开始写了,因为,在上一页我们已经将数据写入了一部分,再写的话,这一页数据会有一部分和上一页一样,所以只能接着我们写入的那部分数据的下一个字节开始写。因此,我们需要利用需要写入数据的数组的指针移位操作,将数组指针指到需要继续写的那一个字节的位置上。然后再继续进行页写操作。

举例说明:

首先我们需要知道一页可以写256个字节

为解说方便我们假设SPI FLASH内存只有两页(也就是256*2个字节,也就是所有地址0~511)

我们要写的数据有321个,并且将写入字节的首地址是121,此时第一页我们只能写入255-121+1=135个字节,那么还剩下321-135=186个字节只能写入第二页,在写入第二页时,我们肯定要从要写入数据的第136个字节开始写入,因此我们要将写入数据数组的指针进行移位操作,将数组指针移到第136个字节的地址上。然后继续进行第二页的写操作。

//无检验写SPI FLASH 
//必须确保所写的地址范围内的数据全部为0XFF,否则在非0XFF处写入的数据将失败!
//具有自动换页功能 
//在指定地址开始写入指定长度的数据,但是要确保地址不越界!
//pBuffer:数据存储区
//WriteAddr:开始写入的地址(24bit)
//NumByteToWrite:要写入的字节数(最大65535)
//CHECK OK
void W25QXX_Write_NoCheck(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)   
{ 			 		 
	u16 pageremain;	   
	pageremain=256-WriteAddr%256; //单页剩余的字节数		 	    
	if(NumByteToWrite<=pageremain)pageremain=NumByteToWrite;//不大于256个字节
	while(1)
	{	   
		W25QXX_Write_Page(pBuffer,WriteAddr,pageremain);
		if(NumByteToWrite==pageremain)break;//写入结束了
	 	else //NumByteToWrite>pageremain
		{
			pBuffer+=pageremain;//数组指针左移pageremain位
			WriteAddr+=pageremain;	

			NumByteToWrite-=pageremain;			  //减去已经写入了的字节数
			if(NumByteToWrite>256)pageremain=256; //一次可以写入256个字节
			else pageremain=NumByteToWrite; 	  //不够256个字节了
		}
	};	    
} 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值