当前位置: 首页 > news >正文

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.lryc.cn/news/252737.html

相关文章:

  • 最小化安装 Neokylin7.0 用于搭建 Hadoop 集群
  • 苍穹外卖面试题-中
  • Python 重要数据类型
  • 03、pytest初体验
  • 智能指针及强相关知识经验总结 --- 移动语义、引用计数、循环引用、move()、自定义删除器等
  • Gson 自动生成适配器插件
  • React创建项目
  • Redis5新特性-stream
  • 删除PPT文件的备注内容
  • 2023年亚太杯APMCM数学建模大赛B题玻璃温室小气候调控
  • Oracle 查询语句限制只选择最前面几行,和最后面几行的实现方式。
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • 在 Mac 上使用浅色或深色外观
  • 华为手环关闭智能适时测量
  • 1-Hadoop原理与技术
  • YoloV5改进策略:Swift Parameter-free Attention,无参注意力机制,超分模型的完美迁移
  • DAPP开发【04】测试驱动开发
  • Raspberry Pi 2, 2 of n - Pi 作为 IoT 消息代理
  • linux服务器环境搭建(使用yum 安装mysql、jdk、redis)
  • 互联网Java工程师面试题·Spring Boot篇·第二弹
  • 【西南交大swjtu微机与接口技术实验】D/A变换实验实验三:波形发生器
  • 【每日一题】从二叉搜索树到更大和树
  • @Scheduled,Quartz,XXL-JOB三种定时任务总结
  • 开会做笔记的时候用什么软件比较好?
  • HTML CSS JavaScript的网页设计
  • 37.从0到上线三天搭建个人网站(第一天)
  • 室内外融合便携式定位终端5G+UWB+RTK
  • 使用Java语言判断一个数据类型是奇数还是偶数
  • Java三种代理模式:静态代理、动态代理和CGLIB代理
  • vivado实现分析与收敛技巧9-分析使用率统计数据