函数的封装(硬件函数驱动)、GPIO的输入以及实例

目录

一.函数的封装

1.学习了如何进行函数的封装

1.1XX.c文件

1.2XX.h文件

二、GPIO的输入

三、实例

1.LED

1.1LED.c

1.2LED.H

2.按键

2.1KEY.c

2.2KEY.h


一.函数的封装

便于模块化的程序设计吧(我认为的),通过封装不同模块的函数,使得在main.c文件中内容简介。

1.学习了如何进行函数的封装

1.1XX.c文件

首先要引入头文件(废话qwq)

#include "stm32f10x.h"  

然后模块对应功能的函数

1.2XX.h文件

重要的是格式

#ifndef _XX_H
#define _XX_H



#endif

在中间写上函数名就欧克了

二、GPIO的输入

STM32标准库提供了4种函数

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//读取输入寄存器某一个端口的输入值
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
//读取整个寄存器的输入值返回值是16位,每一位代表一个端口值
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//读取输出寄存器某一个端口的值
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
//读取整个输出寄存器的值

三、实例

我封装了两个,一个LED的初始化、点亮、熄灭,一个按键的读取值(可能说的不是很清楚请看代码)

1.LED

1.1LED.c

#include "stm32f10x.h"                  // Device header

/*
操作stm32的GPIO一共4个操作
1.使用RCC开启GPIO的时钟
2.使用GPIO_Init函数初始化GPIO
3.使用输出或者输入的函数控制GPIO口
*/

void LED_Init(GPIO_TypeDef* Port/*端口*/,uint16_t Pin/*引脚*/)//初始化端口
{
	if(Port == GPIOA ){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);}//开启时钟
	else if(Port == GPIOB ){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);}
	else if(Port == GPIOC ){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);}
	else if(Port == GPIOD ){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);}
	
	//配置端口模式
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode	=	GPIO_Mode_Out_PP;    //PP推挽输出
	GPIO_InitStructure.GPIO_Pin	=Pin;
	GPIO_InitStructure.GPIO_Speed	=	3;                   //3->50MHz
	GPIO_Init(Port,&GPIO_InitStructure);
}
void LED(GPIO_TypeDef* Port/*端口*/,uint16_t Pin/*引脚*/,BitAction BitVal/*高低电平*/)
{
	GPIO_WriteBit(Port, Pin, BitVal);
}


//		GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//设置为高电频
//		GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//设置为低电频
//		GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
//		设置为对应模式Bitval=Bit_RESET(低电频)or =Bit_SET(高电频)
//		GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);

在写函数时我用了两个参数,方便自由渐变 的操控每个GIPO口及引脚(可能会导看起来有点繁琐但是我觉得这样很精准,要调用哪一个就调用哪一个,省内存,快qwq)ps:自己找的理由安慰自己

1.2LED.H

#ifndef _LED_H
#define _LED_H

void LED_Init(GPIO_TypeDef* Port/*端口*/,uint16_t Pin/*引脚*/)//初始化端口
	
void LED(GPIO_TypeDef* Port/*端口*/,uint16_t Pin/*引脚*/,BitAction Mode/*高低电平*/)操作端口
//Bitval=Bit_RESET(低电频)or =Bit_SET(高电频)

#endif

就是这么的简单,函数写好直接复制粘贴函数到这里面就可以了 

2.按键

想法是通过按键操作LED的熄灭或者点亮,思路就很简单了,因为按键按下去会输出1,所以但读取到1时就点亮LED

2.1KEY.c

#include "stm32f10x.h"                  // Device header

void Button_Init(GPIO_TypeDef* Port/*端口*/,uint16_t Pin/*引脚*/)
{
	if     (Port == GPIOA ){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);}//开启时钟
	else if(Port == GPIOB ){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);}
	else if(Port == GPIOC ){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);}
	else if(Port == GPIOD ){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);}
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = Pin;
	GPIO_InitStructure.GPIO_Speed =3;
	GPIO_Init(Port , &GPIO_InitStructure);
}

uint8_t Button_ReturnNum(GPIO_TypeDef* Port/*端口*/,uint16_t Pin/*引脚*/)
{
	uint8_t Button_ReturnNum=0;
	if(GPIO_ReadInputDataBit(Port,Pin)==0)
	{
		//delay_ms(20);
		while(GPIO_ReadInputDataBit(Port,Pin)==0){};//一直按下不松手
		//delay_ms(20);
		Button_ReturnNum=1;
	}
	return Button_ReturnNum;
}


是的,跟LED的差不多.......

2.2KEY.h

#ifndef _KEY_H
#define _KEY_H

void Button_Init(GPIO_TypeDef* Port/*端口*/,uint16_t Pin/*引脚*/)//初始化端口
	
uint8_t Button_ReturnNum(GPIO_TypeDef* Port/*端口*/,uint16_t Pin/*引脚*/)//按下按键对于引脚返回1


#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值