位带 GPIO 先看源码
这个是bitbant.h文件
***************************************************************
#ifndef __BITBAND_H_
#define __BITBAND_H_
#include "stm32f4xx.h"
//找出别名区
//addr --地址(寄存器)
//bit --位(要操作的寄存器的位)
#define BITBAND(addr,bit) (((addr & 0xF0000000) +0x2000000) + ((addr & 0xFFFFF)*8+bit)*4)
//别名区基地址 + 偏移量
//操作别名区
#define MEM_ADDR(addr,bit) *(volatile unsigned int *)BITBAND(addr,bit)
//PA6 --1
//PAOut(6) =1;
//ODR
#define PAOut(bit) MEM_ADDR((unsigned int)&GPIOA->ODR,bit)
#define PBOut(bit) MEM_ADDR((unsigned int)&GPIOB->ODR,bit)
#define PCOut(bit) MEM_ADDR((unsigned int)&GPIOC->ODR,bit)
#define PDOut(bit) MEM_ADDR((unsigned int)&GPIOD->ODR,bit)
#define PEOut(bit) MEM_ADDR((unsigned int)&GPIOE->ODR,bit)
#define PFOut(bit) MEM_ADDR((unsigned int)&GPIOF->ODR,bit)
#define PGOut(bit) MEM_ADDR((unsigned int)&GPIOG->ODR,bit)
#define PHOut(bit) MEM_ADDR((unsigned int)&GPIOH->ODR,bit)
//IDR
#define PAIn(bit) MEM_ADDR((unsigned int)&GPIOA->IDR,bit)
#define PBIn(bit) MEM_ADDR((unsigned int)&GPIOB->IDR,bit)
#define PCIn(bit) MEM_ADDR((unsigned int)&GPIOC->IDR,bit)
#define PDIn(bit) MEM_ADDR((unsigned int)&GPIOD->IDR,bit)
#define PEIn(bit) MEM_ADDR((unsigned int)&GPIOE->IDR,bit)
#define PFIn(bit) MEM_ADDR((unsigned int)&GPIOF->IDR,bit)
#define PGIn(bit) MEM_ADDR((unsigned int)&GPIOG->IDR,bit)
#define PHIn(bit) MEM_ADDR((unsigned int)&GPIOH->IDR,bit)
#endif
*********************************************************************************
先设置基地址 再加上各寄存器偏移地址
可以值直接复制使用 寄存器分输入和输出
举例 :
配置输入模式的:
PAOut(5)= 1;//GPIO A组的第5个端口置位(高电平)
PEOut(7)= 0;//GPIO E组的第7个端口复位(低电平)
配置输入模式的:
PAIn(5)= 1;//GPIO 检测A组的第5个端口置位还是复位
PEiN(7)= 0;//GPIO E组的第7个端口置位还是复位