打印
[其他ST产品]

STM32“智能人数控制系统”(GPIO+EXTI外部中断)

[复制链接]
646|50
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
4c1l|  楼主 | 2023-11-22 12:08 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
学习完江科协的STM32教程的GPIO+EXTI部分利用套件实现了一个小的功能。

        这款套件包含了F103c8t6最小系统版、面包板、LED灯、按键、OLED显示屏、对射式红外传感器、蜂鸣器以及杜邦线等元件。

        这个智能人数控制系统的工作原理非常简单明了。当人们依次刷卡进入区域时,系统会限制每次只能进入10人。当人数未超过10人时,绿灯会闪烁,伴随着蜂鸣器的短促鸣叫声,OLED显示屏上的人数会增加一。当刚好达到10人时,黄灯会闪烁,并伴随着蜂鸣器的短促鸣叫声。此时,如果有人再次刷卡,红灯将持续亮起,蜂鸣器会发出长鸣声,作为警示。

        当有人出去后,只需通过按键操作,即可减少人数,恢复正常通行。此时,红灯将熄灭,系统恢复到正常状态。





使用特权

评论回复
沙发
4c1l|  楼主 | 2023-11-22 12:08 | 只看该作者
完成本次功能需要用到的知识点:
从图中我们可以看出GPIO是在APB2的总线上的

使用特权

评论回复
板凳
4c1l|  楼主 | 2023-11-22 12:09 | 只看该作者
一、一般操作GPIO的步骤

1.定义一个GPIO_InitTypeDef 类型的结构体,用于配置GPIO相关参数

2.开启外设时钟(RCC)对于使用总线APB2来说的话是RCC APB2PeriphClockCmd()具体参数看源码

使用特权

评论回复
地板
4c1l|  楼主 | 2023-11-22 12:09 | 只看该作者
3.进行结构体参数设置:

(1)GPIO_Speed:端口速度(50HZ)

(2)GPIO_Pin;端口号(如果是初始化所有引脚,GPIO_Pin_All)

(3)GPIO_Mode:端口模式(stm32有8种模式)

使用特权

评论回复
5
4c1l|  楼主 | 2023-11-22 12:09 | 只看该作者
以下是8种工作模式:

GPIO_Mode_AIN(模拟输入模式):引脚用作模拟输入,用于模拟信号的采集。使用场景:模拟信号采集、传感器接口等。
GPIO_Mode_IN_FLOATING(浮空输入模式):引脚作为浮空输入接收外部信号。使用场景:读取外部信号、按键输入等。
GPIO_Mode_IPD(带下拉输入模式):引脚作为带下拉电阻的输入接收外部信号。使用场景:读取外部信号,当外部信号未连接时,引脚会被拉低。
GPIO_Mode_IPU(带上拉输入模式):引脚作为带上拉电阻的输入接收外部信号。使用场景:读取外部信号,当外部信号未连接时,引脚会被拉高。
GPIO_Mode_Out_OD(开漏输出模式):引脚作为开漏输出发送信号给外部设备。使用场景:与其他器件共享总线,如I2C总线。
GPIO_Mode_Out_PP(推挽输出模式):引脚作为推挽输出发送信号给外部设备。使用场景:控制外部设备的状态、输出指示信号等。
GPIO_Mode_AF_OD(复用开漏输出模式):引脚作为复用开漏输出发送信号给外部设备。使用场景:使用特定的功能,如串口通信。
GPIO_Mode_AF_PP(复用推挽输出模式):引脚作为复用推挽输出发送信号给外部设备。使用场景:使用特定的功能,如PWM输出。

使用特权

评论回复
6
4c1l|  楼主 | 2023-11-22 12:09 | 只看该作者
推挽输出和开漏输出的主要区别在于输出电平的能力和连接方式。

输出电平能力:推挽输出可以主动拉高(VDD)或拉低(GND)引脚上的电平,因此可以提供高电平和低电平输出。开漏输出只能主动拉低(GND)引脚上的电平,无法提供高电平输出。要获得高电平,需要通过外部上拉电阻连接到VDD。

使用特权

评论回复
7
4c1l|  楼主 | 2023-11-22 12:10 | 只看该作者
连接方式:推挽输出可以直接连接到负载,例如LED、电机等,因为它可以提供稳定的高电平和低电平输出。开漏输出通常被用于与其他电路共享总线的情况,如I2C、SPI、UART等。在这种情况下,多个设备共享同一条信号线,每个设备都可以通过开漏输出将线拉低,但只有一个设备能够将线拉高,因为其他设备的开漏输出只能被拉低。

使用特权

评论回复
8
4c1l|  楼主 | 2023-11-22 12:10 | 只看该作者
总结起来,推挽输出适用于需要提供高电平和低电平输出的情况,而开漏输出适用于需要多设备共享总线的情况,其中只有一个设备能够提供高电平输出。

}

使用特权

评论回复
9
4c1l|  楼主 | 2023-11-22 12:10 | 只看该作者
模拟输入和浮空输入是电子电路中两种不同的输入模式。

模拟输入模式(Analog Input Mode):在模拟输入模式下,输入信号是连续的、可变的模拟信号。模拟输入通常用于测量和处理连续变化的物理量,如声音、温度、压力等。模拟输入信号通常是通过模拟传感器从外部环境中采集的,并传入电子电路中进行处理和转换。模拟输入信号可以在一定范围内连续变化,可以是电压、电流或其他模拟量。

