STM32开发中的位运算以及位带操作

发布时间:2024-03-20  

为了像51单片机一样能够对某个管脚单独操作,引入了位带操作这样的操作机制。


如下图,位带(Bit band)区就是就是你想单独操作的IO的区域,比如PA1、PA2。而位带别名区就是你给每一位重新起了个名字的那一片地址区域。可以看下表,M3内核存储器映射表,你能看到1M内存的BitBand区,还有与之对应的32M内存的BitBand别名区,因为你将每一位膨胀成为了一个32位的地址,所以相应的别名区的内存也会是位带区的32倍。

c97d6352c623f76a6039fd9142315e64_wKgZomVm2-6ANZdLAAC5cZxZixk963.png

想进行位带操作,应该先去找该位对应的别名区的地址,找到了这个地址,对这个地址进行操作,那么实际上也就是对该位进行操作了。


官方给出了如下相应的计算公式:


AliasAddr

=0x42000000+((A‐0x40000000)*8+n)*4

=0x42000000+(A‐0x40000000)*32+n*4

其中,AliasAddr是别名区的地址,A是GPIOA->ODR的地址,n是该端口的上的某一位。


0x42000000是位带别名区域的起始地址,A是输出数据寄存器GPIOA->ODR的地址,A的地址先减去位带区基地址,得到的是相对于位带区基地址的偏移地址,那么膨胀之后还是一个偏移地址,是相对于位带别名区基地址的偏移量,加上位带别名区域基地址,就得到了其对应的别名区地址。


多数情况下,大家见到的代码,应该是以下这个样子,一共分为三步:


#defineBITBAND(addr,bitnum)((addr&0xF0000000)+0x2000000+((addr&0xFFFFF)<<5)+(bitnum<<2))

#define MEM_ADDR(addr)  *((volatile unsigned long  *(addr))                                                                       

#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum))

第一步,就是我们上面分析的,得到位带别名区域的32位地址。


第二步,就是将第一步得到的32位地址,给转换成一个指针变量,并且操作这个地址里的值,唯一的区别,就是由于安全的考虑,多加了一个volatile 这样的关键字。


举个例子


如下,想直接访问0x00000001这个地址,并且给这个地址写1,该怎么做呢?


#defineADDR0x00000001

*(int*)ADDR=1;

第三步,就是将前两部,结合在一起,根据传入的addr和bit计算得到32位的地址,然后强制类型转换,使得我们可以去操作这个地址里的值。


提示:bitnum<<2相当于bitnum2乘以4,实际上在计算机底层乘法也是基于位运算实现的。


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    STM32开发中的位运算以及位带操作;为了像51单片机一样能够对某个管脚单独操作,引入了位带操作这样的操作机制。 如下图,位带(Bit band)区就是就是你想单独操作的IO的区域,比如PA1......
    ; ||)和位运算符(<< >> ~ | ^&)的区别,对寄存器的操作使用的是位运算符,逻辑运算符一般用于在程序中判断逻辑中使用。 例如 定义一个8位的寄存器(0xf0是寄......
    。 【37】16位和32位运算怎么理解? 答:数据寄存器是16位参与运算的,因为三菱的每个数据寄存器都是16位,如果想进行32位运算,就必须两个相邻的数据寄存器,比如B0和B1组成32位,而且规定了B0是低......
    电机调速方法有哪三种 电动机的同步转速怎么算;  电机调速方法有哪三种   常用的电机调速方法有以下三种:   变频调速:通过改变电源频率,控制电机的转速。这种调速方式广泛应用于各种交流电机,具有......
    TRUE A = FALSE B = TRUE TRUE FALSE TRUE TRUE A = FALSE B = FALSE TRUE FALSE FALSE FALSE 该表也适用于用位运算符进行的运算......
    低级语言贴近硬件的特点。这也是在各个领域中都可以看到C的重要原因。在这一节中将详细讲解C51中的位操作及其应用。 1、位运算符 C51提供了几种位操作符,如下表所示: 1)“按位与”运算符(&) 参加运算......
    ) 算术运算指令:用于进行加、减、乘、除等算术运算。 (3) 逻辑运算指令:用于进行位运算、逻辑运算和移位运算等。 (4) 控制转移指令:用于改变程序的执行流程。 (5) 中断指令:用于......
    多的税,公司出!”她坦言,现在来美国快1年了,税到底怎么算都不知道,只知道在中国台湾的薪水被预扣了,在美国的薪水也被预扣,但是永远拿不回被扣的税。“缴税是人民义务我知道,但是我们要的很简单,就是知道钱怎么算......
    ; 1→CY,置位CY SETB bit ; 1→bit,置位某一位 [3]. 位运算指令 位运算都是逻辑运算,有与、或、非三种指令,共六条。 ANL C,bit ;(CY)∧(bit)→CY ANL......
    :bitnum《《2相当于bitnum2乘以4,实际上在计算机底层乘法也是基于位运算实现的。 ......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>