硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1561|回复: 5
收起左侧

[STM32H7] 芯片外设使用硬件位带,如果没有起作用的话,注意使用__attribute__((bitband))的正确姿势即可

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106437
QQ
发表于 2021-12-10 09:12:01 | 显示全部楼层 |阅读模式

之前发的帖子:

推荐一种超简单的硬件位带bitband操作方法,让变量,寄存器控制,IO访问更便捷,无需用户计算位置
https://www.armbbs.cn/forum.php?mod=viewthread&tid=109508


帖子里面案例2,MDK编译会没有起作用,修改定义方式即可:

原来写法:
  1. typedef struct {
  2.   uint16_t ODR0 : 1;
  3.   uint16_t ODR1 : 1;
  4.   uint16_t ODR2 : 1;
  5.   uint16_t ODR3 : 1;        
  6.   uint16_t ODR4 : 1;
  7.   uint16_t ODR5 : 1;
  8.   uint16_t ODR6 : 1;
  9.   uint16_t ODR7 : 1;        
  10.   uint16_t ODR8 : 1;
  11.   uint16_t ODR9 : 1;
  12.   uint16_t ODR10 : 1;
  13.   uint16_t ODR11 : 1;        
  14.   uint16_t ODR12 : 1;
  15.   uint16_t ODR13 : 1;
  16.   uint16_t ODR14 : 1;
  17.   uint16_t ODR15 : 1;        
  18.   uint16_t Reserved : 16;        
  19. } GPIO_ORD  __attribute__((bitband));

  20. GPIO_ORD *GPIOA_ODR = (GPIO_ORD *)(&GPIOA->ODR);
复制代码


修改为如下写法:

  1. typedef struct {
  2. uint16_t ODR0 : 1;
  3. uint16_t ODR1 : 1;
  4. uint16_t ODR2 : 1;
  5. uint16_t ODR3 : 1;
  6. uint16_t ODR4 : 1;
  7. uint16_t ODR5 : 1;
  8. uint16_t ODR6 : 1;
  9. uint16_t ODR7 : 1;
  10. uint16_t ODR8 : 1;
  11. uint16_t ODR9 : 1;
  12. uint16_t ODR10 : 1;
  13. uint16_t ODR11 : 1;
  14. uint16_t ODR12 : 1;
  15. uint16_t ODR13 : 1;
  16. uint16_t ODR14 : 1;
  17. uint16_t ODR15 : 1;
  18. uint16_t Reserved : 16;
  19. } GPIO_ORD __attribute__((bitband));

  20. GPIO_ORD GPIOA_ODR __attribute__((at(0x40020014)));
复制代码


其中地址0x40020014很好获取,可以看参考手册,调试状态看MDK也非常方便:

QQ截图20211210090903.png

操作GPIOA的ODR1,就可以这样:
  1. GPIOA_ODR.ODR1 = 0;
  2.     GPIOA_ODR.ODR1 = 1;
复制代码


看反汇编,已经转换为硬件位带了:

1225.png


回复

使用道具 举报

4

主题

117

回帖

129

积分

初级会员

积分
129
发表于 2021-12-10 09:47:13 | 显示全部楼层
好像ARMCC V6不支持
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106437
QQ
 楼主| 发表于 2021-12-10 10:00:45 | 显示全部楼层
hance2000 发表于 2021-12-10 09:47
好像ARMCC V6不支持

AC6没有这个关键词了。
回复

使用道具 举报

2

主题

70

回帖

76

积分

初级会员

积分
76
发表于 2021-12-24 15:25:23 | 显示全部楼层
eric2013 发表于 2021-12-10 10:00
AC6没有这个关键词了。

那么AC6该如何处理
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106437
QQ
 楼主| 发表于 2021-12-24 16:32:02 | 显示全部楼层
sup999 发表于 2021-12-24 15:25
那么AC6该如何处理

用不了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-20 12:22 , Processed in 0.224890 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表