打印

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

[复制链接]
210|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
スモモ|  楼主 | 2018-7-10 20:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
实现以下位域结构体,可以在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之间无缝移植。
由于仓促敲的,如有错误或有不足之处,请多多指教。

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

458

主题

484

帖子

1

粉丝