历史上的今天
今天是:2024年10月16日(星期三)
2018年10月16日 | stm32之位带操作:原理及使用方式
2018-10-16 来源:eefocus
忽然想起来之前的位带操作还没有放上来,单片机裸机很多时候都是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函数就好,当然,位带操作也必须有所了解,对于提高系统效率有很大的帮助。
史海拾趣
|
本帖最后由 paulhyde 于 2014-9-15 09:21 编辑 一、 大赛项目 “天华杯”嵌入式系统设计与开发大赛(专业组) “天华杯”嵌入式系统设计与开发大赛(大学组) “天华杯”单片机设计与开发大赛(大学组) “众友杯”电 ...… 查看全部问答> |
|
嵌入式/Linux/ARM/DSP/FPGA......海量资源下载,不断更新, 海科资源 http://www.haike-source.com/ 0 引 言 目前,大多数的工业设备都有专用的调试接口和调试软件,这种方式能有效解决系统现场调试和维护升级的问题,但也有一些弊端。首先, ...… 查看全部问答> |
|
Windows CE 6.0 无法创建 MediaPlayer COM 对象 大家好! 用VB.Net 2008 + CF3.5 开发了一个简单(无播放界面)的mp3/wma/wav播放器,播放程序在WinCE 6.0及Mobile 6.0的机器上使用, 在工程项目中引用了这个wmp.dll COM组件,编译后的程序在Mobile 6.0的机器上运行无问题,播放音乐也一切正常 ...… 查看全部问答> |
|
本人现在正在研究H.264解码器的verilog 代码,源代码是从网上下的qcif分辨率,baseline的解码器,csnd中已经有人上传过,我现在要把解码器改成cif分辨率,把代码修改之后只能解码一部分数据,其他都是不定态,哪位高手也是研究这方面的,能给指点一 ...… 查看全部问答> |
|
一、充电保护芯片MAX846使用 MAX8 4 6 A的工作原理如下 : 低压差线性稳压器的输 出端 ( VL) 电压始终为 内部基准 电压的 2倍 , 因此 , VL端可跟踪基准电压。同时可为外部负载提供 2 0 mA的 ...… 查看全部问答> |




