STM32
直播中

丁冬芹

7年用户 1295经验值
私信 关注
[问答]

STM32H743系列支持位带操作吗?

//IO口操作宏定义
define BITBAND(addr, bitnum) ((addr   0xF0000000)+0x2000000+((addr  0xFFFFF)<<5)+(bitnum<<2))

define MEM_ADDR(addr)  ((volatile unsigned long  )(addr))

define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum))

//IO口地址映射
define GPIOA_ODR_Addr    (GPIOA_BASE+20) //0x40020014

define GPIOB_ODR_Addr    (GPIOB_BASE+20) //0x40020414

define GPIOC_ODR_Addr    (GPIOC_BASE+20) //0x40020814

define GPIOD_ODR_Addr    (GPIOD_BASE+20) //0x40020C14

define GPIOE_ODR_Addr    (GPIOE_BASE+20) //0x40021014

define GPIOF_ODR_Addr    (GPIOF_BASE+20) //0x40021414

define GPIOG_ODR_Addr    (GPIOG_BASE+20) //0x40021814

define GPIOH_ODR_Addr    (GPIOH_BASE+20) //0x40021C14

define GPIOI_ODR_Addr    (GPIOI_BASE+20) //0x40022014

define GPIOA_IDR_Addr    (GPIOA_BASE+16) //0x40020010

define GPIOB_IDR_Addr    (GPIOB_BASE+16) //0x40020410

define GPIOC_IDR_Addr    (GPIOC_BASE+16) //0x40020810

define GPIOD_IDR_Addr    (GPIOD_BASE+16) //0x40020C10

define GPIOE_IDR_Addr    (GPIOE_BASE+16) //0x40021010

define GPIOF_IDR_Addr    (GPIOF_BASE+16) //0x40021410

define GPIOG_IDR_Addr    (GPIOG_BASE+16) //0x40021810

define GPIOH_IDR_Addr    (GPIOH_BASE+16) //0x40021C10

define GPIOI_IDR_Addr    (GPIOI_BASE+16) //0x40022010

//IO口操作,只对单一的IO口!//确保n的值小于16!
define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)  //输出

define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)  //输入

define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //输出

define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  //输入

define PCout(n)   BIT_ADDR(GPIOC_ODR_Addr,n)  //输出

define PCin(n)    BIT_ADDR(GPIOC_IDR_Addr,n)  //输入

define PDout(n)   BIT_ADDR(GPIOD_ODR_Addr,n)  //输出

define PDin(n)    BIT_ADDR(GPIOD_IDR_Addr,n)  //输入

define PEout(n)   BIT_ADDR(GPIOE_ODR_Addr,n)  //输出

define PEin(n)    BIT_ADDR(GPIOE_IDR_Addr,n)  //输入

define PFout(n)   BIT_ADDR(GPIOF_ODR_Addr,n)  //输出

define PFin(n)    BIT_ADDR(GPIOF_IDR_Addr,n)  //输入

define PGout(n)   BIT_ADDR(GPIOG_ODR_Addr,n)  //输出

define PGin(n)    BIT_ADDR(GPIOG_IDR_Addr,n)  //输入

define PHout(n)   BIT_ADDR(GPIOH_ODR_Addr,n)  //输出

define PHin(n)    BIT_ADDR(GPIOH_IDR_Addr,n)  //输入

define PIout(n)   BIT_ADDR(GPIOI_ODR_Addr,n)  //输出

define PIin(n)    BIT_ADDR(GPIOI_IDR_Addr,n)  //输入




回帖(1)

王杰

2024-7-23 17:37:40
STM32H743系列微控制器是支持位带操作的。位带操作是一种用于访问和控制特定位的方法,它允许程序员直接访问和修改寄存器的单个位,而不需要修改整个寄存器。

在STM32系列微控制器中,位带操作通常通过位带别名区域(Bit-Band Alias Area)实现。这个区域是一个特殊的内存区域,它映射了外设寄存器的每个位,使得程序员可以直接访问和修改这些位。

你提供的代码示例中,定义了一些宏来实现位带操作:

1. `BITBAND(addr, bitnum)`:这个宏将地址和位号组合起来,生成位带别名区域的地址。它首先将地址与0xF0000000进行按位与操作,以获取外设寄存器的基地址。然后加上0x2000000,以定位到位带别名区域。接下来,将地址的低16位与位号左移5位相加,以定位到正确的位。最后,将位号左移2位,以获取最终的位带地址。

2. `MEM_ADDR(addr)`:这个宏将地址转换为一个volatile无符号长整型指针,以确保编译器不会对地址进行优化。

3. `BIT_ADDR(addr, bitnum)`:这个宏使用`BITBAND`宏和`MEM_ADDR`宏来获取位带地址,并将其转换为一个volatile无符号长整型指针。

4. `GPIOA_ODR_Addr`和`GPIOB_ODR_Addr`:这些宏定义了GPIOA和GPIOB端口的数据输出寄存器(ODR)的地址。它们通过将基地址与偏移量相加来计算。

使用这些宏,你可以方便地访问和修改STM32H743系列微控制器的外设寄存器的单个位。例如,要设置GPIOA的第0位,你可以使用以下代码:

```c
#define GPIOA_BASE (0x40020000)
#define BIT_NUM 0

volatile unsigned long *bit_addr = BIT_ADDR(GPIOA_ODR_Addr, BIT_NUM);
*bit_addr = 1; // 设置GPIOA的第0位为高电平
```

总之,STM32H743系列微控制器支持位带操作,你提供的代码示例正确地实现了位带操作的宏定义。
举报

更多回帖

×
20
完善资料,
赚取积分