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

发布者:SereneNature最新更新时间:2018-10-16 来源: eefocus关键字:stm32  位带操作  使用方式 手机看文章 扫描二维码
随时随地手机看文章

    忽然想起来之前的位带操作还没有放上来,单片机裸机很多时候都是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))

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

stm32之位带操作:原理及使用方式
    位带区在cortex内核中有固定的位置

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

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

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

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

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


关键字:stm32  位带操作  使用方式 引用地址:stm32之位带操作:原理及使用方式

上一篇:stm32TIM输出通道配置详解
下一篇:stm32之TFT触摸屏(ILI9320)(2):由触摸屏写入EEPROM

推荐阅读最新更新时间:2024-03-16 16:16

STM32中单独设置GPIO端口高8/低8的方法
stm32的IO端口都是16位的, 如果要单独操作某高8位或低8位, 则不是那么简单, 先看两张BSRR/BRR寄存器的图: 据官方数据手册上面说, 这两个寄存器用于专门对ODR进行原子操作的位操作, 都是在置1的时候对某位有影响. 举例说下怎么对IO端口赋值: 1.对高8位/低8位/全部清零 很明显, 这个只需要操作BRR寄存器即可: 对高8位清零:GPIOA- BRR = 0xFF00 对低8位清零:GPIOA- BRR = 0x00FF 全部清零: GPIOA- BRR = 0xFFFF 或 GPIOA- ODR = 0x0000 当然了, 使用下面2,3的两个宏也可以完全该清零操作~ stm
[单片机]
<font color='red'>STM32</font>中单独设置GPIO端口高8<font color='red'>位</font>/低8<font color='red'>位</font>的方法
STM32学习笔记6(TIM模块定时器)
TIM模块定时器向上溢出 & 输出比较 首先我们必须肯定ST公司的实力,也承认STM32的确是一款非常不错的Cortex-M3核单片机,但是,他的手册实在是让人觉得无法理解,尤其是其中的TIM模块,没有条理可言,看了两天几乎还是不知所云,让人很是郁闷。同时配套的固件库的说明也很难和手册上的寄存器对应起来,研究起来非常费劲!功能强大倒是真的,但至少也应该配套一个让人看的明白的说明吧~~两天时间研究了STM32定时器的最最基础的部分,把定时器最基础的两个功能实现了,余下的功能有待继续学习。首先有一点需要注意:FWLib固件库目前的最新版应该是V2.0.x,V1.0.x版本固件库中,TIM1模块被独立出来,调用的函数与其他定时器不同;在V
[单片机]
STM32-(32):窗口看门狗
窗口看门狗 窗口看门狗通常被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。除非递减计数器的值在T6位变成0前被刷新,此看门狗电路在达到可编程的时间周期时,会产生一个MCU复位。在递减计数器达到窗口寄存器之前,如果递减计数器值的第7位(在控制寄存器中)被刷新,那么也将产生一个MCU复位。这表明递减计数器需要在一个有限的窗口中被刷新。 T6即是窗口看门狗的自减计数器的第六位(最高位),该计数器的时钟来自PCLK1/4096/预设分频数。在该计数器的T6位变为0后(小于0X40 ) ,就会引起一复位。这是窗口的下限。而当计数器的值在大于窗口配置寄存器的窗口值之前就被修改的话,也会引起一次复位,这
[单片机]
STM32-(32):窗口看门狗
stm32单片机oled显示程序 浮点数显示
单片机源程序如下: // 文 件 名 : OLED // 版 本 号 : 2017521 // 功能描述 :在OLED上显示信息 // 接法说明: // ---------------------------------------------------------------- // OLED接法 // // GND 电源地 // VCC 接5V或3.3v电源 // CLK 接PD9(SCL) // MOSI 接PD7(SDA) // RES 接PD4 // DC 接PD5
[单片机]
使用ITM机制实现调试stm32单片机
使用ITM机制实现调试stm32单片机,实现printf与scanf。 1. ITM简介 ITM机制是一种调试机制,是新一代调试方式,在这之前,有一种比较出名的调试方式,称为半主机(semihosting)方式。 在pc上编写过C语言的人都知道,printf可以向控制台输出,scanf可以从控制台获取输入,这里的printf/scanf都是标准库函数,利用操作系统的这些函数,我们可以很方便的调试程序。在嵌入式设备上(如stm32单片机平台上)开发工具(如MDK/IAR)也都提供了标准库函,自然也提供了printf/scanf函数,那么这些函数是否可以使用呢? 问题来了,printf向哪里输出呢?并且大部分情况下,也没有键盘,又
[单片机]
<font color='red'>使用</font>ITM机制实现调试<font color='red'>stm32</font>单片机
STM32的DMA串口直通
搞这个,起因呢,公司产品里ZigBee模块固件版本不对,一大批产品需要二次升级。 需要升级的ZigBee模块是直接与stm32相连的,没有引出升级口,所以得搞个串口直通程序,通过232转MCU再转ZigBee,来进行升级。 一开始直接中断互通,结果呢,通倒是可以通,一升级固件就不行了,大概是因为数据量较大吧。 所以用了DMA,之前也没用过DMA,就慢慢学慢慢模仿着改呗。 这里要涉及到一个点,DMA的外设到外设,经常写的是,DMA只有外设到内存、内存到外设、内存到内存三种模式。 实际上,DMA是可以外设直接到外设的,而且用法非常非常简单,直接设置成外设到内存或内存到外设模式,然后把内存直接改成外设的地址,就可以了。
[单片机]
<font color='red'>STM32</font>的DMA串口直通
STM32学习笔记】USART 新特性
支持RXD和TXD管脚互换 很多时候,我们在外接RS232芯片时,很容易将RXD和TXD两根线接反。这类低级错误,一般是老司机才会犯。如果大家知道USART的TXD和RXD管脚可以互换,那么在连接外设RS232芯片时,如果发生错误,就不必再修改硬件,只需直接在软件中将RXD和TXD的管脚反转过来即可修正错误。 参考上图,设置SWAP位,即可将RXD和TXD管脚互换。 支持接收和发送的电平极性反转 第二个特性是,接收和发送的电平极性是可以反转的。通常默认串口电平是高电平为逻辑1,低电平为逻辑0;而在ST的USART中是可以将高电平设置为逻辑0,低电平设置为逻辑1的。这一特性,让我们在一些特殊的场景下灵活使用,举
[单片机]
STM32单片机半主机模式的应用
在keil中编程时常会遇到__use_no_semihosting_swi的警告,这时你就是进入了半主机模式。 在嵌入式的编程中你是避免不了使用printf、fopen、fclose等函数的但是因为嵌入式的程序中并没有对这些函数的底层实现,使得设备运行时会进入软件中断BAEB处,这时就需要__use_no_semihosting_swi这 个声明,使程序遇到这些文件操作函数时不停在此中断处,具体操作如下,将下列程序加入你的工程中: #pragmaimport(__use_no_semihosting_swi)#pragmaimport(_main_redirection)constchar__stdin_name[150]
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved