1 寄存器问题
首先要了解什么是寄存器?寄存器是中央处理器CPU内用来暂存指令、数据和地址的存储器,在所有应用单片机来进行各种控制操作时,都是通过设置单片机的内部寄存器来操作单片机的,其思想就是根据每块内存单元所具有功能的不同,给这些地址取一个别名,这个过程也叫作寄存器地址映射。在后面的发展过程中,为了减少直接操作寄存器,又增添了库文件操作,以及后来的CubeMX中设置各种寄存器信息,但寄存器操作是单片机内部基础操作的方式,因此寄存器的操作是很有必要了解一下的。
图1.1 存储结构图
1.1 单片机中的寄存器
单片机中有众多寄存器,在实际单片机操作中应熟练掌握的寄存器有程序状态寄存器PSW,定时器方式控制寄存器TMOD,电源控制寄存器PCON,定时器控制寄存器TCOD,中断允许寄存器IE,中断优先级寄存器IP,以及串行口控制寄存器SCON。
1.2 寄存器配置的常用方式
(1) 先将待设置位清0,再设置相应的值(常用)。
(2) 先将寄存器的值读出来,修改完成后,再写进寄存器。
1.3 寄存器地址
寄存器地址:保存当前CPU所访问的内存单元的地址。
基地址:Stm32的每个模块都包含多个寄存器,这些寄存器地址通常是连续的,而第一个寄存器的地址(地址值最低的地址)就是基地址。
偏移地址:寄存器在本模块中的地址偏移量。
绝对地址:绝对地址是寄存器的实际地址,它等于基地址+偏移地址。
图1.2 GPIO寄存器地址
在寄存器设置中首先会用到结构体,将操作GPIO的7个寄存器封装进一个结构体中,利用结构体的特性,结构体向内存申请连续存储空间,结构体中的32位变量正好就占据4字节,如是16位的就占据2字节。
2 GPIO端口设置
GPIO:G:通用 P:端口即通用I/O(输入/输出)端口,是Stm32可控制的引脚。Stm32芯片的GPIO引脚与外部设备连接起来,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。
图2.1 寄存器与GPIO口的关系图
2.1 GPIO端口位基本结构
GPIO的内部电路主要由一对保护二极管、受开关控制的上下拉电阻、TTL施密特触发器 、两个MOS管、输入输出数据寄存器、复位/置位寄存器、及一些读写控制逻辑电路等组成。注:施密特触发器具有电压滞后的特性,利用它对脉冲波形进行整形,使波形的上升沿或下降沿变得陡直。
图2.2 GPIO基本电路图
2.2 GPIO端口位的工作模式
2.2.1 输入模式
输入模式IO引脚用于读取外部状态,如判断外部按键的状态,接收外部各种传感器的信号等。
(1)GPIO_Mode_IN_FLOATING 浮空输入(即不连接内部上下拉电阻)
(2)GPIO_Mode_IPU 上拉输入
(3)GPIO_Mode_IPD 下拉输入
(4)GPIO_Mode_AIN 模拟输入
图2.3 输入模式电路图
2.2.2 输出模式
输出模式IO引脚用于控制外部电路工作,如外部的LED的闪烁,LCD1602的显示等。
(5)GPIO_Mode_Out_OD 开漏输出(带上拉或者下拉)
(6)GPIO_Mode_AF_OD 复用开漏输出(带上拉或者下拉)
(7)GPIO_Mode_Out_PP 推挽输出(带上拉或者下拉)
(8)GPIO_Mode_AF_PP 复用推挽输出(带上拉或者下拉)
图2.4 输出模式电路图
2.2.3 复用模式
复用模式IO引脚用于如定时器的PWM信号的输入输出引脚及串口的输入输出引脚等。
图2.5 复用模式电路图
2.2.4 AD/DA模拟信号输入输出模式
模拟信号输出输出模式IO引脚应用于输入模拟信号便于进行模数转换的电路。
图2.6 高阻抗模拟输入模式
3 GPIO端口工作模式设置
3.1 端口配置数据设置
IO引脚的工作模式的设置通过模式选择寄存器GPIOx_MODER来完成,GPIO中的每一个引脚的功能都由两个位控制,CNF0[1:0]与MODE0[1:0]配置序号为0的引脚,后面的引脚依次类推,一组IO口有16个引脚,故需要64bit来配置一组端口,在Stm32中利用两个32位寄存器高位CRH与低位CRL寄存器控制GPIO。其中每一个IO口都是由7个寄存器来控制(CRH、CRL、IDR、ODR、BRR、BSRR、LCKR)[1]。
图3.1GPIO寄存器简介
图3.2 GPIO端口配置低位寄存器表
通过软件来设置相应的端口时,就需要参考GPIO配置寄存器表,如在输入模式(MODE[1:0]=00), 输出模式(MODE[1:0]>00),输入输出确定后在CNF[1:0]中确定输出输入的模式(8种)。
图3.3 输入输出配置图
例://使能PORTA时钟 RCC- >APB2ENR|=1< < 2; //将GPIOA的PA13位清零 GPIOA- >CRH&=0XFF0FFFFF; //首先PA13位为8(二进制1000)MODE位为00,因此是输入,//CNF位为10,即为上拉/下拉输入 GPIOA- >CRH|=0X00800000; //PA13设置成上拉/下拉输入 //PA13输出为高 GPIOA- >ODR|=1< < 13;
3.2 输入输出端口设置
控制GPIO的寄存器已经在3.1介绍过了,现主要介绍一下输入输出的端口寄存器。
(1)端口输入寄存器IDR
图3.4 寄存器IDR配置表
(2)端口输出寄存器ODR
图3.5 寄存器IDR配置表
4 推挽电路与开漏电路
4.1 推挽电路
推挽电路由输入部分、输出部分、NPN型三极管及PNP型三极管组成,通过输入电压的正负来控制电路中的三极管来达到推挽的效果[2]。
图4.1 推挽电路原理图
4.1.1 推电路
当Vin端电压为V+时,上面的N型三极管Q3导通,下面的P型三极管阻塞,电流通过Q3给负载供电,这样的电路就叫推push电路。
图4.2 推电路原理图
4.1.2 挽电路
挽电路同理,即当Vin端电压为V-时,P型三极管Q4导通,电流通过负载从下往上流去,这就叫挽pull。
图4.3 挽电路原理图
推挽电路的优缺点:由于电路在工作时,两个对称开关三极管每次只有一个导通,所以导通时的损耗较小,且效率高。输出即可以向负载灌电流,也可从负载抽取电流,推拉式输出级即提高电路的负载能力,又提高开关速度。
4.2 开漏电路
场效应管是电压控制型元器件,当对场效应管的栅极施加电压时,漏极与源极会导通。结型场效应管有一个特性就是它的输入阻抗非常大,这意味着:没有电流从控制电路流出,也没有电流进入控制电路。没有电流流入或流出,就不会烧坏控制电路。
图4.4 N型场效应管
开漏电路(Open-Drain)就是将图4.5中的三极管换为场效应管,利用栅极的输入来达到控制LED灯的亮灭,即当栅极有电流时,Q5导通及电流不会流入LED灯,所以LED灯灭,当栅极无电流时,Q5断开,LED灯亮。
图4.5 开漏电路原理图
开漏电路可以利用外部电路的驱动能力,减少cpu内部的驱动,且开漏输出提供了灵活的输出方式,但当上升沿通过外接上拉无源电阻对负载充电,即当电阻选择小时延时小,但功耗大,反之亦然。
5 GPIO端口输出功能配置步骤及涉及的寄存器
在Stm32单片机由内核和各种电路模块组成,如通用模块中的GPIO模块、串行外设接口SPI、同步/异步串口接口、定时器等电路模块,Stm32单片机通过对各种外设的寄存器进行操作达到操作外设的目的。
5.1 GPIO的配置流程
使能端口时钟,使用前先使能对应模块的时钟;
配置端口位的工作模式寄存器;
配置电路驱动类型寄存器,如推挽还是开漏;
配置引脚响应速度寄存器;
配置上下拉电阻设置寄存器;
配置输出数据寄存器;
void LED_init9(void)
{
//我的stm32板中的两个LED灯在GPIO的A和D组中,在USART1中.
//首先先使能端口APB2,USART1挂载在APB2通道上
RCC- >APB2ENR|=1< < 2; //使能PORTA时钟
RCC- >APB2ENR|=1< < 5; //使能PORTD时钟
//设置GPIOA的8号引脚,8号引脚属于高位因此对CRH寄存器进行操作
//再设置ODR寄存器,对端口的输出电压高低进行设置
GPIOA- >CRH&=0XFFFFFFF0; //清除bit位
GPIOA- >CRH|=0X00000003;//PA8 推挽输出 最大输出速度
GPIOA- >ODR|=1< < 8; //PA8 输出高,即将端口的输出电平设置高电平
//与GPIOA同理
GPIOD- >CRL&=0XFFFFF0FF;
GPIOD- >CRL|=0X00000300;//PD.2推挽输出
GPIOD- >ODR|=1< < 2; //PD.2输出高
}