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

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 回答时间:7 天前
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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版