使用特权

评论回复
10
4c1l|  楼主 | 2023-11-22 12:10 | 只看该作者
浮空输入模式(Floating Input Mode):在浮空输入模式下,输入信号处于非确定性状态,没有明确的高电平或低电平定义。浮空输入通常指的是未连接到有效信号源或未连接到电源或地的输入引脚。在浮空输入状态下,输入引脚可能会受到电磁干扰或环境噪声的影响,导致输出不确定或不可预测的结果。

使用特权

评论回复
11
4c1l|  楼主 | 2023-11-22 12:10 | 只看该作者
浮空输入模式(Floating Input Mode):在浮空输入模式下,输入信号处于非确定性状态,没有明确的高电平或低电平定义。浮空输入通常指的是未连接到有效信号源或未连接到电源或地的输入引脚。在浮空输入状态下,输入引脚可能会受到电磁干扰或环境噪声的影响,导致输出不确定或不可预测的结果。

使用特权

评论回复
12
4c1l|  楼主 | 2023-11-22 12:10 | 只看该作者
总结来说,模拟输入是指接收并处理连续变化的模拟信号,而浮空输入是指输入引脚处于未连接有效信号源的状态。

使用特权

评论回复
13
4c1l|  楼主 | 2023-11-22 12:11 | 只看该作者
二、GPIO的相关库函数:

GPIO_DeInit(GPIO_TypeDef* GPIOx)
:复位指定的GPIO端口,将其所有寄存器恢复为默认值。

GPIO_AFIODeInit()
:复位AFIO模块,将其所有寄存器恢复为默认值。

GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
:初始化GPIO端口的引脚功能和模式,通过传递一个结构体参数来配置引脚的详细设置。

GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct)
:将GPIO初始化结构体的成员变量初始化为默认值。

GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
:读取指定引脚的输入电平(高电平或低电平)。

GPIO_ReadInputData(GPIO_TypeDef* GPIOx)
:读取整个GPIO端口的输入电平。

GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
:读取指定引脚的输出电平(高电平或低电平)。

GPIO_ReadOutputData(GPIO_TypeDef* GPIOx)
:读取整个GPIO端口的输出电平。

GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
:将指定引脚的输出电平设置为高电平。

GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
:将指定引脚的输出电平设置为低电平。

GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal)
:将指定引脚的输出电平设置为指定的BitVal(高电平或低电平)。

GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal)
:将整个GPIO端口的输出电平设置为指定的PortVal。

GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
:对指定引脚进行锁定,防止意外更改其配置。

GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)
:配置GPIO事件输出选择。

GPIO_EventOutputCmd(FunctionalState NewState)
:使能或禁用GPIO事件输出。

GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState)
:配置GPIO引脚的重映射。

GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)
:配置外部中断引脚的GPIO端口源和引脚源。

GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface)

使用特权

评论回复
14
4c1l|  楼主 | 2023-11-22 12:11 | 只看该作者
配置以太网媒体接口的GPIO引脚。

EXIT外部中断基础知识:

使用特权

评论回复
15
4c1l|  楼主 | 2023-11-22 12:11 | 只看该作者
NVIC中断控制器:

STM32 的中断如此之多,配置起来并不容易,因此,我们需要一个强大而方便的中断控制器 NVIC (Nested Vectored Interrupt Controller)。NVIC 是属于Cortex 内核的器件,不可屏蔽中断 (NMI)和外部中断都由它来处理,而SYSTICK 不是由 NVIC 来控制的。

使用特权

评论回复
16
4c1l|  楼主 | 2023-11-22 12:11 | 只看该作者
对于cpu来说直接将多个中断通道输出到cpu会影响效率和占用资源,所以会通过NVIC中断控制器来管理这些中断的执行顺序,每个中断都会有优先级,所以NVIC会根据他们的优先级的高低进行向cpu输出cpu每次执行一个。

使用特权

评论回复
17
4c1l|  楼主 | 2023-11-22 12:11 | 只看该作者

使用特权

评论回复
18
4c1l|  楼主 | 2023-11-22 12:12 | 只看该作者

使用特权

评论回复
19
4c1l|  楼主 | 2023-11-22 12:12 | 只看该作者
抢占优先级和响应优先级:

STM32 的中断向量具有两个属性,一个为抢占属性,另一个为响应属性,其属性编号越小,表明它的优先级别越高。

抢占,是指打断其它中断的属性,即因为具有这个属性,会出现嵌套中断(在执行中断服务函数 A 的过程中被中断 B 打断,执行完中断服务函数 B 再继续执行中断服务函数 A),抢占属性由 NVIC_IRQChannelPreemptionPriority 的参

数配置。

使用特权

评论回复
20
4c1l|  楼主 | 2023-11-22 12:12 | 只看该作者
而响应属性则应用在抢占属性相同的情况下,当两个中断向量的抢占优先级相同时,如果两个中断同时到达,则先处理响应优先级高的中断,响应属性由 NVIC_IRQChannelSubPriority 的参数配置

NVIC优先级组:

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

55

主题

566

帖子

2

粉丝