×
单片机 > 单片机程序设计 > 详情

stm32之位带操作:原理及使用方式

发布时间:2020-06-01 发布时间:
|

    忽然想起来之前的位带操作还没有放上来,单片机裸机很多时候都是GPIO的操作,当然我们如果使用库函数的话实际没什么差别,不使用位带操作时,可以用库函数GPIO_ReadOutputData()与GPIO_ReadInputData()来读取GPIO的输入输出,但是这个位带操作是个很厉害的发明,下面讲下它的原理以及位带操作有什么优越性。

    这个位带操作是做待机唤醒想起来的,这里有个函数PAin(n),就是读取第几个PA口的数据,程序具体如下

 #define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)

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

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

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

    当时忘了位带操作,第一感觉这程序写的跟*一样,哈哈中间那个一堆与或和移位那里实际是cortex-m3的数据手册中的规定。


    位带区在cortex内核中有固定的位置


    那么为什么要使用位带操作呢,这个实际是来源于原来51单片机的思想,就是把仅仅1bit表示的输入膨胀为一个存储空间,在数据手册中也有所体现

   

    一句话概括,就是一个位带区的存储空间存储8bit,而这8bit每一位都会是一个GPIO的输入输出。但是经过位带映射之后一个存储空间就是原来的1bit,由于输入输出只有0和1,因此判断是否非0就可以。

    那么这个位带操作有什么好处呢,和非位带操作读写有什么区别,实际从编程的角度来说没什么区别,就是一个函数的问题,但是从汇编角度,位带操作把“读—改—写”变成了内存的操作,在程序运行上效率更高,下面可以明显看出,汇编运行的步骤更为简洁。


    当然了,大部分同学都是直接使用库函数的,这个确实很方便,一般的开发时候直接使用#define的GPIO函数就好,当然,位带操作也必须有所了解,对于提高系统效率有很大的帮助。




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
浅谈AVR中定时器几种工作模式