GPIO的使用--时钟使能含义--代码封装

目录

一、时钟使能的含义

1.为什么要时钟使能?

2.什么是时钟使能?

3.GPIO的使能信号?

 二、代码封装

1.封装前完整代码

2.封装结构

封装后代码

led.c

 led.h

key.c

key.h

main.c


一、时钟使能的含义

1.为什么要时钟使能?

每一个stm32单片机里都有着各种硬件设备,每一个设备对于频率的要求是不同的,有些设备要求频率低,有些设备要求频率高。如果为所有硬件设备设置同一频率,这就会出现性能不足或者资源浪费的情况,所以引入“时钟”这一概念,实现频率分配,即“分频”,“倍频”。需要低频和高频的设备使用相应的时钟使能函数(已经固定,需要查表或者查图获得),可以使用自己所需要的频率,实现资源的合理分配。

2.什么是时钟使能?

时钟是分频,使能是信号,是动作。所有时钟默认是disable,需要用哪个频率,调用相应的信号,设为enable。

时钟使能是用分频得到的信号作为模块的使能信号,模块原有的时钟不变。即用分频信号去控制模块的使能端口。

3.GPIO的使能信号?

GPIO模块的使能信号是AHB1

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);

通过一系列的分频和倍频使得每一个模块有比较适配的频率,利用率高。分倍频原理如下:

 二、代码封装

在前面的开关控制灯的亮灭代码实现时, 有开关的五大参数设置和灯的五大参数设置等数十行代码在函数实现的前面,影响程序的可读性,所以要进行代码的封装,增强简洁性。

1.封装前完整代码

#include "stm32f4xx.h"                  // Device headerint main()
{//时钟使能--LEDRCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);//GPIO时钟控制  //参数配置//让程序决定第几组第几根引脚,如何工作GPIO_InitTypeDef led_gpio;led_gpio.GPIO_Mode = GPIO_Mode_OUT;    //引脚以输出方式工作led_gpio.GPIO_OType = GPIO_OType_PP;	 //推挽led_gpio.GPIO_Pin =  GPIO_Pin_9| GPIO_Pin_10 |GPIO_Pin_8;led_gpio.GPIO_Speed=GPIO_High_Speed;      //gpio的反应速率,不太影响led_gpio.GPIO_PuPd=GPIO_PuPd_DOWN;          //上拉  GPIO_PuPd_DOWN 下拉//GPIO_PuPd_NOPULLGPIO_Init(GPIOF,&led_gpio);GPIO_SetBits(GPIOF, GPIO_Pin_9);GPIO_SetBits(GPIOF, GPIO_Pin_10);uint16_t key0=0;//时钟使能--KEY开关RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);//GPIO时钟控制  //参数配置//让程序决定第几组第几根引脚,如何工作GPIO_InitTypeDef key_gpio;key_gpio.GPIO_Mode = GPIO_Mode_IN;        //引脚以输入方式工作key_gpio.GPIO_OType = GPIO_OType_PP;	    //推挽key_gpio.GPIO_Pin =  GPIO_Pin_4| GPIO_Pin_3 |GPIO_Pin_2;//第几根引脚key_gpio.GPIO_Speed=GPIO_High_Speed;      //gpio的反应速率,不太影响key_gpio.GPIO_PuPd=GPIO_PuPd_UP;          //上拉  GPIO_PuPd_DOWN 下拉//GPIO_PuPd_NOPULLGPIO_Init(GPIOE,&key_gpio);               //初始化while(1){//uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin);key0= GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4);//默认高电平,按下,接地if(key0==1){GPIO_WriteBit(GPIOF, GPIO_Pin_10,1);//led高电平,灯灭}else{GPIO_WriteBit(GPIOF, GPIO_Pin_10,0);	//led高电平,灯亮}	}
}

2.封装结构

封装后代码

led.c
#include "stm32f4xx.h"                  // Device headervoid Led_Init()
{RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);GPIO_InitTypeDef gpio_init;gpio_init.GPIO_Mode=GPIO_Mode_OUT;gpio_init.GPIO_OType=GPIO_OType_OD;gpio_init.GPIO_Pin=GPIO_Pin_9|GPIO_Pin_10;gpio_init.GPIO_PuPd=GPIO_PuPd_NOPULL;gpio_init.GPIO_Speed=GPIO_High_Speed;GPIO_Init(GPIOF,&gpio_init);
}
 led.h
