你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32H743系列支持位带操作吗,帮我看一下下面的代码是否正确

[复制链接]
thomson675843 提问时间:2024-7-13 17:31 / 未解决

//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-13 17:31

举报

1个回答
xmshao 回答时间:2024-7-15 13:19:48
STM32H7系列芯片是基于ARM CORTEX-M7内核的微处理器,没有像M3 M4内核那样内置位
带操作单元。


不过,尽管没有这个位带操作单元,但并不影响我们对内存或寄存器进行位操作。自行编写代码即可。


比方STM32的库里就有相关函数 或宏可以使用。


#define SET_BIT(REG, BIT)     ((REG) |= (BIT))


#define CLEAR_BIT(REG, BIT)   ((REG) &= ~(BIT))


#define READ_BIT(REG, BIT)    ((REG) & (BIT))


#define CLEAR_REG(REG)        ((REG) = (0x0))


#define WRITE_REG(REG, VAL)   ((REG) = (VAL))


#define READ_REG(REG)         ((REG))


对于GPIO指定管脚的操作,有HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)可以使用。

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版