硬汉嵌入式论坛

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

[FMC] STM32H7的FMC扩展IO使用位域操作更省事,使用M3和M4内核的芯片还可以自动编译成硬件方式

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2019-6-18 13:12:48 | 显示全部楼层 |阅读模式
M3和M4支持硬件方式的位域操作,而M7内核不支持。
定义:
  1. typedef struct                                
  2. {
  3.         uint32_t tGPRS_TERM_ON : 1;   
  4.         uint32_t tGPRS_RESET :1;   
  5.         uint32_t tNRF24L01_CE :1;   
  6.         uint32_t tNRF905_TX_EN :1;  
  7.         uint32_t tNRF905_TRX_CE :1;

  8.         uint32_t tNRF905_PWR_UP :1;   
  9.         uint32_t tESP8266_G0 :1;  
  10.         uint32_t tESP8266_G2 :1;   
  11.                
  12.         uint32_t tLED1 :1;           
  13.         uint32_t tLED2  :1;         
  14.         uint32_t tLED3  :1;         
  15.         uint32_t tLED4 :1;           
  16.         uint32_t tTP_NRST   :1;      
  17.         uint32_t tAD7606_OS0  :1;   
  18.         uint32_t tAD7606_OS1  :1;   
  19.         uint32_t tAD7606_OS2  :1;   
  20.                
  21.         uint32_t tY50_0 :1;         
  22.         uint32_t tY50_1  :1;         
  23.         uint32_t tY50_2  :1;         
  24.         uint32_t tY50_3  :1;         
  25.         uint32_t tY50_4  :1;         
  26.         uint32_t tY50_5  :1;         
  27.         uint32_t tY50_6  :1;         
  28.         uint32_t tY50_7   :1;               

  29.         uint32_t tAD7606_RESET  :1;
  30.         uint32_t tAD7606_RANGE  :1;  
  31.         uint32_t tY33_2 :1;         
  32.         uint32_t tY33_3  :1;         
  33.         uint32_t tY33_4  :1;         
  34.         uint32_t tY33_5  :1;         
  35.         uint32_t tY33_6  :1;         
  36.         uint32_t tY33_7   :1;        
  37.         
  38. }FMCIO_ODR;

  39. FMCIO_ODR *FMC_EXTIO = (FMCIO_ODR *)0x60001000;
复制代码

使用:
比如操作LED1,亮灭就是
FMC_EXTIO->tLED1 = 1;
FMC_EXTIO->tLED1 = 0;

是不是更加简单省事。



评分

参与人数 1金币 +20 收起 理由
missfox + 20 666这么快就借鉴上了

查看全部评分

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2019-6-18 13:15:18 | 显示全部楼层
V6板子是M4内核的,可以使用硬件方式的位域操作,仅如下定义即可,编译器会自动转换成硬件的位域操作,是不是非常简单。




typedef struct                                
{
        uint32_t tGPRS_TERM_ON : 1;   
        uint32_t tGPRS_RESET :1;   
        uint32_t tNRF24L01_CE :1;   
        uint32_t tNRF905_TX_EN :1;  
        uint32_t tNRF905_TRX_CE :1;

        uint32_t tNRF905_PWR_UP :1;   
        uint32_t tESP8266_G0 :1;  
        uint32_t tESP8266_G2 :1;   
               
        uint32_t tLED1 :1;           
        uint32_t tLED2  :1;         
        uint32_t tLED3  :1;         
        uint32_t tLED4 :1;           
        uint32_t tTP_NRST   :1;      
        uint32_t tAD7606_OS0  :1;   
        uint32_t tAD7606_OS1  :1;   
        uint32_t tAD7606_OS2  :1;   
               
        uint32_t tY50_0 :1;         
        uint32_t tY50_1  :1;         
        uint32_t tY50_2  :1;         
        uint32_t tY50_3  :1;         
        uint32_t tY50_4  :1;         
        uint32_t tY50_5  :1;         
        uint32_t tY50_6  :1;         
        uint32_t tY50_7   :1;               

        uint32_t tAD7606_RESET  :1;
        uint32_t tAD7606_RANGE  :1;  
        uint32_t tY33_2 :1;         
        uint32_t tY33_3  :1;         
        uint32_t tY33_4  :1;         
        uint32_t tY33_5  :1;         
        uint32_t tY33_6  :1;         
        uint32_t tY33_7   :1;        
       
}FMCIO_ODR __attribute__((bitband));

