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))




  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值