完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
//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个回答
|
|
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系列微控制器支持位带操作,你提供的代码示例正确地实现了位带操作的宏定义。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1202 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1217 浏览 1 评论
625 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
470 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1146 浏览 2 评论
1678浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
337浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
333浏览 3评论
327浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
304浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-9-1 07:35 , Processed in 0.827417 second(s), Total 82, Slave 64 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191