#STM32 2.寄存器位操作方法及GPIO点亮一颗LED

本文档是STM32开发系列的一部分,介绍了从C51到ARM GPIO控制的过渡。内容包括理解启动文件的作用,配置GPIO端口的步骤,如RCC时钟设置、模式配置和位操作,并通过代码实例验证了GPIO的使用。文中详细解释了STM32的寄存器操作和库函数的使用,为ARM开发初学者提供了清晰的指引。
摘要由CSDN通过智能技术生成

系列文章目录-认识ARM开发

/ARM开发初学目录:/

第3章:#STM32 3.根据官方库新建ARM工程

第2章:#STM32 2.寄存器位操作方法及GPIO点亮一颗LED

第1章:#STM32 1.从C51驱动一颗LED到认识ARM_GPIO(最浅显入门)

Lip: &= ~ 清0 ; |= 赋值


一.场景

上手一个ARM工程,结合“寄存器思想”,初步了解GPIO设定,“51”与“ARM”牵线搭桥

二.工程文件结构简介

在这里插入图片描述

1. 启动文件.s

芯片上电后会先执行“.s启动文件”,创建好c语言环境,随后才会进入所写代码区
官网提供的库:startup_stm32f10x_hd.s
Ctrl+F 找到复位后的执行语句:

; Reset handler				
Reset_Handler   PROC		
                EXPORT  Reset_Handler             [WEAK]  	
                IMPORT  __main
                IMPORT  SystemInit
                LDR     R0, =SystemInit
                BLX     R0               
                LDR     R0, =__main
                BX      R0
                ENDP

简单了解:
Sec.1. ;相当于C语言的注释//
Sec.2. PROC伪指令,相当于定义一个函数,函数名叫Reset_Handler
Sec.3. EXPOT 表明函数可供其它模块调用,声明函数
Sec.4. IMPORT 表明函数SystemInit和_main在其它文件,需要编译器链接时自己去找
Sec.5. LDR跳转 BLX加载命令
Sec.6. BX R0说明执行完_main库函数后,进入工程文件下C语言环境的main()

说明,芯片上电后会先执行启动文件,而且会执行SystemInit()函数,这个函数在我么工程文件下,也就是官方库,如果没有就会报错。所以自己创建工程时,在main()下定义一个SystemInit(),主要是创建系统时钟、总线时钟等等

void SystemInit()	//未写会报错,创建于main()函数下
{
}

2. 库函数.h文件

上一章介绍的寄存器封装,已经由芯片厂家封装好了

#define GPIOB		(GPIO_InitTypeDef *) GPIOB_BASE

3.main.c

存放主函数main()、以及SystemInit()函数

三.GPIO端口配置方法

3.1 RCC时钟配置

STM32所有外设都有对应的时钟(降低功耗目的),芯片上电后时钟默认是关闭的,需要人为配置打开。根据官网手册芯片系统框图,可以发现外设GPIO挂载于总线APB2,由RCC控制时钟
在这里插入图片描述
在这里插入图片描述

//打开GPIOB 控制时钟
RCC -> APB2ENR |= (1 << 3);	//该寄存器已在库函数中定义
3.2 端口模式配置

CRL配置GPIOx 低8位PIN0~P7模式设定:输入/输出
CRH配置GPIOx 高8位PIN8~P15
在这里插入图片描述

//配置PB7输出模式,推挽输出
GPIO_InitTypeDef GPIOB;
GPIOB.CRL &= ~(0x0F << (4 * 7));	//清CNF7 MODE7
GPIOB.CRL |= (1 << (4 * 7));		//通用推挽输出模式、最大速度10MHz
3.3 端口位设置/清除寄存器

在这里插入图片描述

//PB7输出0
GPIO.BSRR |= (1 << 16 + 7);

//PB7输出1
GPIO.BSRR |= (1 << 7);

根据官方手册可以看出,最终作用的寄存器是ODR,ODR 1输出高,ODR 0输出低
那么简化点直接操作寄存器ODR也是可以的

//PB7输出0
GPIO.ODR &= ~(1 << 7);

//PB7输出1
GPIO.ODR |= (1 << 7);

在这里插入图片描述

四.代码验证

实测demo板 LED1亮,实验中未配置时钟源,默认是内部时钟

void main()
{
	//1. 打开GPIOB 控制时钟
	RCC -> APB2ENR |= (1 << 3);	//该寄存器已在库函数中定义
	//2.配置PB7输出模式,推挽输出
	GPIO_InitTypeDef GPIOB;
	GPIOB.CRL &= ~(0x0F << (4 * 7));	//清CNF7 MODE7
	GPIOB.CRL |= (1 << (4 * 7));		//通用推挽输出模式、最大速度10MHz
	//3.PB7输出1
	GPIO.ODR |= (1 << 7);
	while(1);
}

总结

  1. 根据芯片系统框图可以发现,要想控制GPIO,优先打开RCC对应的时钟,随后进行相应寄存器配置:CRL /CRH 、BSRR/ODR
  2. 按bit清0 : &= ~(1 << bitx);
  3. 连续bit清0: &= ~(3 << 2 * sec); //0x11
  4. bit置1 : |= (1 << bitx);
  5. 连续bit置1: |= (3 << 2 * sec);
  6. bit取反: ^= (1 << bitx); //异或操作
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值