FMCIO_ODR *FMC_EXTIO = (FMCIO_ODR *)0x60001000;

回复

使用道具 举报

23

主题

1403

回帖

1472

积分

至尊会员

积分
1472
发表于 2019-6-18 13:21:42 | 显示全部楼层
666,这么快就借鉴了
代码不规范,亲人两行泪!
回复

使用道具 举报

4

主题

52

回帖

64

积分

初级会员

积分
64
发表于 2019-6-18 14:13:57 | 显示全部楼层
和我那个很类似呢,位域的好处是不会影响其他位,而&= |=如果没注意很容易把其他位修改了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2019-6-18 14:59:03 | 显示全部楼层
missfox 发表于 2019-6-18 13:21
666,这么快就借鉴了

借鉴了你那个帖子里面的方法。
回复

使用道具 举报

609

主题

3047

回帖

4894

积分

至尊会员

积分
4894
发表于 2019-6-18 15:19:16 | 显示全部楼层
eric2013 发表于 2019-6-18 13:15
V6板子是M4内核的,可以使用硬件方式的位域操作,仅如下定义即可,编译器会自动转换成硬件的位域操作,是不 ...

这样位于操作,那fmc 是否需要进行单独配置啊 ?
还是这样位于定义后再给一个地址 就可以了 ???
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2019-6-18 15:22:13 | 显示全部楼层
hpdell 发表于 2019-6-18 15:19
这样位于操作,那fmc 是否需要进行单独配置啊 ?
还是这样位于定义后再给一个地址 就可以了 ???

FMC要先配置好,配置好之后就可以这种方式使用了。在MDK的help文档里面可以检索__attribute__((bitband))
的用法
回复

使用道具 举报

609

主题

3047

回帖

4894

积分

至尊会员

积分
4894
发表于 2019-6-18 15:23:40 | 显示全部楼层
eric2013 发表于 2019-6-18 15:22
FMC要先配置好,配置好之后就可以这种方式使用了。在MDK的help文档里面可以检索__attribute__((bitband)) ...

好的
回复

使用道具 举报

1

主题

25

回帖

28

积分

新手上路

积分
28
发表于 2019-7-15 09:45:16 | 显示全部楼层
学习,下去试试先。赞。
回复

使用道具 举报

0

主题

38

回帖

38

积分

新手上路

one is enough

积分
38
发表于 2019-9-26 17:10:34 | 显示全部楼层
1024!mark~~
回复

使用道具 举报

75

主题

684

回帖

909

积分

金牌会员

积分
909
发表于 2020-1-16 22:00:47 | 显示全部楼层
大佬,这样写移植性是不是不是很好,受编译器和硬件的影响,tGPRS_TERM_ON 可能对应0x60001000开始的四个字节的第一位也可能是最后一位。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2020-1-17 00:51:53 | 显示全部楼层
庄永 发表于 2020-1-16 22:00
大佬,这样写移植性是不是不是很好,受编译器和硬件的影响,tGPRS_TERM_ON 可能对应0x60001000开始的四个字 ...

这是位域操作,标准C实现。
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
发表于 2023-4-26 11:05:30 | 显示全部楼层
eric2013 发表于 2019-6-18 13:15
V6板子是M4内核的,可以使用硬件方式的位域操作,仅如下定义即可,编译器会自动转换成硬件的位域操作,是不 ...

这个编译器自动转换成硬件操作的话,必须加上“__attribute__((bitband));” 这个语句吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2023-4-26 17:35:32 | 显示全部楼层
caicaptain2 发表于 2023-4-26 11:05
这个编译器自动转换成硬件操作的话,必须加上“__attribute__((bitband));” 这个语句吗?

对,是这样的。
回复

使用道具 举报

3

主题

13

回帖

22

积分

新手上路

积分
22
发表于 2023-12-9 18:49:13 | 显示全部楼层
M4/M3的硬件位域是原子化操作    M7的中断和主循环操作同一个变量会有问题
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2023-12-10 00:11:51 | 显示全部楼层
面包人 发表于 2023-12-9 18:49
M4/M3的硬件位域是原子化操作    M7的中断和主循环操作同一个变量会有问题

是的,后来专门开了一个帖子说这个问题。

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-29 05:13 , Processed in 0.227165 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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