GPIO相关寄存器:
- 端口配置低寄存器(CRL),端口配置高寄存器(CRH):控制每个I / O口的模式及输出速率
- 端口输入数据寄存器(IDR):只读,只能以16位形式读出,用来查看某个位的状态
- 端口输出数据寄存器(ODR):可读/写,读 - 判断当前I / O口输出状态,写 - 控制某个I / O口输出电平
- 外设时钟使能寄存器(RCC_xxxENR):任何时候配置STM32外设时都要先使能该外设的时钟
使用地址操作控制GPIO(以LED为例):
- 查看存储器映像:GPIOB位于APB2总线,起始地址0x4001 0C00,RCC位于AHB总线,起始地址0x40021000
//使能RCC_APB2ENR
*(unsigned int *)0x40021018 | =((1)<<(3));
//配置CRL
//清零
*(unsigned int *)0x40010C00&=〜(1 <<(4 * 0));
//赋值
*(unsigned int *)0x40010C00 | =(1 <<(4 * 0));
//配置ODR
*(unsigned int *)0x40010C0C&=〜(1 << 0);
使用寄存器操作控制GPIO:
//使能RCC_APB2ENR
RCC-> APB2ENR | =((1)<<(3));
//配置CRL
//清零
GPIOB-> CRL&=〜(1 <<(4 * 0));
//赋值
GPIOB-> CRL | =(1 <<(4 * 0));
//配置ODR
GPIOB-> ODR&=〜(1 << 0);
使用库函数控制GPIO:
库函数及结构体定义在stm32f10x_gpio.h文件中
//定义GPIO_InitTypeDef类型的结构体指针
GPIO_InitTypeDef GPIO_LED_InitStruct;
//配置RCC_APB2ENR
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
//配置CRL
GPIO_LED_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_LED_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_LED_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOB,&GPIO_LED_InitStruct);
//配置ODR
GPIO_ResetBits(GPIOB,GPIO_Pin_0); / *重置函数* /
GPIO_SetBits(GPIO_LED_PORT,GPIO_LED_PIN); / *置位函数* /
使用位带操作控制GPIO:
公式:((addr&0xF0000000)+ 0x02000000 +((addr&0x00FFFFFF)<< 5)+(bitnum << 2))
地址:要操作的位所在的寄存器的地址
BITNUM:位号,即在该寄存器的第几位
//定义带参宏
#define PortIO(bitnum)*(unsigned int *)((addr&0xF0000000)+ 0x02000000 +((addr&0x00FFFFFF)<< 5)+(bitnum << 2))