概述
目录
- 一、STM32F103系列芯片的地址映射和寄存器映射原理
- 什么是寄存器
- 地址映射和寄存器映射原理
- 二、GPIO端口的初始化设置步骤
- GPIO简介
- 第一步时钟配置
- 时钟的作用
- stm32时钟的配置
- 第二步输入输出模式设置
- 工作模式
- GPIO8种工作模式
- 输入和输出
- 输入模式
- 输出模式
- GPIO初始化步骤
- 实例
- 三小结
- 四参考
一、STM32F103系列芯片的地址映射和寄存器映射原理
什么是寄存器
- 基本含义:寄存器是CPU内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果。其实寄存器就是一种常用的时序逻辑电路,但这种时序逻辑电路只包含存储电路。寄存器的存储电路是由锁存器或触发器构成的,因为一个锁存器或触发器能存储1位二进制数,所以由N个锁存器或触发器可以构成N位寄存器。寄存器是中央处理器内的组成部分。寄存器是有限存储容量的高速存储部件,它们可用来暂存指令、数据和位址。
通俗的讲:寄存器就是存放东西的东西。从名字来看,跟火车站寄存行李的地方好像是有关系的。只不过火车站行李寄存处,存放的行李;寄存器可能存放的是指令、数据或地址。 - 存放数据的寄存器是最好理解的,如果你需要读取一个数据,直接到这个寄存器所在的地方来问问他,数据是多少就行了。问寄存器这个动作,叫做访问寄存器。不同的数据会存放在不同的寄存器,例如引脚PA2与PB8的高低电平数据(1或0)肯定放在不同的寄存器里,那么怎么区分不同的寄存器呢?通过地址,不同的寄存器有不同的地址,就像老张行李寄存处在101号店铺,老王行李寄存处在258号店铺。
- 指令、地址寄存器与数据寄存器类似,里边存放的都是0和1,毕竟单片机也只认识机器码,机器码都是0或1,只是特别的规定下,数据寄存器里面存放的0和1表示数据,指令寄存器里存放的表示指令。
地址映射和寄存器映射原理
- 以STM32为例,操作硬件本质上就是操作寄存器。在存储器片上外设区域,四字节为一个单元,每个单元对应不同的功能。当我们控制这些单元时就可以驱动外设工作,我们可以找到每个单元的起始地址,然后通过C 语言指针的操作方式来访问这些单元。但若每次都是通过这种方式访问地址,不好记忆且易出错。这时我们可以根据每个单元功能的不同,以功能为名给这个内存单元取一个别名,这个别名实质上就是寄存器名字。给已分配好地址(通过存储器映射实现)的有特定功能的内存单元取别名的过程就叫寄存器映射。
二、GPIO端口的初始化设置步骤
GPIO简介
GPIO是通用输入输出端口的简称,简单来说就是STM32可控制的引脚,STM32芯片的GPIO引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。STM32芯片的GPIO被分成很多组,每组有16个引脚,如型号为STM32F4IGT6型号的芯片有GPIOA、GPIOB、GPIOC至GPIOI共9组GPIO,芯片一共176个引脚,其中GPIO就占了一大部分,所有的GPIO引脚都有基本的输入输出功能。
最基本的输出功能是由STM32控制引脚输出高、低电平,实现开关控制,如把GPIO引脚接入到LED灯,那就可以控制LED灯的亮灭,引脚接入到继电器或三极管,那就可以通过继电器或三极管控制外部大功率电路的通断。
最基本的输入功能是检测外部输入电平,如把GPIO引脚连接到按键,通过电平高低区分按键是否被按下。
第一步时钟配置
时钟的作用
- 决定了程序执行的速度,给芯片提供一个稳定的执行频率
- 为了省电,默认的时钟都是关闭的。配置STM32的任何资源前,都必须首先使能时钟。
stm32时钟的配置
时钟控制名字叫做RCC,属于AHB总线。GPIOB属于APB2
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE)
第二步输入输出模式设置
工作模式
GPIO的八种工作模式:输入输出是相对于CPU,四种输入、四种输出模式及四种输出最大速度
(1)GPIO_Mode_AIN 模拟输入
将IO口作为模拟输入接口,输入的可能是变化的值,接收外部的模拟信号输入
(2)GPIO_Mode_IN_FLOATING 浮空输入
复位上电的时候,引脚不确定电平的高低
(3) GPIO_Mode_IPD 下拉输入
将IO口作为通用输入接口,只能输入0或者1,强制下拉,一般是为了输入强低电平
(4) GPIO_Mode_IPU 上拉输入
将IO口作为通用输入接口,只能输入0或者1,强制下拉,一般是为了输入强高电平
(5) GPIO_Mode_Out_OD 开漏输出(带上拉或者下拉)
要得到高电平状态需要上拉电阻才行,可以作为电流型驱动
(6) GPIO_Mode_AF_OD 开漏复用输出(带上拉或者下拉)
复用功能,不只是单纯的作为输入输出,可以作为其他功能的引脚:串口、I2C、SPI,要得到高电平状态需要上拉电阻才行
(7) GPIO_Mode_Out_PP 推挽输出(带上拉或者下拉)
——IO 输出 0-接 GND, IO 输出 1 -接 VCC,读输入值是未知的,输出0,就一定是0,输出1就一定是1
(8) GPIO_Mode_AF_PP 推挽复用输出(带上拉或者下拉)
复用功能,不只是单纯的作为输入输出,可以作为其他功能的引脚:串口、I2C、SPI,输出0,就一定是0,输出1就一定是1
(9)GPIO四种最大输出速度:2MHZ、25MHZ、50MHZ、100MHZ
GPIO8种工作模式
typedef enum
{
GPIO_Mode_AIN = 0x0, // 模拟输入
GPIO_Mode_IN_FLOATING = 0x04, // 浮空输入
GPIO_Mode_IPD = 0x28, // 下拉输入
GPIO_Mode_IPU = 0x48, // 上拉输入
GPIO_Mode_Out_OD = 0x14, // 开漏输出
GPIO_Mode_Out_PP = 0x10, // 推挽输出
GPIO_Mode_AF_OD = 0x1C, // 复用开漏输出
GPIO_Mode_AF_PP = 0x18 // 复用推挽输出
} GPIOMode_TypeDef;
输入和输出
输入 进行数据的采集,外部电路通过IO口输入模拟量,然后通过“TTL肖特基触发器”(肖特基触发器是将相对缓慢变化的模拟信号变成矩形信号,便于后面读取),进入输入数据寄存器,最后就能给CPU读取数据。
输出 GPIO的输出与51的 IO口是差不多的概念,都是输出高、低电平来控制外部电路:
处理过程:CPU下达输出高或低电平指令,指令配置“位设置/清除寄存器(GPIOx_BSRR)”(设置就是“1”高电平,清除就是“0”低电平),再由位寄存器配置输出数据寄存器(GPIOx_ODR),经过一个选择器(选择是一般输出还是复用功能输出),然后进行输出控制,控制是什么模式:推挽、开漏或者关闭,然后输出高或低电平到IO口。
输入模式
输入浮空:浮空就是逻辑器件与引脚即不接高电平,也不接低电平。由于逻辑器件的内部结构,当它输入引脚悬空时,
相当于该引脚接了高电平。一般实际运用时,引脚不建议悬空,易受干扰。通俗讲就是浮空就是浮在空中,就相当于此端口在默认情况下什么都不接,呈高阻态,这种设置在数据传输时用的比较多。浮空最大的特点就是电压的不确定性,它可能是0V,页可能是VCC,还可能是介于两者之间的某个值(最有可能) 浮空一般用来做ADC输入用,这样可以减少上下拉电阻对结果的影响
输入上拉模式:上拉就是把点位拉高,比如拉到Vcc。上拉就是将不确定的信号通过一个电阻嵌位在高电平。电阻同时起到限流的作用。弱强只是上拉电阻的阻值不同,没有什么严格区分
输入下拉:就是把电压拉低,拉到GND。与上拉原理相似
模拟输入:模拟输入是指传统方式的输入,数字输入是输入PCM数字信号,即0,1的二进制数字信号,通过数模转换,
转换成模拟信号,经前级放大进入功率放大器,功率放大器还是模拟的。
输入浮空(GPIO_Mode_IN_FLOATING)
输入上拉(GPIO_Mode_IPU)
输入下拉(GPIO_Mode_IPD)
模拟输入(GPIO_Mode_AIN)
输出模式
开漏输出(GPIO_Mode_Out_OD)
开漏复用功能(GPIO_Mode_AF_OD)
推挽式输出(GPIO_Mode_Out_PP)
推挽式复用功能(GPIO_Mode_AF_PP)
输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻才行,适合于做电流型的驱动,其吸收电流的能力相对强(一般20mA以内)
开漏复用功能:可以理解为GPIO口被用作第二功能时的配置情况(即并非作为通用IO口使用)。端口必须配置成复用功能输出模式(推挽或开漏)
推挽式输出:可以输出高,低电平,连接数字器件;推挽结构一般是指两个三级管分别受到互补信号的控制,总是在一个三极管导通的时候另一个截止。高低电平由IC的电源低定。
推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形方法任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小,效率高。输出即可以向负载灌电流。推拉式输出级即提高电路的负载能力,又提高开关速度
推挽式复用功能:可以理解为GPIO口被用作第二功能时的配置情况(并非作为通用IO口使用)
GPIO初始化步骤
第一步:使能GPIOx口的时钟
第二步:指明GPIOx口的哪一位,这一位的速度大小以及模式
第三步:调用GPIOx初始化函数进行初始化
第四步:调用GPIO-SetBits函数,进行相应位的位置
实例
- 单个GPIO端口
GPIO_InitTypeDef GPIO_InitStructure;
第一步:使能GPIOA的时钟:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
第二步:设置GPIOA参数:输出OR输入,工作模式,端口翻转速率
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_6| GPIO_Pin_7| GPIO_Pin_8; //设定要操作的管脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置为推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // IO口速度为50MHz
第三步:调用GPIOA口初始化函数,进行初始化。
GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOA
第四步:调用GPIO-SetBits函数,进行相应为的置位。
GPIO_SetBits(GPIOA,GPIO_Pin_0); //输出高
- 多个GPIO端口
GPIO_InitTypeDef GPIO_InitStructure;
第一步:使能GPIOA,GPIOE的时钟:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
第二步:设置GPIOA,GPIOE参数:输出OR输入,工作模式,端口翻转速率
第三步:调用GPIOA口初始化函数,进行初始化。
第四步:调用GPIO-SetBits函数,进行相应为的置位。
把第二、三、四步合并分别设置GPIOA和GPIOE
先设置GPIOA
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; // 第四个口,PA4
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置为推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // IO口速度为50MHz
GPIO_Init(GPIOA,&GPIO-InitST); //根据设定参数初始化GPIOA
GPIO_SetBits(GPIOA,GPIO_Pin_4); //输出高
再设置GPIOE
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; // 第三个口,PE3
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置为推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // IO口速度为50MHz
GPIO_Init(GPIOE,&GPIO-InitST); //根据设定参数初始化GPIOE
GPIO_SetBits(GPIOE,GPIO_Pin_3); //输出高
三小结
GPIO初始化需要时钟配置、输入输出模式设置、最大速率设置三个步骤实现。
四参考
https://blog.csdn.net/cleveryoga/article/details/120927837?spm=1001.2014.3001.5502
https://blog.csdn.net/qq_45917157/article/details/120855266?spm=1001.2014.3001.5502
最后
以上就是轻松冰棍为你收集整理的STM32F103系列芯片的地址映射和寄存器映射原理,GPIO端口的初始化设置一、STM32F103系列芯片的地址映射和寄存器映射原理二、GPIO端口的初始化设置步骤三小结四参考的全部内容,希望文章能够帮你解决STM32F103系列芯片的地址映射和寄存器映射原理,GPIO端口的初始化设置一、STM32F103系列芯片的地址映射和寄存器映射原理二、GPIO端口的初始化设置步骤三小结四参考所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复