在STM32中,位带操作是一种非常有用的技术,它可以让你直接访问一个单一的位,而不必去读取或者写入整个寄存器。这种技术可以用于提高代码的执行效率和减少代码的大小。
在STM32中,位带操作可以通过特殊的寄存器和内存映射来实现。具体来说,STM32的每个位都有一个对应的位带别名寄存器。例如,如果你想访问寄存器RCC->CR的第3个位,你可以使用位带别名寄存器来直接读取或者写入该位,而不必读取或者写入整个寄存器。
以下是一个示例代码,展示了如何使用位带操作来设置STM32的GPIOB端口的第5个位:
#define BITBAND(addr,bitnum) ((addr & 0xF0000000)+0x02000000+((addr & 0xFFFFF)< < 5)+(bitnum< < 2))
#define MEM_ADDR(addr) *((volatile unsigned long *) (addr))
#define BIT_ADDR(addr,bitnum) MEM_ADDR(BITBAND(addr,bitnum))
#define GPIOB_ODR_ADDR 0x40010C0C
#define GPIOB_ODR_BIT_NUM 5
int main(void)
{
// Set GPIOB Pin 5
BIT_ADDR(GPIOB_ODR_ADDR, GPIOB_ODR_BIT_NUM) = 1;
return 0;
}
在上面的代码中,BITBAND宏将内存地址和位号映射到对应的位带别名寄存器的地址上。MEM_ADDR宏将该地址转换为指向volatile unsigned long类型的指针,并使用BIT_ADDR宏来访问该位。最后,我们可以使用位带别名寄存器来设置GPIOB端口的第5个位,而不必去读取或者写入整个寄存器。
需要注意的是,位带操作可以让你访问单个位,但是它并不一定比读取或者写入整个寄存器更快。实际上,在某些情况下,使用位带操作可能会导致性能下降。因此,在使用位带操作时,你应该进行必要的测试和优化,以确保它确实可以提高代码的执行效率。
关键字:STM32 位带操作
引用地址:
详解STM32中的位带操作
推荐阅读最新更新时间:2024-11-12 19:08
STM32学习之路(二)——MDK-ARM开发过程简介
一,准备MDK-ARM+JLINK+STM32软件包 1,在 http://www.mcu123.com/news/Soft/embsof/arm/200908/505.html 下载RealView MDK-ARM 3.80a(MDK-ARM V3.80a,MDK3.80a)版本 mdk380a_mcu123.rar http://esoft.mcu123.com/MCU123_temp_0080309@/arm/mdk380a_mcu123.rar (注册机自行查找,安装过程略) 2,在 http://www.segger.com/cms/jlink-software.html 下载Software
[单片机]
STM32驱动0.96 OLED I2C显示程序
0.96 OLED的主控芯片是SSD1306,用STM32驱动OLED显示的程序如处图所示 #include system.h #include SysTick.h #include OLED_I2C.h int main() { u8 i; extern const unsigned char BMP1 ; SysTick_Init(72); I2C_Configuration(); OLED_Init(); while(1) { OLED_CLS(); for(i=0;i 5
[单片机]
stm32 内存管理
分块式内存管理 分块式内存管理 1 举例 #define MEM1 0 //内部SRAM #define MEM2 1 //外部SRAM #define MEM1_BLOCK_SIZE 32 //内存块大小 32字节 #define MEM2_BLOCK_SIZE 32 #define MEM1_MAX_SIZE 10 * 1024 //10K #define MEM2_MAX_SIZE 40 * 1024 #define MEM1_TABLE_SIZE MEM1_MAX_SIZE / MEM1_BLOCK_SIZE #define MEM2_TABLE_SIZE MEM2_
[单片机]
stm32 环形缓冲区
/*========================ringbuff.H========================================*/ #ifndef __RingBuff__H #define USER_RINGBUFF 1 //使用环形缓冲区形式接收数据 #if USER_RINGBUFF /**如果使用环形缓冲形式接收串口数据***/ #define RINGBUFF_LEN 200 /*最好是2^N,此时就可以进行用取模运算 https://www.cnblogs.com/rechen/p/5143841.html*/ #define FLASE 1 #define TRUE 0 #define TI
[单片机]
STM32学习笔记之__attribute__ ((at())绝对定位分析
学习STM32也会遇到这样的绝对定位的问题如下: uint8_t UART_RX_BUF __attribute__ ((at(0X20001000))); //就是将串口接收的数据定位到RAM中起始地址为0X20001000; 绝对定位要么定位到flash、要么定位到RAM,这里我们将定位在flash进行说明。 MDK如何实现将数据存储到FLASH指定地址? 我们在烧录数据的时候,一般是从0x08000000开始按照顺序烧录到flash里面的,如何让数据能够定义到绝对地址如0800F000,就必须保证文件内数据也是存储在该地址,为了实现这个目的,MDK在生成文件时会填充0x00字段,从而确保能够将数据定义到
[单片机]
STM32 Systick定时器在实现1us延时时的问题与解决
问题: 使用systick_config()函数来实现计数,这个函数在下面代码中的 SysTick_CTRL_TICKINT_Msk 开启了中断。不论系统时钟为72Mhz或36Mhz若设置STM32每10us进入一次中断,计时是可以的;而每1us进入中断,由于中断指令较多,那么程序就会困在中断里出不来。 static __INLINE uint32_t SysTick_Config(uint32_t ticks) { if (ticks SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */
[单片机]
STM32 的待机唤醒功能
STM32 待机模式简介 很多单片机都有低功耗模式,STM32 也不例外。在系统或电源复位以后,微控制器处于运行状态。运行状态下的 HCLK 为 CPU 提供时钟,内核执行程序代码。当 CPU 不需继续运行时,可以利用多个低功耗模式来节省功耗,例如等待某个外部事件时。用户需要根据最低电源消耗,最快速启动时间和可用的唤醒源等条件,选定一个最佳的低功耗模式。 STM32 的 3 种低功耗模 STM32 的低功耗模式有 3 种: 1)睡眠模式(CM3 内核停止,外设仍然运行) 2)停止模式(所有时钟都停止) 3)待机模式(1.8V 内核电源关闭) 在这三种低功耗模式中,最低功耗的是待机模式,在此模式下,最低只需要 2uA 左右的
[单片机]
STM32开漏,推挽的知识
有关推挽输出、开漏输出、复用开漏输出、复用推挽输出以及上拉输入、下拉输入、浮空输入、模拟输入区别 有关推挽输出、开漏输出、复用开漏输出、复用推挽输出 以及上拉输入、下拉输入、浮空输入、模拟输入的区别 最近在看数据手册的时候,发现在Cortex-M3里,对于GPIO的配置种类有8种之多: (1)GPIO_Mode_AIN模拟输入 (2)GPIO_Mode_IN_FLOATING浮空输入 (3)GPIO_Mode_IPD下拉输入 (4)GPIO_Mode_IPU上拉输入 (5)GPIO_Mode_Out_OD开漏输出 (6)GPIO_Mode_Out_PP推挽输出 (7)GPIO_Mode_AF_OD复用开漏输出 (8)GPIO_M
[单片机]