学习单片机,从学习GPIO口开始。
我们在日常的编写程序时离不开IO口的配置,而IO口的学习是在stm32中比较基础,对初学者比较友好,又比较全面的一个基础功能,所以我们都是从GPIO口的学习开始接触stm32。
首先我们要确定我们的学习方法,在stm32的学习中,我们是基于不同的芯片进行配置和使用,所以我们需要从三个方向来学习。
什么是GPIO口?
怎么去配置GPIO口?
GPIO口的具体应用在哪里?
1.什么是GPIO?
IO口:I:input 输入 O:output 输出
作用:是芯片与外界做信息交换的唯一通道。
数量:以STM32F407VGT6为例,该芯片有100引脚,其中包括5组IO口
5组:GPIOA,GPIOB到E 每一组有0~15号(16个)
GPIOA:0 1 2 3......15 16个
GPIOB:0 1 2 3......15 16个
GPIOC:0 1 2 3......15 16个
GPIOD:0 1 2 3......15 16个
GPIOE:0 1 2 3......15 16个
PA5表示:GPIOA组的5号IO口
2.如何去配置IO 口
我们在学习嵌入式的过程中,需要通过数据手册来查看芯片框图,通过查看具体中文参考手册来查看具体IO口的功能和配置。
初学者在尝试看图时,发现没有头绪。此时我们应该将图分割成不同的部分来看。
GPIO口输入部分框图
1.保护二极管:防止击穿;
2.肖特基触发器:将输入的连续信号转换为离散信号。
我们通过该图不难看出:我们的信息or电平从IO口输入经过三条不同的道路到芯片内核进行处理。
其中我根据写程序的经验将这“三条路”分为三个输入方式:
通用输入:直接检测IO口的电平状态(如果需要读取外界给IO口的电平状态,就要用通用输入)
复用输入:从IO进来的数据信号要经过片上外设(串口控制器),再到核心。IO就要用复用输入模式
模拟输入:外界的模拟量(电压)通过IO口进入到ADC控制器,ADC控制器转换成数字量(模数转换)
GPIO口输出部分
我们通过输入部分总结出来的概念不难区分:
从内核直接读取或者写入的为通用输出部分,而从片上外设间接从内核读取或者写入的输出为复用输出。
GPIO通用输出(两条路径都可)
从而我们总结出:
通用输出:核心直接控制IO输出高低电平,就用通用输出模式
复用输出:核心将数据信号发送到片上外设,片上外设再通过IO口传送出去.IO口复用输出模式
在其他的芯片中我们还可能看到模拟输出,通过DAC片上外设进行数模转换,再将模拟数据通过IO口传输出去。
我们还看到输出相对于输入有输出类型的选择,包括推挽输出和开漏输出。
推挽输出:IO口可以输出高电平,也可以输出低电平。
开漏输出:IO口只能输出低电平。
至此,我们总结了GPIO口信息交换的几种方式,还可以通过更形象的图像来显示:
我们把IO口信息交换的具体工作方式理清楚了,我们也懂了有多少种输入输出方式。
通过这些,我们应该懂得如何使用IO口,而且要根据需求来确定选择哪一种模式。
那我们来看看IO口对应的寄存器有哪些
学会查看寄存器要从以下几点做起:
1.寄存器的名字
2.寄存器的功能
3.寄存器有多少位,几位控制一个IO
4.具体如何配置
1.寄存器的名字
在具体编写程序时应写成对应IO口指向该寄存器,譬如:
PA5:GPIOA->CRL
PE0:GPIOE->CRL
2.寄存器的功能
如图所示,在寄存器的下方有该寄存器的具体功能在哪一位;
在该寄存器下方主要配置IO口的具体的输入/输出模式和输出的速度,
譬如我要配置PA0的通用输入:GPIOA->MODE &= ~(3<<0);(直接清零即可)
譬如我要配置PC6的复用输出:GPIOC->MODE &=~(3<<24);
GPIOC->MODE |=(2<<24);
(上述代码使用了c语言的位运算的知识)
3.寄存器有多少位,几位控制一个IO
我们要清楚寄存器有几位,而且哪位配置哪些功能,其次,我们也要看清楚几位控制一个IO,如果是一位,我们可以直接对该位进行清零或者置一或者写值,如果是两位以上,我们需要先将其清零,再进行写值。
总结:回到我们最初的三个问题:
什么是GPIO口?
是芯片与外界做信息交换的唯一通道。
怎么去配置GPIO口?
根据自己的需求来确定信息交换的模式,再通过框图确定需要使用的寄存器进行配置
GPIO口的具体应用在哪里?
通用输入:直接检测IO口的电平状态(如果需要读取外界给IO口的电平状态,就要用通用输入模式。
复用输入:从IO进来的数据信号要经过片上外设(串口控制器),再到核心。IO就要用复用输入模式。
模拟输入:外界的模拟量(电压)通过IO口进入到ADC控制器,ADC控制器转换成数字量(模数转换)
通用输出:核心直接控制IO输出高低电平,就用通用输出模式
复用输出:核心将数据信号发送到片上外设,片上外设再通过IO口传送出去.IO口复用输出模式
模拟输出:通过DAC片上外设进行数模转换,再将模拟数据通过IO口传输出去。
最后进行知识补充:位运算
如果需要某个变量的某一位变为0,其他位不改变
a = a & ~(1 << x); // a &= ~(1< 公式: 如果需要某个变量的某一位变为1,其他位不改变 a = a | (1 << x); //a |= (1< 公式: 如果对某两位写入某个值,其他位不变, 一定要先清零两位 再或上具体值 a = a & ~(3< a = a | (n << x) // a |= (n< 01 n:1 10 n:2 11 n:3