void Led_Init(void);//声明
key.c
#include "stm32f4xx.h"                  // Device headervoid Key_Init()
{RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);GPIO_InitTypeDef gpio_key;gpio_key.GPIO_Mode=GPIO_Mode_IN;gpio_key.GPIO_OType=GPIO_OType_OD;gpio_key.GPIO_Pin=GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;gpio_key.GPIO_PuPd=GPIO_PuPd_UP;gpio_key.GPIO_Speed=GPIO_High_Speed;GPIO_Init(GPIOE,&gpio_key);
}
key.h
void Key_Init(void);
main.c
#include "stm32f4xx.h"                  // Device header
#include "led.h"
#include "key.h"int main()
{Led_Init();Key_Init();uint8_t key=0;while(1){key= GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4);//默认高电平,按下,接地if(key0==1){GPIO_WriteBit(GPIOF, GPIO_Pin_10,1);    //led高电平,灯灭}  else{GPIO_WriteBit(GPIOF, GPIO_Pin_10,0);	//led低电平,灯亮}	}
}

至此,main.c代码变简洁了不少,而且代码更加易读,代码层次也更清晰。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/197934.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python开发运维:Python 3.8 常用标准库

目录 一、理论 1.Python3.8 标准库 2.常用标准库 二、问题 1.Python 正则表达式如何实现 一、理论 1.Python3.8 标准库 (1)官网 Python 标准库 — Python 3.8.17 文档 (2)其他版本下拉列表查询 2.常用标准库 &#xff0…

MySQL笔记-第01章_数据库概述

视频链接:【MySQL数据库入门到大牛,mysql安装到优化,百科全书级,全网天花板】 文章目录 第01章_数据库概述1. 为什么要使用数据库2. 数据库与数据库管理系统2.1 数据库的相关概念2.2 数据库与数据库管理系统的关系2.3 常见的数据库…

JVM参数配置推荐

JVM配置建议 参数 备注/参数释义 规范 JVM GC方法 ParallelGC:1.8默认,高吞吐量,响应时间不敏感 CMS:响应优先,堆内存8G以下优先选择 G1:响应优先,堆内存8G及以上选择 C端应用:…

微积分中值定理的双存在值证明问题@寻找辅助函数证明中值问题

文章目录 abstract微积分中值定理的双存在值证明题举例综合使用积分中值定理和微分中值定理例 双中值问题构造辅助函数法综合小结 abstract 微积分中值定理的双存在值证明问题寻找辅助函数证明中值问题 微积分中值定理的双存在值证明题举例 综合使用积分中值定理和微分中值定…

Linux--网络编程-ftp(TCP)网络通信-文件交互

项目要求:实现以下内容 远程控制: 1、查看服务器当前路径文件 ls 3、进入、退出服务器文件夹 cd 4、上传文件到服务器 put xxx 本地控制: 1、查看本地(客户端)文件 lls 2、进入客户端文件夹 lcd 3、获取服务器的文件…

音频录制软件哪个好?帮助你找到最合适的一款

音频录制软件是日常工作、学习和创作中不可或缺的一部分。选择一个适合自己需求的录音软件对于确保音频质量和提高工作效率至关重要。可是您知道音频录制软件哪个好吗?本文将深入探讨两种常见的音频录制软件,通过详细的步骤指南,帮助您了解它…

编写Java应用程序,输出满足1+2+3+……+n<8888的最大正整数n。

源代码: public class Main { public static void main(String[] args) { int i 1; int sum 0; for(i 1;;i){ sum i; if (sum >8888) break; } System.out.println(i-1); } } 实验运行截图:

数组实现循环队列(新增一个空间)

目录 一、前言 1.如何实现循环? 2.如何判断队列为空? 3.如何判断队列为满? 二、循环队列的结构定义 三、循环队列的创建及其初始化 四、入队 五、出队 六、取队头元素 七、取队尾元素 八、判空 九、判满 十、销毁队列 一、前言 …

