#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个位;
stm32 位绑定 优化设计
最新推荐文章于 2023-11-02 10:19:45 发布
本文介绍了如何使用STM32的位带技术进行GPIO操作的优化设计,通过定义宏实现对GPIO寄存器的直接访问,简化了读写过程。在主函数中,展示了如何利用位带技术响应输入状态并控制输出,实现了输入输出的快速切换。
摘要由CSDN通过智能技术生成