一.STM32嵌入式学习--GPIO口(1)--IO口的基础知识以及配置程序的方法

        学习单片机,从学习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控制器(STM32F101xx为例)

 初学者在尝试看图时,发现没有头绪。此时我们应该将图分割成不同的部分来看。

                                                                     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<<x)  

公式:

如果需要某个变量的某一位变为1,其他位不改变

a = a | (1 << x);              //a |= (1<<x)  

公式:

如果对某两位写入某个值,其他位不变,

一定要先清零两位

再或上具体值

a = a & ~(3<<x); //清零    //a &= ~(3<<x) ;    

a = a | (n << x)           // a |= (n<<x);

01     n:1

10     n:2

11     n:3

  • 3
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32是一款流行的嵌入式微控制器,其IO可以用来连接各种外设,如LED、按键、LCD等。下面介绍一下如何设计一个简单的IO驱动程序。 首先,需要了解IO的基本操作。每个IO都有一个GPIOx寄存器,其中包含了该IO配置信息和数据状态。配置信息包括输入/输出模式、上/下拉电阻、输出速度等;数据状态包括输入/输出值、状态标志等。通过对这些寄存器的读写操作,可以实现对IO的控制。 例如,要控制一个LED灯,可以将其连接到一个IO上,并将该IO配置为输出模式。然后,将该IO的输出值设置为高电平或低电平,就可以控制LED灯的亮灭。 以下是一个简单的IO驱动程序的实现代码: ```c #include "stm32f10x.h" #define LED_PIN GPIO_Pin_8 #define LED_GPIO GPIOA void LED_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIOA时钟 GPIO_InitStructure.GPIO_Pin = LED_PIN; //LED接在PA8上 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO速度为50MHz GPIO_Init(LED_GPIO, &GPIO_InitStructure); //根据设定参数初始化GPIO } void LED_On(void) { GPIO_SetBits(LED_GPIO, LED_PIN); //将LED对应的GPIO输出高电平 } void LED_Off(void) { GPIO_ResetBits(LED_GPIO, LED_PIN); //将LED对应的GPIO输出低电平 } ``` 在主函数中调用LED_Init函数初始化LED灯的IO,然后就可以通过调用LED_On和LED_Off函数来控制LED的亮灭了。 ```c int main(void) { LED_Init(); while(1) { LED_On(); delay(500); LED_Off(); delay(500); } } ``` 以上是一个简单的IO驱动程序的实现,可以通过类似的方法来控制其他外设的IO。需要注意的是,不同型号的STM32微控制器可能有不同的IO配置方式和寄存器地址,需要根据具体型号的数据手册来编写相应的驱动程序

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值