【滑动窗口】LeetCode2953:统计完全子字符串

作者推荐 [二分查找]LeetCode2040:两个有序数组的第 K 小乘积 本题其它解法 【离散差分】LeetCode2953:统计完全子字符串 题目 给你一个字符串 word 和一个整数 k 。 如果 word 的一个子字符串 s 满足以下条件,我们称它是 完全字符串: s 中每个字符…

深入理解:指针变量的解引用 与 加法运算

前言 指针变量的解引用和加法运算是非常高频的考点,也是难点,因为对初学者的不友好,这就导致了各大考试都很喜欢在这里出题,通常会伴随着强制类型转换、二维数组、数组指针等一起考查大家对指针的理解。但是不要怕,也许…

论文解读--PointPillars- Fast Encoders for Object Detection from Point Clouds

PointPillars--点云目标检测的快速编码器 摘要 点云中的物体检测是许多机器人应用(如自动驾驶)的重要方面。在本文中,我们考虑将点云编码为适合下游检测流程的格式的问题。最近的文献提出了两种编码器;固定编码器往往很快,但牺牲了准确性,而…

腾讯视频崩了,年终奖没了。。。

最近互联网的瓜可是不少啊!最开始阿里云崩了,阿里云崩了之后,没几天滴滴也崩了,滴滴崩了之后,结果昨天腾讯视频也崩了......年底了,都要来刷刷存在感吗? 简直让我想起来一首儿歌: 阿…

使用autodl服务器,两个3090显卡上运行, Yi-34B-Chat-int4模型,并使用vllm优化加速,显存占用42G,速度23 words/s

1,演示视频地址 https://www.bilibili.com/video/BV1Hu4y1L7BH/ 使用autodl服务器,两个3090显卡上运行, Yi-34B-Chat-int4模型,用vllm优化,增加 --num-gpu 2,速度23 words/s 2,使用3090显卡 和…

25、矩阵乘法的本质

本来一直在介绍卷积,为什么突然出现一个矩阵乘法呢? 因为如果我们将卷积运算拆开,其中最核心的部分便是一个矩阵乘法。所以,卷积算法可以看做是带滑窗的矩阵乘法。 这里的滑窗,就是卷积运算中所示意的动图那样,所以,我们把滑窗固定,不看卷积核滑动这个动作,那么就是…

龙芯loongarch64服务器编译安装tokenizers

1、简介 Hugging Face 的 Tokenizers 库提供了一种快速和高效的方式来处理(即分词)自然语言文本,用于后续的机器学习模型训练和推理。这个库提供了各种各样的预训练分词器,如 BPE、Byte-Pair Encoding (Byte-Level BPE)、WordPiece 等,这些都是现代 NLP 模型(如 BERT、GP…

数据的标准化和归一化

前面我们已经学习了识别数据缺失值已经对缺失值进行处理的方法,但是KNN的准确率都不是很高,今天我们继续进行数据探索进一步增强机器学习流水线; 通过数据直方图可以看到数据中的列的均值、最大值、最小值等差别很大; from skle…

VT-MRPA1-151-1X/V0/0控制2FRE16模块式模拟放大器

适用于控制带有电气位置反馈的直动式比例减压阀(DBETR- 1X 类型)或带有电气位置反馈的比例流量控制阀(2FRE... 类型);控制值输入 1 0 V(差动输入); 可分别调节“上/下”斜坡时间的斜…

android 13.0 去掉usb授权提示框 默认给予权限

1.概述 在13.0的系统rom产品开发中,在进行iot关于插入usb设备的开发过程中,在插入usb设备时会弹出usb授权提示框,也带来一些不便, 这个需要默认授予USB权限,插拔usb都不弹出usb弹窗所以这要从usb授权相关管理页默认给与usb权限,接下来分析下 相关的实现功能流程 2.去掉u…

两种内网穿透的实现方法

目录 前言: 一、IP和端口的作用 二、公网IP不够用 三、内网穿透实现方法 方法一:设置路由器 方法二:使用某些APP,例如花生壳 前言: 本文会介绍为什么需要使用内网穿透以及实现内网穿透的两种方法 一、IP和端口…