OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4193|回复: 6

STM32F7类似于F1的位带操作,实现向51单片机操作IO的方式,位域操作,读改写机制

[复制链接]

32

主题

883

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4031
金钱
4031
注册时间
2015-11-14
在线时间
545 小时
发表于 2019-4-25 00:43:06 | 显示全部楼层 |阅读模式
本帖最后由 Electronic 于 2019-4-25 01:10 编辑

实现以下位域结构体,可以在sys.h头文件下

[mw_shl_code=c,true]typedef struct
{
        uint32_t BIT0  : 1;
        uint32_t BIT1  : 1;
        uint32_t BIT2  : 1;
        uint32_t BIT3  : 1;
        uint32_t BIT4  : 1;
        uint32_t BIT5  : 1;
        uint32_t BIT6  : 1;
        uint32_t BIT7  : 1;
        uint32_t BIT8  : 1;
        uint32_t BIT9  : 1;
        uint32_t BIT10 : 1;
        uint32_t BIT11 : 1;
        uint32_t BIT12 : 1;
        uint32_t BIT13 : 1;
        uint32_t BIT14 : 1;
        uint32_t BIT15 : 1;
        uint32_t BIT16 : 1;
        uint32_t BIT17 : 1;
        uint32_t BIT18 : 1;
        uint32_t BIT19 : 1;
        uint32_t BIT20 : 1;
        uint32_t BIT21 : 1;
        uint32_t BIT22 : 1;
        uint32_t BIT23 : 1;
        uint32_t BIT24 : 1;
        uint32_t BIT25 : 1;
        uint32_t BIT26 : 1;
        uint32_t BIT27 : 1;
        uint32_t BIT28 : 1;
        uint32_t BIT29 : 1;
        uint32_t BIT30 : 1;
        uint32_t BIT31 : 1;
}Bit_Type;


//输出寄存器
#define PAout(pin)         (*(Bit_Type *)&GPIOA->ODR).BIT ## pin
#define PBout(pin)         (*(Bit_Type *)&GPIOB->ODR).BIT ## pin
#define PCout(pin)         (*(Bit_Type *)&GPIOC->ODR).BIT ## pin
#define PDout(pin)         (*(Bit_Type *)&GPIOD->ODR).BIT ## pin
#define PEout(pin)         (*(Bit_Type *)&GPIOE->ODR).BIT ## pin
#define PFout(pin)         (*(Bit_Type *)&GPIOF->ODR).BIT ## pin
#define PGout(pin)         (*(Bit_Type *)&GPIOG->ODR).BIT ## pin
#define PHout(pin)         (*(Bit_Type *)&GPIOH->ODR).BIT ## pin
#define PIout(pin)         (*(Bit_Type *)&GPIOI->ODR).BIT ## pin
#define PJout(pin)         (*(Bit_Type *)&GPIOJ->ODR).BIT ## pin
#define PKout(pin)         (*(Bit_Type *)&GPIOK->ODR).BIT ## pin

//输入寄存器
#define PAin(pin)         (*(Bit_Type *)&GPIOA->IDR).BIT ## pin
#define PBin(pin)         (*(Bit_Type *)&GPIOB->IDR).BIT ## pin
#define PCin(pin)         (*(Bit_Type *)&GPIOC->IDR).BIT ## pin
#define PDin(pin)         (*(Bit_Type *)&GPIOD->IDR).BIT ## pin
#define PEin(pin)         (*(Bit_Type *)&GPIOE->IDR).BIT ## pin
#define PFin(pin)         (*(Bit_Type *)&GPIOF->IDR).BIT ## pin
#define PGin(pin)         (*(Bit_Type *)&GPIOG->IDR).BIT ## pin
#define PHin(pin)         (*(Bit_Type *)&GPIOH->IDR).BIT ## pin
#define PIin(pin)         (*(Bit_Type *)&GPIOI->IDR).BIT ## pin
#define PJin(pin)         (*(Bit_Type *)&GPIOJ->IDR).BIT ## pin
#define PKin(pin)         (*(Bit_Type *)&GPIOK->IDR).BIT ## pin
[/mw_shl_code]
使用的开发板是F767,LED分别连接在PB0和PB1,以下宏定义和F429应该是一样的
[mw_shl_code=c,true]#define LED0        PBout(1)
#define LED1        PBout(0)[/mw_shl_code]

主函数写跑马灯代码
[mw_shl_code=c,true]
                LED0 = 0;
                HAL_Delay(300);
               
                LED0 = 1;
                HAL_Delay(300);
               
                LED1 = 0;
                HAL_Delay(300);
               
                LED1 = 1;
                HAL_Delay(300);[/mw_shl_code]

