stm32 位绑定 优化设计

本文介绍了如何使用STM32的位带技术进行GPIO操作的优化设计,通过定义宏实现对GPIO寄存器的直接访问,简化了读写过程。在主函数中,展示了如何利用位带技术响应输入状态并控制输出,实现了输入输出的快速切换。
摘要由CSDN通过智能技术生成
#include "stm32f10x.h"


#define GPIOA_ODR_A GPIOA_BASE+0X0C
#define GPIOA_IDR_A GPIOA_BASE+0X08

#define GPIOB_ODR_B GPIOB_BASE+0X0C
#define GPIOB_IDR_B GPIOB_BASE+0X08

#define GPIOC_ODR_C GPIOC_BASE+0X0C
#define GPIOC_IDR_C GPIOC_BASE+0X08

#define GPIOD_ODR_D GPIOD_BASE+0X0C
#define GPIOD_IDR_D GPIOD_BASE+0X08

#define GPIOE_ODR_E GPIOE_BASE+0X0C
#define GPIOE_IDR_E GPIOE_BASE+0X08

#define BitBand(Addr,BitNum)  *((volatile unsigned long *)((Addr &0xf0000000)+ 0X2000000 + ((Addr&0Xfffff)<<5)+(BitNum<<2)))
// AliasAddr = 0x2200 0000 + ((A-0X2000 0000)*8+n)*4      (n= 0~7)
//           = 0x2200 0000+ (A-0X2000 0000)*32+n*4      4个字节,32个位;


#define PAout(n) BitBand(GPIOA_ODR_A,n)  //PAout输出表达式;
#define PAin(n)  BitBand(GPIOA_IDR_A,n)  //PAin输出表达式;


int main(void)
{
	
//	 u32 *PAO3 = (u32 *)(0x42000000 + (0x4001080C-0X40000000)*32+3*4); //0x4001 080C  ODR的地址;
//	 u32 *PAI3 = (u32 *)(0x42000000 + (0x40010809-0X40000000)*32+3*4); //0x4001 080C  ODR的地址;	

//	 u32 *PAI3 = (u32 *)(0x42000000 + (0x40010808-0X40000000)*32+11*4); //0x4001 080C  ODR的地址;	
	
	
	//1.PA.0-PA.7推揽式输出,50MHZ;PA.8-PA.15 浮空输入,
	
	 GPIOA->CRL=0X33333333;
   GPIOA->CRH=0X44444444;
	
	//2.输入状态反应到对应引脚的输出;
			while(1){	
		if((PAin(12)==1))  PAout(4)=1;    //GPIOA->BSRR=0x01;
 		else              PAout(4)=0;
			if((PAin(13)==1))  PAout(5)=1;    //GPIOA->BSRR=0x01;
 		else              PAout(5)=0;		

			if((PAin(14)==1))  PAout(6)=1;    //GPIOA->BSRR=0x01;
 		else              PAout(6)=0;		
			if((PAin(15)==1))  PAout(7)=1;    //GPIOA->BSRR=0x01;
 		else              PAout(7)=0;		
		
return 0;
}
}
//位绑定区域:
//SRAM:      0X2000 0000 ~ 0X200F FFFF 1M   A的范围

// AliasAddr = 0x2200 0000 + ((A-0X2000 0000)*8+n)*4      (n= 0~7)
//           = 0x2200 0000+ (A-0X2000 0000)*32+n*4      4个字节,32个位;

//片上外设    0X4000 0000 ~ 0X400F FFFF 1M   A的范围

// AliasAddr = 0X4200 0000 + ((A-0X4000 0000)*8+n)*4
//           = 0x4200 0000 + (A-0X4000 0000)*32+n*4      4个字节,32个位;


 

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值