stm32f103 学习笔记 —— 01 使用地址、寄存器、库函数、位带操作控制GPIO

GPIO相关寄存器:

  • 端口配置低寄存器(CRL),端口配置高寄存器(CRH):控制每个I / O口的模式及输出速率
  • 端口输入数据寄存器(ID​​R):只读,只能以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))




你可能感兴趣的:(stm32)