RCC->APB2ENR|=1<<2; //使能PORTA时钟
RCC->APB2ENR|=1<<5; //使能PORTD时钟
GPIOA->CRH&=0XFFFFFFF0;
GPIOA->CRH|=0X00000003;//PA8 推挽输出
GPIOA->ODR|=1<<8; //PA8 输出
GPIOD->CRL&=0XFFFFF0FF;
GPIOD->CRL|=0X00000300;//PD.2推挽输出
GPIOD->ODR|=1<<2; //PD.2输出高
由上可以看出,对于GPIO操作,主要有以下几个步骤:
a、使能相应的GPIO时钟。
b、配置IO的功能,即配置CRH和CRL。
c、然后就是对GPIO初始化,操作。操作方式见如下两种
对整个GPIO口操作,需要用GPIOx_ODR寄存器,这个寄存器只能按16位操作。如果需要对某个位操作。则用到 IO 位段映射。下面简述两种方法
a、对GPIOx_ODR操作:
//PB0~7,作为数据线
#define DATAOUT(x ) GPIOB->ODR=(GPIOB->ODR&0xff00)|(x&0x00FF); //输出 这样子操作不影响ODR的高8位。
b、位段映射方法:将IO口每一位映射到ram空间中去。
#define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //输出
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))