【嵌入式C语言】位带操作

简介: 【嵌入式C语言】位带操作

位带操作实现了通过普通的加载/存储等指令对单一的1bit进行读写的功能。也就是说把1bit膨胀为32bit的字来操作(位带操作就是用一个地址代表一个比特,正常来说一个地址代表的是32bit,一次性操作的也是32bit)。

比如:

#define LED0 PBout(1) //其中 PBout(1)是位带操作

我们直接

LED0 = 1;

通过这个位带操作直接将IO口PB1置为了高电平,也就是通过位带操作直接改变了某一bit的值。

而普通的操作比如

int a = 1;

是将a所代表的内存最低位置为1,其余31bit置为0,这是直接操作了32bit内存。

CM3在两个区实现了位带

1. SRAM区的低1M字节:

       位带区                0x2000 0000 ~ 0x200F FFFC

       对应别名区         0x2200 0000 ~ 0x23FF FFFC

2. 片上外设低1M字节:

       位带区                0x4000 0000 ~ 0x400F FFFC

       对应别名区         0x4200 0000 ~ 0x43FF FFFC

下面通过0x40000000的8个bit举例说明位带区和别名区的关系

                   位带区                    别名区
      0x4000 0000       bit1      →               0x4000 0000       
      0x4000 0000       bit2      →               0x4000 0004 
                       ···      →                        ···
      0x4000 0000       bit8      →              0x4000 001C

通过表格可以看到,位带区的一个bit对应别名区的1个字即32bit,位带区每移动一个bit,别名区移动一个字。因为位带操作是用32bit来操作1bit,而每一个地址代表了8bit,所以别名区地址每次移动(32 / 8)。这就是通过别名区把位带区的1个bit膨胀为32bit。

别名区地址的求解公式如下

别名区地址 = 别名区基址 + ((位带区地址 - 位带区基址)* 8 + bit位) * 4

通过一段代码实例来深入理解

1. #define BITBAND(addr, bitnum) ((addr & 0xF0000000) + 0x20000000 + \
2.                               ((addr & 0xFFFFF) << 5) + (bitnum << 2))
3. //addr & 0xFFFFF相当于 addr - 位带基址
4. #define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
5. #define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
6. #define GPIOA_ODR_Addr 0x40020014   //GPIOA的输出寄存器地址
7. #define PAout(n) BIT_ADDR(GPIO_ODR_Addr, n)
8. 
9. //代码参考正点原子《STM32F429开发指南-HAL库版本_V1.1》

下面就可以通过

PAout(1) = 1;

直接将GPIOA的bit1置1,即引脚PA1置1.

参考《Cortex M3与M4权威指南》《STM32F429开发指南-HAL库版本》


相关文章
|
2月前
|
机器学习/深度学习 算法 数据挖掘
C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出
本文探讨了C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出。文章还介绍了C语言在知名机器学习库中的作用,以及与Python等语言结合使用的案例,展望了其未来发展的挑战与机遇。
52 1
|
2月前
|
人工智能 安全 算法
基于C语言的嵌入式系统开发,涵盖嵌入式系统概述、C语言的优势、开发流程、关键技术、应用实例及面临的挑战与未来趋势。
本文深入探讨了基于C语言的嵌入式系统开发,涵盖嵌入式系统概述、C语言的优势、开发流程、关键技术、应用实例及面临的挑战与未来趋势。C语言因其高效、可移植、灵活及成熟度高等特点,在嵌入式系统开发中占据重要地位。文章还介绍了从系统需求分析到部署维护的完整开发流程,以及中断处理、内存管理等关键技术,并展望了嵌入式系统在物联网和人工智能领域的未来发展。
80 1
|
7月前
|
C语言
C语言实现2048小游戏---粤嵌GE6818嵌入式系统实训
C语言实现2048小游戏---粤嵌GE6818嵌入式系统实训
|
5月前
|
算法 IDE 程序员
C语言与嵌入式系统:嵌入式C编程基础。
C语言与嵌入式系统:嵌入式C编程基础。
98 0
|
6月前
|
语音技术 C语言 Windows
语音识别------ffmpeg的使用01,ffmpeg的安装,会做PPT很好,ffmpeg不具备直接使用,只可以操作解码数据,ffmpeg用C语言写的,得学C语言,ffmpeg的安装
语音识别------ffmpeg的使用01,ffmpeg的安装,会做PPT很好,ffmpeg不具备直接使用,只可以操作解码数据,ffmpeg用C语言写的,得学C语言,ffmpeg的安装
|
7月前
|
存储 移动开发 C语言
技术心得记录:嵌入式开发中常用到的C语言库函数
技术心得记录:嵌入式开发中常用到的C语言库函数
70 1
|
7月前
|
C语言
C语言实现电子音乐相册---粤嵌GEC6818嵌入式系统实训
C语言实现电子音乐相册---粤嵌GEC6818嵌入式系统实训
|
7月前
|
C语言
C语言---函数--数组---创建一个整形数组,完成对数组的3种操作
C语言---函数--数组---创建一个整形数组,完成对数组的3种操作
|
1月前
|
存储 C语言 开发者
【C语言】字符串操作函数详解
这些字符串操作函数在C语言中提供了强大的功能,帮助开发者有效地处理字符串数据。通过对每个函数的详细讲解、示例代码和表格说明,可以更好地理解如何使用这些函数进行各种字符串操作。如果在实际编程中遇到特定的字符串处理需求,可以参考这些函数和示例,灵活运用。
66 10
|
1月前
|
存储 程序员 C语言
【C语言】文件操作函数详解
C语言提供了一组标准库函数来处理文件操作,这些函数定义在 `<stdio.h>` 头文件中。文件操作包括文件的打开、读写、关闭以及文件属性的查询等。以下是常用文件操作函数的详细讲解,包括函数原型、参数说明、返回值说明、示例代码和表格汇总。
52 9