stm32二刷-GPIO

server/2024/12/22 9:37:21/
一 什么是 GPIO:
GPIO(general porpose intput output), 通用输入输出端口 .
二 我们先认识芯片控制 GPIO 输出控制。
2.1LED 硬件原理如图:
当电流从这根电线流通, LED 亮。当电流不通过这根电线, LED 灭。
上面 PF** ,芯片电压为低, LED 亮。为高时,不亮。
上面 PE** ,芯片电压为高, LED 亮。为低时,不亮。
(可以见得,我们的嵌入式工程师编码与硬件工程师密切相关)
还可以结论:电流的高低输出,程序决定的。芯片侧 程序决定 给这根电线供电、
或者断电。芯片外侧接 LED 灯,我们肉眼观察 led 的亮灭。判断我们控制手段是
否达成。
2.2.3.1 ;流程图第一步时钟使能函数:

 

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph,NewState);
RCC_AHB2PeriphClockCmd(RCC_AHB2Periph, NewState);
RCC_AHB3PeriphClockCmd(RCC_AHB3Periph,NewState);
RCC_APB1PeriphClockCmd( RCC_APB1Periph, NewState);
RCC_APB2PeriphClockCmd(RCC_APB2Periph, NewState);
选择: RCC_AHB1PeriphClockCmd RCC_AHB1Periph_GPIOF ENABLE ;
函数解释:让第 F 组成员都有时钟控制。没有这个时钟信号,都无法工作。
参数 1:RCC_AHB1Periph_GPIOF, 选择第几组。
参数 2 DISABLE/ENABLE
2.2.3.2 流程图第二部 GPIO 基本配置:
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
函数解释:让程序决定第几组第几根引脚,如何工作。
参数 1 GPIOx :第几组,
GPIOA/GPIOB/GPIOC/GPIOD/GPIOE/GPIOF/GPIOG/GPIOH/GPIOI/GPIOJ/GPI
OK
说明:查看确认引脚号,例如 PF9, 对应组为: GPIOF
参数 2 :第几根,如何干活。
GPIO_InitTypeDef 结构体名字;
结构体名字 .GPIO_Pin = 引脚号 ; GPIO_Pin_0/....GPIO_Pin_15/GPIO_Pin_ALL
结构体名字 .GPIO_Mode = 输入输出类型 ; GPIO_Mode_IN/GPIO_Mode_OUT/
结构体名字 .GPIO_Speed = 速度 ; GPIO_Low_Speed/...GPIO_High_Speed
结构体名字 .GPIO_OType = 类型 ; GPIO_OType_PP/GPIO_OType_OD
结构体名字 .GPIO_PuPd = 上下拉电阻 ; GPIO_PuPd_UP /GPIO_PuPd_DOWN
2.2.3.3 流程图第三步 GPIO 基本操控:
GPIO_SetBits(GPIOF, GPIO_Pin_9); PF9 输出高电平,根据硬件原理图, LED
GPIO_ResetBits(GPIOF, GPIO_Pin_9);PF9 输出低电平,根据硬件原理图, LED
整体编码整体如下:
// 时钟使能
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);
//GPIO 基本参数配置
GPIO_InitTypeDef led_gpio_initstruct;
led_gpio_initstruct.GPIO_Mode = GPIO_Mode_OUT;
led_gpio_initstruct.GPIO_OType = GPIO_OType_PP;
led_gpio_initstruct.GPIO_Pin = GPIO_Pin_9;
led_gpio_initstruct.GPIO_Speed = GPIO_High_Speed;
GPIO_Init(GPIOF,&led_gpio_initstruct);
while(1)
{
//gpio 的基本操控
GPIO_SetBits(GPIOF, GPIO_Pin_9);
GPIO_ResetBits(GPIOF, GPIO_Pin_9);
// Bit_RESET Bit_SET
//GPIO_WriteBit(GPIOF,GPIO_Pin_9,1);
//GPIO_Write(GPIOF,0X0200);
}

 第三:请对于GPIO的基本操控进行改写。要求LED灯会一闪一闪的。

流程: 1 打开 LED 2 延时, 3 关闭 LED 4 延时。重复执行四个步骤
延时函数实现: delay() { uint32_t t = 50000;while(t--)}
while(1)
{
GPIO_SetBits(GPIOF,GPIO_Pin_10);
delay(time);
GPIO_ResetBits(GPIOF, GPIO_Pin_10);
delay(5000-time);
time++;
if(time == 5000) break;
}
while(1)
{
GPIO_SetBits(GPIOF,GPIO_Pin_10);
delay(time);
GPIO_ResetBits(GPIOF, GPIO_Pin_10);
delay(5000-time);
time--;
if(time == 0) break;
}

 

