本帖最后由 lvxinn2006 于 2019-1-11 08:53 编辑
【实验目的】
- 熟悉如何通过原理图分析电路原理;
- 熟悉如何使用MCU的用户参考手册;
- 通过本实验掌握 GPIO 输出功能的使用方法;
- 初步熟悉单片机寄存器的配置方法;
- 用最少的代码点亮LED灯。
【实验环境】
- NUCLEO-G071RB开发板
- Keil MDK-ARM(Keil uVision 5.25.2.0)
- Keil.STM32G0xx_DFP.1.0.0.pack
【实验资料】
- NUCLEO-G071RB开发板原理图
- STM32G071x8/xB Data Sheet
- STM32G071芯片用户参考手册
【实验现象】
【原理图分析】
- 分析原理,LD4阳极接3.3V正电压,阴极连接到N沟道场效应管T2的漏极,场效应管T2的源极连接到电源地;
- 点亮LD4的条件:当场效应管导通时,LD4阴极直接连接到地,产生电流,即可点亮LD4;
- 场效应管栅极通过1M电阻下拉到地,当Vds之间产生电压差时,即可使场效应管导通,即当栅极接高电平(3.3V)时,Vds=-3.3V,即可使场效应管导通,进而点亮LD4。
- 在原理图中可知,场效应管的栅极连接到了PA5引脚,所以只需要使PA5输出高电平,即可点亮LD4。
- 接下来,根据芯片参考手册,对PA5引脚进行配置。
【MCU资源分析与引脚配置】
- 查看《STM32G071芯片用户参考手册》,在“存储器与总线结构”一章中可以看到如下段落:
根据段落的提示,可以知道,如果想使用GPIO功能单元,必须要启用相应的时钟。
在这里可以看到,RCC_IOPENR寄存器,可以控制GPIO功能的时钟,而且能够知道,
GPIOA的时钟,在寄存器的[0]位上,只需要将[0]位置1即可
- 通过查看STM32G071芯片的Data Sheet,可以知道在这一系列的处理器中,有PA、PB、PC、PD、PF共5组GPIO
- 对于尾号R系列64pin的芯片,有多达60个引脚作为GPIO使用
- 在上图中可以看出,每一组GPIO都有很多引脚,64pin的芯片可用的GPIO有PA0…PA15,PB0…PB15,PC0…PC15,PD0…PD9,PF0…1总共60个引脚
- 查询数据手册可以了解到,芯片中每个GPIO分组都对应相同功能的若干寄存器,寄存器具体功能如下表所示:
寄存器分类 | 具体寄存器 | 功能描述 |
配置寄存器 | GPIOx_MODER | 设置输入/输出模式 |
GPIOx_OTYPER | 设置输出类型(推挽、开漏) |
GPIOx_OSPEEDR | 设置输出速度 |
GPIOx_PUPDR | 设置内部上下拉电阻 |
数据寄存器 | GPIOx_IDR | 输入数据 |
GPIOx_ODR | 输出数据 |
置位复位寄存器 | GPIOx_BSRR | 设置、清除数据 |
锁定寄存器 | GPIOx_LCKR | 锁定引脚数据状态 |
复用功能选择寄存器 | GPIOx_AFRH | 复用功能高位数据 |
GPIOx_AFRL | 复用功能低位数据 |
每个寄存器都有各自的功能,寄存器具体定义请参考《STM32G071芯片用户参考手册》关于GPIO的章节。
- 本实验原理比较简单,只用到了MODER和ODR两个寄存器,所以我们只研究这两个寄存器的使用
- 先看一下GPIOx_MODER:
MODER寄存器主要用来设置一个GPIO组中每个IO引脚的功能,寄存器中每2个数据位决定了1个引脚的功能,比如:[1:0]位控制了PA0引脚的功能,[3:2]位控制了PA1引脚的功能……
根据实验的需求,我们想用PA5输出高电平控制LD4,所以我们需要设置PA5对应的位置,也就是[11:10]两位。
在说明中,能看到,两个二进制的不同组合,可以决定引脚的功能,00表示输入模式,01表示输出模式,10表示复用功能模式,11是模拟模式。
因为我们想用PA5往外输出电平信号控制电路,所以我们需要把PA5设置成输出模式,也就是要把[11:10]两位设置成01即可。
当GPIO引脚被设置成输出模式时,ODR寄存器相应数据位上的值,会决定引脚输出的电平,1为高电平,0为低电平。
根据实验需求,需要让PA5输出高电平,所以需要把GPIOA_ODR寄存器中的[5]位设置为1即可。
【分析总结】把上述所有重点整理成思维导图如下:
接下来要做的,就是把这些细节,用程序代码表示出来。
【实验代码】
新建main.c文件
- #include "stm32g0xx.h" // Device header
- int main(void)
- {
- //使能GPIOA的时钟
- RCC->IOPENR |= (1<<0);
- //设置PA5为输出模式
- GPIOA->MODER &= ~(0x3<<10); //[11:10]清0
- GPIOA->MODER |= (1<<10); //[11:10]=01 设置PA5为输出模式
-
- //点亮LD4
- GPIOA->ODR |= (1<<5); //[5]=1 PA5输出高电平
- }
复制代码
此内容由EEWORLD论坛网友lvxinn2006原创,如需转载或用于商业用途需征得作者同意并注明出处