用了不少芯片,就只有51有位操作,这个特性很喜欢,赋值简单、效率又高且节省内存,不必为了一个bool去分配一个uint8.
发现stm32有Bit-Banding,就试了一下,用MDK-ARM环境下的汇编代码做了一些比较。
操作,清零USART1的SR寄存器的TC位:
方法一:
//利用USART_TypeDef这个结构寻到SR的地址,再赋值USART1->SR &= ~(1<<6);
其汇编代码(-level 0)如下:
用了7条指令。
方法二:
直接用SR的地址操作:
*(__IO uint32_t *) 0x40013800 &= ~(1<<6);
汇编如下:
可以看到代码跟方法一是一样的,所以以后没有必要用这个方法了,一点效率提升都没有,代码还难读。
方法三:
位域
//下面两个宏的汇编代码是一样的#define USART1_TC_ResetBit_BB() \
(*(__IO uint32_t *) (PERIPH_BB_BASE | ((USART1_BASE + 0x00 - PERIPH_BASE) << 5) | ((6) << 2)) = 0)#define USART1_TC_ResetBit_BB2() (*(__IO uint32_t *) 0x42270018 = 0)
这个位域的代码只需要3个指令,而且可定义看到,这个位域不像51那样是位寻址,有专业的位操作指令。上面这3条还是通用的指令,也是在4G空间线性寻址。
执行完之后的效果,可以看到TC被清除了:
综上所述,Bit-Banding确实可以提高代码效率,但是说到写程序的方便程度,如果用C语言的话,还是一样的,因为那些代码都可以用宏定义或者函数来封装。
关键字:STM32 Bit-Banding
引用地址:
STM32之Bit-Banding
推荐阅读最新更新时间:2024-03-16 15:34
STM32中断与NVIC概览
NVIC: Nested vectored interrupt controller, 嵌套中断向量控制器. 中断与异常: 所有能打断正常执行流的事件都称为异常. 异常与中断的区别在于, 中断请求是来自于Cortex内核外部, 比如各种片上外设, 外部中断请求等, 它们对于内核是”异步”的; 而异常则是由于Cortex内核在执行指令或者访问存储等操作时所产生的, 对于Cortex内核来说是属于”同步”的(可以参见Cortex M3权威指南), 异常和中断一般可以不加区分的使用. Cortex内核可以支持多达240个外部中断, 编号16 – 255. 编号1 – 15的为系统异常, 编号0未被使用. Cortex支行中断嵌套, 允许
[单片机]
STM32之DMA(直接存储器存储)
DMA简介: 在硬件系统中,主要由CPU(内核),外设,内存(SRAM),总线等结构组成,数据就经常要在内存与外设之间传输转移,或者是从外设A转移到外设B. DMA(Direct Memory Access)直接存储器存储,是一种可以大大减轻CPU工作量的数据存储方式. 数据转移的一般方式: 例如当CPU需要处理由ADC外设采集回来的数据时,CPU首先要把数据从ADC外设的寄存器读取到内存中(变量),然后进行运算处理. (但是,因为在转移数据的过程中会占用CPU十分宝贵的资源,所以希望CPU更多地被用在数据运算或响应中断之中,而数据转移的工作交由其它部件完成。) DMA的方式: DMA可以为CPU分担了数据转移的工作。因为DMA的
[单片机]
STM32的GPIO输出编程实例之点亮三色LED
一、概述: 1、发光二极管简介 发光二极管是半导体二极管的一种,可以把电能转化为光能,常简写为LED。常用的是发红光、绿光或黄光的二极管。发光二极管的反向击穿电压约为5V。它的正向伏安特性曲线很陡,使用时必须串联限流电阻以控制通过管子的电流。限流电阻R可用下式计算: R = (E - UF)/IF 式中E为电源电压,UF为LED的正向压降,IF为LED的一般工作电流。LED广泛应用于各种电子电路、家电、仪表等设备中,做电源或电平指示。 2、STM32 GPIO简介 GPIO可以配置成以下8种工作模式: 浮空输入:此端口在默认情况下什么都不接,呈高阻态,这种设置在数据传输时用的比较多。 上拉输入:上拉输入模式与浮空输入模式相
[单片机]
STM32以太网程序解析二
--------------------------------------------------------------------------------------------------------------------------- 下面我们来详细看一下程序,我们将逐行的进行分析。 1. int simple_server(void) 2. { 3. unsigned int plen,dat_p,i1=0,payloadlen=0; 4. unsigned char i=0,*buf1 = 0; 5. signed char cmd; 6. 7. /
[单片机]
STM32——使用PWM+DMA实现脉冲发送精确控制
之前用stm32写过脉冲发送的代码,用来控制步进电机,但是缺点明显,之前是用定时器中断做的,所以一但控制的电机多起来,MCU资源占用就很大,这在大多数情况下是不可接受的,更不用说多轴联动了。 最近做的步进电机CAN总线控制系统,就想顺便重新写驱动。希望做到占用很少的MCU资源,实现脉冲发送的精确控制。既然是用来控制步进电机,那么脉冲的数量和频率一定要可控,要不然怎么实现电机的加减速曲线。于是就想到了DMA。 DMA (直接存储器访问) DMA(Direct Memory Access,直接内存存取) 是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依赖于 CPU 的大量中断负载。否则,CPU 需要从来源把每一
[单片机]
基于STM32单片机1602显示电子时钟
1、本系统采用1602显示时分秒,4个按键可以调整时间,一个按键是选择按键,一个按键是加,一个按键是减,一个按键是退出按键。 2、当选择按键按下的时候,该选择位闪烁。 主函数代码: #include delay.h #include sys.h #include 1602.h #include timer.h #include key.h u8 table1 = liyang ; u8 table2 = 9876543210654321 ; signed char miao,fen,shi; u8 flag_100ms=0; u16 count_ms=0; u8 S1num; /******************
[单片机]
STM32外部中断与各通道对应关系
EXTI0_IRQn的值,其实就是EXTI0中断向量在中断向量表中的位置(STM32技术参考手册中断向量表position栏中的数值) 一:外部中断使用配置过程: (1)配置时钟信号 (2)引脚属性 (3)NVIC配置 (4)外部中断配置 二:配置步骤 步骤如下: 1.系统初始化,如系统时钟初始化,使之进入72MHZ主频;程序启动时已调用SystemInit()函数将主频改为72MHZ。 2.GPIO配置,务必注意打开GPIO时钟时,一定打开AFIO时钟。 在使用引脚的重映射功能和外部中断时需要使用AFIO时钟。 3.EXTI配置,在这里配置需要选择哪个引脚作为中断引脚。 //定义一个EXTI初始化结构体 EXTI_Ini
[单片机]
RyanMqtt移植指南
测试环境:stm32F401RCT6、RT-Thread版本: v4.1.0、RT-Thread Studio版本: 2.2.6、网络硬件使用ec800m移植at_socket使用sal框架。 1、移植介绍 RyanMqtt 库希望应用程序为以下接口提供实现: system 接口 RyanMqtt 需要 RTOS 支持,必须实现如下接口才可以保证 mqtt 客户端的正常运行 network 接口 RyanMqtt 依赖于底层传输接口 API,必须实现该接口 API 才能在网络上发送和接收数据包 MQTT 协议要求基础传输层能够提供有序的、可靠的、双向传输(从客户端到服务端 和从服务端到客户端)的字节流 time 接口
[单片机]