ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

STM32(STM32U575RIT6)基础学习(GPIO)

STM32(STM32U575RIT6)基础学习(GPIO) 1.如何点亮一盏灯灯亮需要电流电流的产生需要电势差3.3V------- LED - --------GND0V核心板上面的LED原理图中的LED原理图原理图Schematic Diagram也称为电路图或电气图是一种图形表示方法用于展示电子系统或电路的工作原理和组成部分之间的连接方式。它通常包括各种符号来代表电子元器件如电阻器、电容器、晶体管等以及连线来表示它们之间的电器连接。电路分析上拉电阻VDD连接一个电阻连接到信号线作用在没有外界的电路接入或者外界电路的电平状态不确定的情况下让电路保持在高电平状态。下拉电阻GND连接一个电阻连接到信号线作用在没有外界的电路接入或者外界电路的电平状态不确定的情况下让电路保持在低电平的状态。由以上分析得知只需要给PC13引脚一个高电平D1即可被点亮反之熄灭。2.GPIO简介GPIO全称General purpose input output通用的输入输出接口Iinput 输入OoutputGPIO是嵌入式系统单片机开发中最常用的接口用户可以通过编程灵活的对接口进行控制实现对电路板上LED、数码管、按键等常用设备控制驱动也可以作为串口的数据收发管脚或AD的接口等复用功能使用。其作用和功能是非常重要的。实际的应用input 输入-采集外界的信息 各种传感器、按键。output 输出-控制外部设备 LED 马达 风扇 蜂鸣器功能描述GPIO功能说明根据数据手册中列出的每个I/O端口的特性可通过软件将通用I/OGPIO端口位分别配置为多种模式浮空输入上拉输入下拉输入模拟输入具有上拉或者下拉功能的开漏输出具有上拉或下拉功能的推挽输出具有上拉或下拉功能的复用功能推挽具有上拉或下拉功能的复用功能开漏功能框图VDD元器件内部的工作电压VCC接入电路的电压VSS公共的接地端TTL施密特触发器去除噪声由于外部输入的电信号可能会出现脉冲等噪声的影响为了让信号更加清晰所以就设置了TTL施密特触发器来进行整形。滤波整形对于上升沿和下降沿比较缓慢的输入信号施密特触发器可以将其转换为边缘陡峭的方波信号。这对于后续的数字电路处理非常重要因为数字电路要求输入信号具有明确的高电平和低电平。提高抗干扰能力由于施密特触发器具有滞回效应它能够提高电路的抗干扰能力。即便输入信号存在一定程度的抖动或者噪声施密特触发器仍能保持稳定的输出状态。施密特触发器的工作原理施密特触发器的核心就在于它的滞回效应是的施密特触发器具有两个不同的触发电平----上触发电平 VT 下触发电平VT-当输入的电压从低电平开始向高电平上升时只有超过VT输出才会切换到高电平。当输入的电压从高电平开始向低电平下降时只有超过VT-输出才会切换到低电平。GPIO的基本功能浮空输入通过配置寄存器让电路中的上拉电阻下拉电阻均不接入电路IO端口-施密特触发器-输入数据寄存器/数字量输入-CPU读取说明浮空输入就是让引脚什么都不接处于悬空状态此时上拉电阻和下拉电阻的两个开关同时断开因为没有上拉和下拉所以当IO口没有外界电路接入的时候此时内部电路的电平状态处于不确定的状态这既是一个优点又是一个缺点好处就在于完全由外界的输入来决定电平状态。应用一般放在用于开关或者其他元器件内部的电压读取还有就是一些通信协议上。上拉输入通过寄存器的配置让上拉电阻接入电路在没有信号输入的情况下IO口识别到的都是高电平。I/O口上拉电阻-施密特触发器-输入数据寄存器-CPU读取说明当没有信号输入或者当外界电路的电平状态不确定的时候上拉电阻会将信号拉高到高电平此时IO口识别到的都是高电平此时引脚始终读取到高电平信号。如果有外界信号输入或者电平状态稳定以外界电路的电平状态为主。应用输入信号不稳定的时候下拉输入通过寄存器的配置让下拉电阻接入电路在没有信号的情况下IO识别到的都是低电平。IO口/下拉电阻-施密特触发器-输入数据寄存器-CPU读取说明当没有信号输入或者当外界的电平状态不确定的时候下拉电阻会将信号拉低到低电平此时引脚始终读取到低电平信号。如果有外界信号输入或者电平状态稳定以外界电路的电平状态为主。模拟输入原汁原味的信号什么都不经过IO口-片上外设说明信号进入后不经过上拉电阻或者下拉电阻关闭施密特触发器经由另一线路把电压信号传送到片上外设模块。所以可以理解为模拟输入的信号未经处理的信号是原汁原味的信号。应用多用于ADC数据的采集推挽输出推挽描述的是电流的动作推N-MOS管关闭P-MOS管打开电流从内部的VDD给外部供电电流从内部被推出去。挽P-MOS关闭N-MOS管打开电流从外部流向内部的VSS此时电流被挽回来。输出数据寄存器为 0 - 输出控制 1- 激活N-MOS -IO口低电平-输出低电平输出数据寄存器为 1 - 输出控制 0- 激活P-MOS -IO口高电平-输出高电平特点1.具备输出高低电平的能力。2.推挽输出就是可以需要利用两个不同的MOS管来实现输出。推挽输出模式下P-MOS管N-MOS管通过设置位设置/清除寄存器或者输出数据寄存器的值途径P-MOS管和N-MOS管最终输出到I/O端口 。3.一般最常用的输出方式既能输出高电平也能输出低电平。开漏输出P-MOS管不使用在开漏模式下输出的引脚会存在两种状态1.低电平状态逻辑0当内部的晶体管N-MOS导通的时候引脚的电平状态被拉低到低电平输出低电平。2.当晶体管N-MOS也关闭的时候内部处在高阻态。没有办法输出电平但是可以使用上拉电阻将电平状态拉高来输出一个高电平。虽然我们可以看到开漏输出是没办法在内部输出一个高电平但是这一个看似是缺点。其实实际上是一种优点。当给一个低电平的时候MOS管没有导通此时电压不确定导致无法输出高电平但是一旦我们在外部增加一个上拉那么这个上拉的电压是由我们自己确定的这样我们就可以根据外部电路需要多少V的高电平来给这一个上拉的电压可以更好的适应更多的情况。推挽输出和开漏输出的区别复用功能的推挽复用功能的开漏3.GPIO输出实验GPIO相关的寄存器寄存器的概念为什么要学习寄存器寄存器的作用是什么1.寄存器是单片机内部的存储单元2.单片机模式的设置和寄存器直接关联的比如输出模式输出的高低电平上拉电阻和下拉电阻是否打开所以想要对单片机进行设置就是对寄存器改写的过程。下面我们以PC13引脚为例进行寄存器的使用时钟使能寄存器我们在找GPIOC端口之前需要先配置GPIO的C端口的时钟使能C端口才能进行工作。1.确定C端口连接的总线2.找到总线相关的时钟寄存器如果我们想要使用GPIOC端口的话就必须开启RCC_AHB2ENR的位2 置位1端口模式寄存器注意此寄存器两位控制一个引脚PC13配置为通用的输出模式位2726分别置为01端口输出类型寄存器PC13配置为推挽输出位13置位0端口输出速度寄存器PC13配置为低速输出位2726置位00端口上下拉寄存器PC13引脚输出高电平位13置位1总结打开时钟是能寄存器 RCC_AHB2ENR 位2写1配置端口模式寄存器 GPIO_MODER 位27 26写为 01端口输出类型寄存器 GPIOC_OTYPER 位 13置位 0端口输出速度寄存器 GPIOC_OSPEEDR 位 27,26置位 00端口上下拉寄存器 GPIOC_PUPDR 位 27 26 置位 0,0配置输出数据寄存器 GPIOC_ODR 位13置位1置0公式 寄存器地址 ~1 n置1公式 寄存器地址 | (1 n)寄存器1.创建一个文件2.选择一个空的或者新建一个文件夹3.芯片选型4.新建一个C类型的文件5.添加启动文件6.添加以下系统初始化的函数void SystemInit(void) { *(unsigned int*) 0xE000ED88|((3UL 20U)|(3UL 22U)); } int main(void) { }寻找寄存器地址RCCGPIOC端口打开时钟是能寄存器 RCC_AHB2ENR1 位2写10x56020c000x08c|(12);0x56020c8c|(12);配置端口模式寄存器 GPIOC_MODER 位2726写为0,10x52020800~(127);0x52020800|(126);端口输出类型寄存器 GPIOC_OTYPER 位13置位00x52020804~(113);端口输出速度寄存器 GPIOC_OSPEEDR 位27,26置位000x52020808~(127);0x52020808~(126);或者0x52020808~(326);端口上下拉寄存器 GPIOC_PUPDR 位2726置位0,00x5202080c~(326);配置输出数据寄存器 GPIOC_ODR 位13置位10x52020814|(113);代码实现void SystemInit(void) { *(unsigned int*) 0xE000ED88|((3UL 20U)|(3UL 22U)); } int main(void) { //打开时钟是能寄存器 RCC_AHB2ENR1 位2写1 *(unsigned int*)0x56020c8c |(12); //配置端口模式寄存器 GPIOC_MODER 位27 26写为 0,1 *(unsigned int*)0x52020800 ~(127); *(unsigned int*)0x52020800 | (126); //端口输出类型寄存器 GPIOC_OTYPER 位 13置位 0 *(unsigned int*)0x52020804 ~(113); //端口输出速度寄存器 GPIOC_OSPEEDR 位 27,26置位 00 *(unsigned int*)0x52020808 ~(326); //端口上下拉寄存器 GPIOC_PUPDR 位 27 26 置位 0,0 *(unsigned int*)0x5202080c ~(326); //配置输出数据寄存器 GPIOC_ODR 位13置位1 *(unsigned int*)0x52020814 | (113); }风扇PC6 马达PC7 蜂鸣器PA15HAL库MXKEIL5实现主流巨简单MX配置配置完生成代码编译下载即可。代码分析原理图查询下面我们以LD1为例进行原理图的查找1.首先我们找到要控制的元器件查看丝印为LD1在拓展板上2.我们打开拓展板的原理图找到了LD1所在的位置由原理图分析可知LED1连接的引脚输出高电平LD1亮2.LED1想要找到连接的芯片引脚就需要往核心板上靠近拓展板必须通过排线连接到底板3.找到J1上LED1连接的引脚3.拓展板上的J1连接的是底板上的J64.打开底板的原理图找到J6的4号脚5.底板通过底板上的排针槽J1和J2连接的核心板所以我们LED1想要链接到芯片上就必须经过这两个槽所以去J1和J2上找LED16.底板上的J1的槽到核心板上是J2底板的J2连的是核心板的J3GPIO相关的函数接口void HAL_GPIO_WritePin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState) 功能给指定引脚写入电平状态 参数端口号 引脚号 GPIO_PIN_SET高电平 GPIO_PIN_RESET:低电平 返回值无 GPIO_PinState HAL_GPIO_ReadPin (const GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin) 功能:读取指定引脚的电平状态 参数端口号 引脚号 返回值电平状态 void HAL_GPIO_TogglePin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin) 功能翻转指定引脚的电平状态 参数端口号 引脚号 返回值无 HAL_Delay(ms) 功能延时函数 参数毫秒级时间灯光闪示例GPIO输入实验按键控制执行器实验要求使用Key1来控制LED1灯原理图分析由原理图可知当按键没有被按下的时候KEY1连接的引脚检测到的是高电平。当按键被按下的时候key1连接的引脚读取到的是低电平。我们要想检测按键是否被按下买只需要读取引脚读到低电平就可以了KEY1PC9MX配置延时消抖抬手检测
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进