STM32ZET6—寄存器编程(自写固件库)

说明

        我们在使用stm32单片机进行程序编程的时候,我们一般会直接调用类似 "stm32f10x.h",之类的头文件,直接调用里面写好的库函数进行编程。那么类似"stm32f10x.h"的头文件里面的底层逻辑是什么呢?

        下面用一个简单的例程,使用GPIO点亮LED小灯的实验来学习一下。

        本文要结合stm32的参考手册和数据手册

GPIO介绍

        GPIO(General Purpose Input Output)是通用输入输出端口的简称,简单来说就是STM32可控制的引脚,STM32芯片的GPIO引 脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。STM32芯片的GPIO 被分成很多组,每组有16个引脚,如型号为STM32F103ZET6型号的芯片有GPIOA、GPIOB、 GPIOC至GPIOG共7组GPIO,芯片一共144个引脚,其中GPIO就占了一大部分,所有的GPIO 引脚都有基本的输入输出功能。

原理

        I/O端口位的基本结构,下面来介绍每一部分的功能,如图 分为7个部分

       

第一部分:保护二极管及上,下拉电阻

        两个保护二极管可以防止引脚过高或者过的的电压输入,当外部输入引脚的电压高于VDD时,上面保护二极管导通,电流流入VDD。外部输入引脚的电压低于Vss时,下面保护二极管导通,电流流入Vss。这样就可以防止不正常的电压通过引脚流入芯片,起到了保护芯片的作用。

        尽管有这种保护电路,并不意味着引脚可以直接外接大功率器件,如直接驱动电机,会出现要么电机不转,要么芯片烧坏。因此,必须要加驱动电路及隔离电路。

第二部分:P-MOS,N-MOS

        两个MOS管(MOS管和三级管类似原理,可以看做三极管分析)组成的单元电路,可以实现推挽输出,开漏输出两种模式。

推挽输出:

        如上图,我们把INT配置为1,经过非门(逻辑电路的符号,不懂的可以查一下逻辑电路符号)就会1变为非1,非1就是0,所以,G=0,由于上面PMOS管的导通条件(旁边注释),VDD->OUT导通,对外输出高电平。

        如上图,我们把INT配置为0,经过非门(逻辑电路的符号,不懂的可以查一下逻辑电路符号)就会0变为非0,非0就是1,所以,G=1,由于下面NMOS管的导通条件(旁边注释),OUT->GND(接地符号)导通,对外输出低电平。

开漏输出:

        该模式下,PMOS管不工作,INT=0,NMOS导通,OUT->GND。如果,INT=1,PMOS管和NMOS管都不工作,既不输出高电平也不输出低电平,这种状态称为高阻态。

        正常工作时,必需外接一个上拉电阻(如前段分析,INT=0,OUT接地是低电平。INT=1,OUT既不输出高电平也不输出低电平,为了让OUT输出高电平(注:因为配置INT=1,OUT必须输出高电平)所以加上拉电路如图所示)。此时分析,INT = 1,NMOS管高阻态,因为有上拉电路存在,所以,OUT输出高电平。

应用:

推挽输出:一般应用在输出电平为0和3.3伏而且需要高速切换开关状态的场合。在STM32 的应用中,除了必须用开漏模式的场合,我们都习惯使用推挽输出模式。

开漏输出:一般应用在I2C、SMBUS通讯等需要“线与”功能的总线电路中。除此之外,还用在电 平不匹配的场合,如需要输出5伏的高电平,就可以在外部接一个上拉电阻,上拉电源为5伏, 并且把GPIO设置为开漏模式,当输出高阻态时,由上拉电阻和电源向外输出5伏的电平。

第三部分:输出数据寄存器

        输出数据寄存器(GPIOx_ODR)前面分析中的 INT 的值就是用这个配置的,可以直接对输出数据寄存器读写操作,亦可以通过上一级的位设置/清除寄存器间接配置输出数据寄存器的值。

第四部分:复用功能输出

        “复用”是指stm32单片机的片上外设(注:除芯片之外的外设)对GPIO的控制,此时,GPIO作为外设的一部分使用。

        就是GPIO引脚的第二功能。