3.1GPIO 的结构图,从电器特性来看代码:
1. 保护二极管:保护电压数值,不超过 VDD.
流程: 1 打开 LED 2 延时, 3 关闭 LED 4 延时。重复执行四个步骤
延时函数实现: delay() { uint32_t t = 50000;while(t--)}
while(1)
{
GPIO_SetBits(GPIOF,GPIO_Pin_10);
delay(time);
GPIO_ResetBits(GPIOF, GPIO_Pin_10);
delay(5000-time);
time++;
if(time == 5000) break;
}
while(1)
{
GPIO_SetBits(GPIOF,GPIO_Pin_10);
delay(time);
GPIO_ResetBits(GPIOF, GPIO_Pin_10);
delay(5000-time);
time--;
if(time == 0) break;
} 2. 可调节电阻,上方接通,为高电平。下方接通为低电平。
3. 施密特触发器。三角形的宽的一端有电压数值,尖端会输出 1 。反之为 0
4. 两个三极管,上方导通,输出的是高信号对应高电平。下方导通,输出的低电
平对应的 0 信号。
GPIO_InitTypeDef led_gpio_initstruct; led_gpio_initstruct.GPIO_Mode =
GPIO_Mode_OUT; 决定是输入 , 输出 , 复用 , 模拟 led_gpio_initstruct.GPIO_OType
= GPIO_OType_PP; 决定是推挽还是开漏 led_gpio_initstruct.GPIO_Pin =
GPIO_Pin_9; 决定哪一个引脚 led_gpio_initstruct.GPIO_Speed =
GPIO_High_Speed; 决定最大输出速度 GPIO_Init(GPIOF,&led_gpio_initstruct);

 

3.2GPIO 输出模式:
推挽输出 :推出去为推。拉回来为挽。推挽输出可以输出高电平与低电平。
当高电平输出的时候, LED 灭。当低电平输出的时候 LED 亮。局限在于推挽输出
引脚与输入引脚连接后,容易烧坏板子。因此引入开漏输出。不能与数据输入同
时存在。
开漏输出 :开路输出 , 仅仅输出低电平和高阻态,开漏输出会有外部电流供电,
LED 默认为 LED 亮。当输出低电平会产生短路,实现了对于 LED 灭。耗电时间长
的,耗电量大的首选这个。而且,采集信号输出信号可以同时存在。
3.3GPIO 输出开发任务:
任务选择:
开漏输出用例:
推挽输出用例:
LED 灯的代码封装 : 初始化封装, led.c led.h
输出总结:
输出模式: 共计四种输出模式。 开漏输出 推挽输出 开漏复用 * * 推挽复用
两种输出模式仅仅是数据来源来自 复用功能输出而不是输出寄存器。完全可以
参考( 开漏输出和推挽输出

http://www.ppmy.cn/server/3130.html

相关文章

【研发日记】CANoe自动化测试的配置方式(三)——SystemVariables数组方式

文章目录 前言 一、例程功能 二、仿真ECU 三、SystemVariables数组: 四、测试模块 五、测试运行效果 六、分析和应用 总结 前言 近期在做的一个自动化测试项目,尝试了一种以前没用过的测试配置方式,感觉效果还不错。然后又回顾了一下以…

VectorMap论文阅读

1. 摘要 自动驾驶系统需要对周围环境具有很好的理解,包括动态物体和静态高精度语义地图。现有方法通过离线手动标注来解决语义构图问题,这些方法存在严重的可扩展性问题。最近的基于学习的方法产生稠密的分割预测结果,这些预测不包含单个地图…

功能强大的开源数据中台系统 DataCap 2024.03.3 发布

推荐一套基于 SpringBoot 开发的简单、易用的开源权限管理平台,建议下载使用: https://github.com/devlive-community/authx 推荐一套为 Java 开发人员提供方便易用的 SDK 来与目前提供服务的的 Open AI 进行交互组件:https://github.com/devlive-commun…

计算机网络(王道考研)笔记个人整理——第三章

第三章:链路层 数据链路层:结点,链路 结点:主机、路由器 链路:网络中俩结点之间的物理通道,链路的传输介质有双绞线、光纤和微波,分为有线链路、无线链路。 数据链路:俩个结点之间的…

Mac M1芯片启动项目时出现 no zstd-jni in java.library.path 问题排查

问题 通过 Mac M1芯片的电脑启动项目时出现了zstd-jni包的问题,同事的M2芯片启动项目是正常的,所以初步判断是M1芯片和zstd-jni包之间不兼容的问题。 java.lang.UnsatisfiedLinkError: no zstd-jni in java.library.path: /Users/me/Library/Java/Exte…

Docker 部署Java程序以及常用命令详解

文章目录 关于 docker 安装以及部署项目1. CentOS 中安装 Docker2. VMware中镜像拉取失败3. idea 远程连接Docker4. dockerfile 部署 springboot 项目5. 创建JDK运行环境配置6. docker 查询容器运行日志7. docker 容器将镜像中的文件拷贝到宿主机8. docker 部署mysql9. 容器中下…

【Taro3踩坑日记】不存在全局配置文件:C:\Users\TYW\.taro-global-config\index.json

鼠鼠想用Taro做一个完整的移动端和小程序项目,结果出师未捷,就遇到个坑。 taro init myApp之后,直接报错:不存在全局配置文件:C:\Users\TYW.taro-global-config\index.json 经过多方查找,有的说要安装taroj…

Golang图像处理实战:image/png包的应用详解

Golang图像处理实战:image/png包的应用详解 介绍基本操作读取PNG文件保存PNG文件 处理图像数据修改图像像素图像裁剪和缩放 高级功能使用 image/color 处理颜色优化PNG性能 错误处理与调试常见错误及其解决方法文件无法打开图像解码失败 使用工具和库进行调试 结语 …