因为是宏定义,有一个缺陷,不能实现如下:
[mw_shl_code=c,true]
                n = 0;
                PBout(n) = 0;
                n = 1;
                PBout(n) = 0;[/mw_shl_code]

这样的位操作,性对于上层完全和F429一样,只是实现的原理是读改写(效率相对于未带效率略低一点,不过对于F7这不算什么),不知道当初原子哥为啥不用这样的方式使F7和F4操作IO的代码兼容,使之F4和F7之间无缝移植。
由于仓促敲的,如有错误或有不足之处,请多多指教







正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

32

主题

883

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4031
金钱
4031
注册时间
2015-11-14
在线时间
545 小时
 楼主| 发表于 2019-4-26 08:07:16 | 显示全部楼层
回复 支持 1 反对 0

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2020-8-3 22:25:44 | 显示全部楼层
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2020-5-10
在线时间
14 小时
发表于 2020-11-13 11:22:29 | 显示全部楼层
你这个问题在V6编译器就报错了,因为编译器比较严格,感谢大佬的思路,现在附上我的完美解决方案,定义一个MYBIT宏去连接字符串,告诉编译器,老子就要这么干就行啦:
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2020-5-10
在线时间
14 小时
发表于 2020-11-13 11:22:51 | 显示全部楼层
//山寨版位带操作
//会有叉叉提醒
//关掉这个功能:Dynamic Syntax Checking。
//具体做法是 Edit - Configurations - Text Completion - Dynamic Syntax Checking,把enable去掉就可以了。
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
typedef struct _16_Bits_Struct
{
     u16 bit0  : 1;
     u16 bit1  : 1;
     u16 bit2  : 1;
     u16 bit3  : 1;
     u16 bit4  : 1;
     u16 bit5  : 1;
     u16 bit6  : 1;
     u16 bit7  : 1;
     u16 bit8  : 1;
     u16 bit9  : 1;
     u16 bit10 : 1;
     u16 bit11 : 1;
     u16 bit12 : 1;
     u16 bit13 : 1;
     u16 bit14 : 1;
     u16 bit15 : 1;
} Bits_16_TypeDef;
//用n替换"0x##n##L"中的"n"
#define MYBIT(n) bit##n

#define PAout(n)   (((Bits_16_TypeDef *)(&(GPIOA->ODR)))->MYBIT(n))  //输出
#define PAin(n)    (((Bits_16_TypeDef *)(&(GPIOA->IDR)))->MYBIT(n))  //输入
#define PBout(n)   (((Bits_16_TypeDef *)(&(GPIOB->ODR)))->MYBIT(n))  //输出
#define PBin(n)    (((Bits_16_TypeDef *)(&(GPIOB->IDR)))->MYBIT(n))  //输入
#define PCout(n)   (((Bits_16_TypeDef *)(&(GPIOC->ODR)))->MYBIT(n))  //输出
#define PCin(n)    (((Bits_16_TypeDef *)(&(GPIOC->IDR)))->MYBIT(n))  //输入
#define PDout(n)   (((Bits_16_TypeDef *)(&(GPIOD->ODR)))->MYBIT(n))  //输出
#define PDin(n)    (((Bits_16_TypeDef *)(&(GPIOD->IDR)))->MYBIT(n))  //输入
#define PEout(n)   (((Bits_16_TypeDef *)(&(GPIOE->ODR)))->MYBIT(n))  //输出
#define PEin(n)    (((Bits_16_TypeDef *)(&(GPIOE->IDR)))->MYBIT(n))  //输入
#define PFout(n)   (((Bits_16_TypeDef *)(&(GPIOF->ODR)))->MYBIT(n))  //输出
#define PFin(n)    (((Bits_16_TypeDef *)(&(GPIOF->IDR)))->MYBIT(n))  //输入
#define PGout(n)   (((Bits_16_TypeDef *)(&(GPIOG->ODR)))->MYBIT(n))  //输出
#define PGin(n)    (((Bits_16_TypeDef *)(&(GPIOG->IDR)))->MYBIT(n))  //输入
回复 支持 反对

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2020-11-15 20:58:39 | 显示全部楼层
用Bit Band除了效率(其实效率也没增加多少), 最主要还是安全性的原因。
安全性的问题, 不是这样移植能解决的
回复 支持 反对

使用道具 举报

32

主题

883

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4031
金钱
4031
注册时间
2015-11-14
在线时间
545 小时
 楼主| 发表于 2020-11-22 16:42:06 | 显示全部楼层
edmund1234 发表于 2020-11-15 20:58
用Bit Band除了效率(其实效率也没增加多少), 最主要还是安全性的原因。
安全性的问题, 不是这样移植能 ...

按实际情况综合考虑吧
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-4-30 06:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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