stm32学习之单独操作寄存器的某一个位

ps:此文章可以接在第一篇文章后面看,这篇文章主要写了一个利用指针位操作去控制某个寄存器的函数,以及对于这个函数的发散思考。

之前在研究指针的时候萌发了这个想法,起因是想写一个可以操作一个地址里面任意一个bit位的函数,于是突然想到,如果能写这么一个函数,那肯定也能用这样的方法直接去操作寄存器的某一位了,那样的速度更快。我们看一下代码。

 形参非常的简单,输入寄存器地址和要改变的位置,就能直接改变某一位的值,我们方便看现象我就拿led灯GPIOB->ODR的地址测试了一下,灯被点亮了。

int main()
{
	LED_init();
	
	//0X40010C0C
	
	bit_reset_left(5,(uint32_t*)0X40010C0C);
	
}
void bit_reset_left(int n,uint32_t* arr)
{
	uint32_t left = 0x0<<n;
	uint32_t* p = arr;
	*p &= left;
}

void bit_set_left(int n,uint32_t* arr)
{
	uint32_t left = 0x1<<n;
	uint32_t* p = arr;
	*p |= left;
}

另外这个函数一开始我是用来操作一个数组里面的某一位的值的,我们来看一下原函数。大家可以猜一下结果是多少。

#include <stdio.h>

unsigned int num[2]={0};

void bit_set(int n,unsigned int* arr)
{
	unsigned int mask =  (0x1<<((n-1)%32));
	unsigned int* p = arr + (n/32);
	*p |= mask;
}

int main()
{
	bit_set(1,num);
	bit_set(33,num);
	printf("num[0]=%d\n",num[0]);
	printf("num[1]=%d\n",num[1]);
}

 代码的意思是num数组的第一位和第三十二位set 1,就是num[0]的第一位,num[1]的第二位。

因为一个地址的大小是四个字节也就是32个bit,所以我们用n%32和n/32的操作,可以操作把n的范围控制在1-64,然后代表这个数组里面所有的位,很方便,我们还可以更改改变位的方向,可以右移改变。

 我们这样就用数组来更巧妙形象的记录数据了,然后可以写一个读取bit位的函数.....之后还能干嘛就看大家怎么用了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32寄存器操作可以通过使用操作实现。操作是一种在嵌入式系统中常用的技术,可以方便地对单个寄存器中的进行操作操作使用一个专门的地址映射区域,将每个寄存器中的每个都映射到一个单独的地址上。这样,就可以使用普通的读写指令来访问单个,而不需要使用移和逻辑运算等操作。 例如,对于一个32寄存器,第0的地址为0x42000000,第1的地址为0x42000004,第2的地址为0x42000008,以此类推。对于一个需要修改第3的值的操作,可以使用如下代码: ``` #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x02000000+((addr & 0x000FFFFF)<<5)+(bitnum<<2)) #define REG(addr) (*((volatile unsigned long *) (addr))) #define BIT_SET(addr, bitnum) ((REG(BITBAND(addr, bitnum))) = 1) #define BIT_CLR(addr, bitnum) ((REG(BITBAND(addr, bitnum))) = 0) unsigned long *reg = (unsigned long *) 0x40000000; BIT_SET(reg, 3); ``` 这段代码中,`BITBAND` 宏将地址和数转换成一个带地址。`REG` 宏将带地址转换为指向寄存器的指针。`BIT_SET` 和 `BIT_CLR` 宏分别设置和清除。 当然,也可以使用标准的操作语法来实现操作,如下所示: ``` unsigned long *reg = (unsigned long *) 0x40000000; *reg |= (1 << 3); // Set bit 3 *reg &= ~(1 << 3); // Clear bit 3 ``` 以上提供两种实现方式,使用哪种方式取决于个人喜好和实际应用场景。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值