正点原子HAL库入门1~GPIO
探索者F407ZGT6(V3)
理论基础
IO端口基本结构
F4/F7/H7系列的IO端口
- F1在输出模式,禁止使用内部上下拉
F4/F7/H7在输出模式,可以使用内部上下拉 - 不同系列IO翻转速度不同
F1系列的IO端口
施密特触发器:将非标准方波,整形为方波
- 当输入电压高于正向值电压,输出为高;
- 当输入电压低于负向值电压,输出为低;
- 当输入在正负向值电压之间,输出不改变
MOS管:压控型元件,控制栅源电压(Vgs = Vg - Vs)实现导通/关闭
- P导通:Vgs<0
- N导通:Vgs>0
GPIO八种模式
GPIO八种模式 | 特点及应用 |
---|---|
输入浮空 | 输入用,完全浮空,空闲时(高阻态)状态由外部环境决定 |
输入上拉 | 输入用,空闲时呈现高电平 |
输入下拉 | 输入用,空闲时呈现低电平 |
模拟功能 | 输入用, ADC、 DAC |
开漏输出 | 输出用,不能输出高电平(除非有上拉),软件IIC的SDL、SCL等 |
开漏式复用功能 | 输出用,同上,由其他外设控制输出 |
推挽输出 | 通用输出,可输出高低电平,驱动能力强,25mA (max) |
推挽式复用功能 | 输出用,同上,由其他外设控制输出 |
输入浮空
上拉电阻关闭;下拉电阻关闭;施密特触发器打开;双MOS管不导通
输入上拉
上拉电阻打开;下拉电阻关闭;施密特触发器打开;双MOS管不导通
输入下拉
上拉电阻关闭;下拉电阻打开;施密特触发器打开;双MOS管不导通
模拟功能
上拉电阻关闭;下拉电阻关闭;施密特触发器关闭;双MOS管不导通
开漏输出
上拉电阻关闭;下拉电阻关闭;施密特触发器打开;P-MOS管始终不导通
向ODR对应位,写0则N-MOS管导通,写1则N-MOS管不导通
开漏式复用功能
上拉电阻关闭;下拉电阻关闭;施密特触发器打开;P-MOS管始终不导通
推挽输出
上拉电阻关闭;下拉电阻关闭;施密特触发器打开
向ODR对应位,写0则N-MOS管导通,写1则P-MOS管导通
推挽式复用功能
上拉电阻关闭;下拉电阻关闭;施密特触发器打开
实验
实验工程资源
实验工程资源
LED0闪烁
led.h
#ifndef __LED_H
#define __LED_H#include "./SYSTEM/sys/sys.h"/* Íⲿ½Ó¿Úº¯Êý*/
void led_init(void); /* ³õʼ»¯ */#endif
led.c
#include "./BSP/LED/led.h"void led_init(void)
{GPIO_InitTypeDef gpio_init_struct;__HAL_RCC_GPIOF_CLK_ENABLE(); //PF9 gpio_init_struct.Pin = GPIO_PIN_9; gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP; gpio_init_struct.Pull = GPIO_PULLUP; gpio_init_struct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOF,&gpio_init_struct);HAL_GPIO_WritePin(GPIOF,GPIO_PIN_9,GPIO_PIN_SET);//Initialize dark
}
stm32f4xx_hal_gpio.h
#define GPIO_MODE_INPUT MODE_INPUT /*!< Input Floating Mode */
#define GPIO_MODE_OUTPUT_PP (MODE_PP | MODE_OUTPUT) /*!< Output Push Pull Mode */
#define GPIO_MODE_OUTPUT_OD (MODE_OD | MODE_OUTPUT) /*!< Output Open Drain Mode */
#define GPIO_MODE_AF_PP (MODE_PP | MODE_AF) /*!< Alternate Function Push Pull Mode */
#define GPIO_MODE_AF_OD (MODE_OD | MODE_AF) /*!< Alternate Function Open Drain Mode */#define GPIO_MODE_ANALOG MODE_ANALOG /*!< Analog Mode */#define GPIO_MODE_IT_RISING (EXTI_MODE | GPIO_MODE_IT | RISING_EDGE) /*!< External Interrupt Mode with Rising edge trigger detection */
#define GPIO_MODE_IT_FALLING (EXTI_MODE | GPIO_MODE_IT | FALLING_EDGE) /*!< External Interrupt Mode with Falling edge trigger detection */
#define GPIO_MODE_IT_RISING_FALLING (EXTI_MODE | GPIO_MODE_IT | RISING_EDGE | FALLING_EDGE) /*!< External Interrupt Mode with Rising/Falling edge trigger detection */#define GPIO_MODE_EVT_RISING (EXTI_MODE | GPIO_MODE_EVT | RISING_EDGE) /*!< External Event Mode with Rising edge trigger detection */
#define GPIO_MODE_EVT_FALLING (EXTI_MODE | GPIO_MODE_EVT | FALLING_EDGE) /*!< External Event Mode with Falling edge trigger detection */
#define GPIO_MODE_EVT_RISING_FALLING (EXTI_MODE | GPIO_MODE_EVT | RISING_EDGE | FALLING_EDGE) /*!< External Event Mode with Rising/Falling edge trigger detection */
- GPIO_MODE_INPUT: 输入浮空模式,该引脚可以作为输入使用,但其输出值是不确定的。
- GPIO_MODE_OUTPUT_PP 和 GPIO_MODE_AF_PP: 推挽输出模式,这种模式下,引脚始终是输出高电平或低电平,除非明确要求改变。
- GPIO_MODE_OUTPUT_OD 和 GPIO_MODE_AF_OD: 开漏输出模式,这种模式下,引脚可以输出高电平或低电平,但当输出高电平时,它实际上是在请求一个低电平。
- GPIO_MODE_ANALOG: 模拟模式,该引脚可以读取模拟信号。
- GPIO_MODE_IT_RISING, GPIO_MODE_IT_FALLING, 和 GPIO_MODE_IT_RISING_FALLING: 外部中断模式,在这种模式下,当引脚的电平发生改变时(上升沿、下降沿或者两者都发生),会触发一个中断。
- GPIO_MODE_EVT_RISING, GPIO_MODE_EVT_FALLING, 和 GPIO_MODE_EVT_RISING_FALLING: 外部事件模式,在这种模式下,当引脚的电平发生改变时(上升沿、下降沿或者两者都发生),会触发一个事件,但不会中断程序流程。
main.c
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"int main(void)
{HAL_Init(); /* Initialize HAL lib*/sys_stm32_clock_init(336, 8, 2, 7); /* set clock 168Mhz */delay_init(168); /* delay initialize */led_init(); /* LED initialize */while(1){
// way1
// HAL_GPIO_WritePin(GPIOF,GPIO_PIN_9,GPIO_PIN_RESET); /* LED0 on */
// delay_ms(200);
// HAL_GPIO_WritePin(GPIOF,GPIO_PIN_9,GPIO_PIN_SET); /* LED0 off */
// delay_ms(200);//way2HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_9); //reversedelay_ms(200);}
}
跑马灯
按键控制LED0
led.h
#ifndef __LED_H
#define __LED_H#include "./SYSTEM/sys/sys.h"void led_init(void); #endif
led.c
#include "./BSP/LED/led.h"void led_init(void)
{GPIO_InitTypeDef gpio_init_struct;__HAL_RCC_GPIOF_CLK_ENABLE(); //PF9gpio_init_struct.Pin = GPIO_PIN_9; gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP; gpio_init_struct.Pull = GPIO_PULLUP; gpio_init_struct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOF, &gpio_init_struct); HAL_GPIO_WritePin(GPIOF,GPIO_PIN_9,GPIO_PIN_SET);//Initialize dark
}
key.h
#ifndef __KEY_H
#define __KEY_H#include "./SYSTEM/sys/sys.h"void key_init(void);
uint8_t key_scan(void);#endif
key.c
#include "./BSP/KEY/key.h"
#include "./SYSTEM/delay/delay.h"void key_init(void)
{GPIO_InitTypeDef gpio_init_struct;__HAL_RCC_GPIOE_CLK_ENABLE(); //PE2gpio_init_struct.Pin = GPIO_PIN_2; gpio_init_struct.Mode = GPIO_MODE_INPUT; gpio_init_struct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOE, &gpio_init_struct);
}uint8_t key_scan(void)
{if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2)==0){delay_ms(10); //去除抖动if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2)==0){while(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2)==0);return 1; //yes}}return 0; //no
}
main.c
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/KEY/key.h"int main(void)
{HAL_Init(); /* Initialize HAL lib*/sys_stm32_clock_init(336, 8, 2, 7); /* set clock 168Mhz */delay_init(168); /* delay initialize */led_init(); /* LED initialize */key_init();while(1){if(key_scan()){HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_9); //reverse}else{delay_ms(10);}}
}
按键综合
相关文章:

正点原子HAL库入门1~GPIO
探索者F407ZGT6(V3) 理论基础 IO端口基本结构 F4/F7/H7系列的IO端口 F1在输出模式,禁止使用内部上下拉 F4/F7/H7在输出模式,可以使用内部上下拉不同系列IO翻转速度不同 F1系列的IO端口 施密特触发器:将非标准方波,整形为方波 当…...
华为VRP 系统基础配置
1.flash 相当于电脑的 硬盘 2.NVRAM 拿来专门存放系统配置文件 3.RAM 运行内存 4.ROM 系统引导 1.修改系统名[Huawei]sysname SWL1 2.配置登入信息 [SWL1]header shell information "Welocom to the learning" [SWL1]q <SWL1>q User interface con0 …...

面试热题(打家窃舍)
一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响小偷偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负…...
【Deepsort】C++版本Deepsort编译(依赖opencv,eigen3)
目录 下载源码安装onnxruntime安装Eigen3编译opencv 下载源码 https://github.com/shaoshengsong/DeepSORT安装onnxruntime 安装方法参考博客 安装Eigen3 当谈及线性代数计算库时,Eigen3是一个强大而受欢迎的选择。Eigen3是一个C模板库,提供了许多用…...
Synchronized锁升级过程
无锁状态(无锁):当一个线程访问一个没有被锁定的Synchronized代码块时,处于无锁状态。此时,线程可以直接进入临界区执行代码,不需要进行任何锁协调。 偏向锁状态(偏向锁)࿱…...

汽车电子功能安全
功能安全考虑 分析方法:FMEA,DFMEA(设计潜在失效模式和影响分析) 严重度(Severity),暴露率(Exposure),可控性(Controllability)评估…...

ARM进阶:内存屏障(DMB/DSB/ISB)的20个使用例子详解
在上一节内存屏障指令之DMB、DSB和ISB详解中,介绍了一下内存屏障的三个指令的作用并举了一些例子,对于内存屏障指令的使用时机,与处理器架构(比如Cortex-M和Cortex-A)和处理器的系统实现(同样的架构,有不同的实现,如ST…...

Cpp学习——模板
模板? 目录 模板? 1.介绍 2.函数模板的使用 3.函数模板的强制转换or显式调用 四,模板的分类 1.介绍 在Cpp3.0中,祖师爷便引入了模板的概念。这是一个重大的变革,为后来的Cpp标准化打下了铺垫。也正是因为有了模板࿰…...
HTTP 协议 版本详解
HTTP 协议 介绍<一> 简介 HTTP(Hypertext Transfer Protocol)是一种用于在客户端和服务器之间进行通信的协议。它是现代互联网中最常用的应用层协议之一。HTTP 的主要目的是实现超文本资源的传输,例如 HTML 文档、图像和音频文件等。…...

PHP语言基础知识(超详细)
文章目录 前言第一章 PHP语言学习介绍 1.1 PHP部署安装环境1.2 PHP代码工具选择 第二章 PHP代码基本语法 2.1 PHP函数知识介绍2.2 PHP常量变量介绍 2.2.1 PHP变量知识:2.2.2 PHP常量知识: 2.3 PHP注释信息介绍2.4 PHP数据类型介绍 2.4.1 整形数据类型2.4…...

Flex弹性盒子的项目属性
最近在写项目时用到了弹性盒子的项目属性,记录一下,以后用到继续扩充 <div class"concern-data"><div><img src"https://meituan.thexxdd.cn/lvyou/assets/pinglun-fc62482a.svg" alt""><span>1&…...

广州银行信用卡中心:强化数字引擎安全,实现业务稳步增长
广州银行信用卡中心是全国城商行中仅有的两家信用卡专营机构之一,拥有从金融产品研发至销售及后期风险控制、客户服务完整业务链条,曾获“2016年度最佳创新信用卡银行”。 数字引擎驱动业务增长 安全左移降低开发风险 近年来,广州银行信用卡…...
【Rust日报】2023-08-03 - Polars 获约 400 万美元种子轮融资
文章:2023 年对 Rust 编译器 CI 的改进 kobzol 的新文章,介绍了关于优化 Rust 编译器构建、测试和性能监视基础设施的方案和实施情况。 根据作者的工作,文章内容分为三类: Rust 编译器(rustc)构建配置、 Ru…...

装修小程序,开启装修公司智能化服务的新时代
随着数字化时代的来临,装修小程序成为提升服务质量和效率的关键工具。装修小程序旨在为装修公司提供数字化赋能、提高客户满意度的智慧装修平台。通过装修小程序,装修公司能够与客户进行在线沟通、展示设计方案、提高服务满意度等操作。 装修小程序的好处…...
使用PHP和Redis实现简单秒杀功能
安装Redis 首先,需要在服务器上安装Redis。如果使用Linux系统,可以使用命令行安装。如果使用Windows系统,可以下载并安装Redis二进制文件。 创建Redis连接 在PHP中,可以使用Redis扩展来连接Redis服务器。需要在PHP文件中包含Re…...
C#开发FFMPEG例子(API方式) FFmpeg拉取udp组播流并播放
代码及工程见https://download.csdn.net/download/daqinzl/88168680 开发工具:visual studio 2019 网上用C/C调用FFmpeg的API例子很多, c#使用ffmpeg.autogen的方式很简单,直接复制C/C调用FFmpeg的API的代码到C#中,然后在FFmpeg…...

Android性能优化—图片优化
图片优化是内存优化中很重要的一部分,加载Bitmap时往往需要消耗大量的内存,稍不注意就容易导致内存溢出(OOM)。 一、图片OOM问题产生 1、 一个页面一次加载过多图片; 2、加载大图片没有进行压缩(尺寸,质…...

如何搭建自动化测试框架?资深测试整理的PO模式,一套打通自动化...
目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 Po模型介绍 1、简…...

软件外包开发的GO语言特点
Go语言(也称为Golang)是由Google开发的一种编程语言。它具有许多特点,使其成为许多项目范围的优秀选择。Go语言适用于需要高性能、并发和简洁易读的项目,特别是面向网络和分布式应用的项目。今天和大家分享项目的特点及适用的项目…...

【深度学习Week4】MobileNet_ShuffleNet
报错:unsafe legacy renegotiation disabled 解决方案: 尝试了更换cryptography36.0.2版本,以及更换下载链接的方法,都不行,最后采用了手动下载mat文件并上传到colab的方法 高光谱图像分类数据集简介Indian Pines&…...

龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...

算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...

Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...

篇章二 论坛系统——系统设计
目录 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 1. 数据库设计 1.1 数据库名: forum db 1.2 表的设计 1.3 编写SQL 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 通过需求分析获得概念类并结合业务实现过程中的技术需要&#x…...
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...

Java后端检查空条件查询
通过抛出运行异常:throw new RuntimeException("请输入查询条件!");BranchWarehouseServiceImpl.java // 查询试剂交易(入库/出库)记录Overridepublic List<BranchWarehouseTransactions> queryForReagent(Branch…...

20250609在荣品的PRO-RK3566开发板的Android13下解决串口可以执行命令但是脚本执行命令异常的问题
20250609在荣品的PRO-RK3566开发板的Android13下解决串口可以执行命令但是脚本执行命令异常的问题 2025/6/9 20:54 缘起,为了跨网段推流,千辛万苦配置好了网络参数。 但是命令iptables -t filter -F tetherctrl_FORWARD可以在调试串口/DEBUG口正确执行。…...