第五部分:输入数据寄存器

        有1~4部分是输出电路,5,6,7是输入输入电路。

        配置输入输出模式通过(GPIOx_CRL),配置成上拉/下拉输入模式,这里是上拉还是下拉模式需要在固件库函数里专门使用配置。

            输入数据寄存器(GPIOx_IDR),用于存放输入的数据(I/O口)的高低电平。 当I/O口的输入信号时(无论是1还是0),进入TTL肖特基触发器。

        TTL肖特基触发器(施密特触发器)会根据输入的电平值来确定是0还是1,例如,3.3v电平判定为1,1.5v会判定为0。那么判断标准是什么呢?这里有232,TTL两种标准。232标准,-3v ~ -15v是逻辑1,3v~15v是逻辑0。TTL标准,输入情况下,小于1.2v认为是低电平,大于2.0v认为是高电平。输出情况下,小于0.8v认为是低电平,大于2.4v认为是高电平。

        信号经过TTL肖特基触发器之后,将1或0,存入输入数据寄存器。在这里说一下,输入数据寄存器还可以读取输出数据寄存器的值,用来做监控输出情况。

第六部分:复用输入功能

        和复用输出功能类似

第七部分:模拟输入

        用来读取模拟量的,所以信号不需要经过TTL肖特基触发器,必须读取每一个电压信号。同样的,当GPIO口作为模拟量输出时,不需要经过双MOS管(前文提到的第二部分电路)而直接输出到引脚上即可。

自写寄存器使用GPIO点亮LED

头文件的编写

        第一步,先分析LED 的电路原理图,如下,当PB0 = 0,电路导通,G二极管亮,PB0是GPIOB,所以,很明确了,让GPIOB的P0引脚输出一个低电平,根据上面原理分析,采用推挽输出,配置输出数据寄存器(也可先配置好位设置/清除寄存器间接配置输出数据寄存器,这里我们直接配置输出数据寄存器)

        

               第二步, 新建一个头文件 “stm32f10x.h” ,里面写好宏定义如代码所示,名字可以随便取,但是宏定义的地址需要查 stm32f10x参考手册

        通过查看系统架构图可知,有关的配置是,复位和时钟控制,APB2,GPIOB,三部分。我们需要找到三部分的地址,才能进行配置数据,地址在参考手册中。(如果没有,请自行搜索下载)

         复位和时钟控制(RCC)配置过程:

        我们从存储器映像,可知复位和时钟控制(RCC),起始地址是0x40021000

        在手册里找到,APB2的时钟使能寄存器,偏移地址是0x18,起始地址要加上偏移地址:0x40021000 + 0x18,这里讲一下啊为什么是起始地址加上偏移地址,因为寄存器是特殊功能的内存单元,而起始地址就是他的首地址,又因为,一块内存单元里面有去多寄存器,就需要在这块内存单元里再找到对应的内存单元地址。所以,起始地址加上偏移地址,就是RCC_APB2ENR寄存器的地址。

        根据参考手册的寄存器说明配置IO端口B时钟开启。

配置GPIOB的过程也是这个样子的,这里不在赘述。头文件如下图

//定义外设基地址
#define PERIPH_BASE				((unsigned int)0x40000000)
	
#define APB2PERIPH_BASE			(PERIPH_BASE + 0x10000)
#define AHBPERIPH_BASE				(PERIPH_BASE + 0x20000)

//定义RCC时钟
#define RCC_BASE						(AHBPERIPH_BASE + 0x1000)
#define RCC_APB2ENR					*(unsigned int*)(RCC_BASE+0x18)


//设置GPIOB的基地址
#define GPIOB_BASE					(APB2PERIPH_BASE + 0x0C00)

//GPIOB寄存器地址
#define GPIOB_CRL						*(unsigned int*)(GPIOB_BASE+0x00)
#define	GPIOB_ODR						*(unsigned int*)(GPIOB_BASE+0x0C)

main()主函数的编写

#include "stm32f10x.h"

int main()
{
	
	RCC_APB2ENR |= (1<<3);
	
	GPIOB_CRL &= ~(0x0F<<0);
	
	GPIOB_CRL |= (1<<0);
	
	GPIOB_ODR &= ~(1<<0);

}

void SystemInit(void)
{
	//
}

主函数为什么这么写请大家看我的文章第一节:STM32F103ZE—寄存器编程(仿51编程)-优快云博客

里面详细介绍了编写的过程和原因。

因本人水平有限,不足之处在所难免,敬请各位网友指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值