历史上的今天

今天是:2024年09月03日(星期二)

正在发生

2019年09月03日 | STM32F103_GPIO输入输出快速初始化

发布者:数字小巨人 来源: eefocus关键字:STM32F103  GPIO  输入输出  快速初始化 手机看文章 扫描二维码
随时随地手机看文章

main.c文件 


#include "sys.h"

#include "delay.h"

#include "gpio.h"


 

uint8_t GetCNState;

int main(void)                    

     delay_init();            //延时函数初始化

     GPIO_Quick_Init(GPIOA_Pin0,GPIO_Mode_Out_PP,1);       //初始化A0为推挽输出模式,开始电平为1

     GPIO_Quick_Init(GPIOB_Pin1,GPIO_Mode_Out_PP,0);      //初始化B1为推挽输出模式, 开始电平为0

     GPIO_Quick_Init(GPIOC_Pin2,GPIO_Mode_IPU,1);             //初始化C2为上拉输入模式

 

     Write_GPIOx_Pinx(GPIOA_Pin0,0);                                       //A0输出0 

     GetCNState = Read_GPIOx_Pinx(GPIOB_Pin1);                  //读端口B1的电平

     while(1)       

     {

  

     }

}


 


 gpio.c文件


#include "gpio.h"

#include "delay.h"

 

 

/**************************************

功能 :GPIO快速初始化

参数1:选择GPIO

参数2:选择模式

    GPIO_Mode_AIN

    GPIO_Mode_Out_PP

    GPIO_Mode_IPD

    GPIO_Mode_IPU

    GPIO_Mode_Out_OD

    GPIO_Mode_Out_PP

    GPIO_Mode_AF_OD

    GPIO_Mode_AF_PP

参数3:IO口初始状态

**************************************/

 

void GPIO_Quick_Init(GPIOx_Pinx_enum GPIOx_Pinx, GPIOMode_TypeDef GPIO_Mode,u8 val) 

{

 static int Remap_SWJ_Disable = 0;

 GPIO_InitTypeDef  GPIO_InitStructure;

 GPIO_TypeDef* GPIOx;

 uint16_t GPIO_Pin;

 

  Check_GPIOx_Pinx(GPIOx_Pinx,&GPIOx,&GPIO_Pin);


 


 if     (GPIOx == GPIOA)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //使能端口时钟

 else if(GPIOx == GPIOB)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  //使能端口时钟

 else if(GPIOx == GPIOC)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);  //使能端口时钟

 else if(GPIOx == GPIOD)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);  //使能端口时钟

 else if(GPIOx == GPIOE)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);  //使能端口时钟

 else if(GPIOx == GPIOF)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE);  //使能端口时钟

 else if(GPIOx == GPIOG)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE);  //使能端口时钟

 

 if( ((GPIOx == GPIOB && GPIO_Pin == GPIO_Pin_3)  || (GPIOx == GPIOB && GPIO_Pin == GPIO_Pin_4)  ||

     (GPIOx == GPIOA && GPIO_Pin == GPIO_Pin_13) || (GPIOx == GPIOA && GPIO_Pin == GPIO_Pin_14) ||

      (GPIOx == GPIOA && GPIO_Pin == GPIO_Pin_15)) && Remap_SWJ_Disable == 0)

 {

  Remap_SWJ_Disable = 1;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);  //使能端口时钟

  GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);

 }

 

 GPIO_InitStructure.GPIO_Pin   = GPIO_Pin;     

 GPIO_InitStructure.GPIO_Mode  = GPIO_Mode;         

 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz

 GPIO_Init(GPIOx, &GPIO_InitStructure);       //根据设定参数初始化

 

 GPIO_WriteBit(GPIOx,GPIO_Pin,(BitAction)val);

}


 



/**************************************

功能 :写GPIO

参数1:选择GPIO

参数2:写入的值

**************************************/

void Write_GPIOx_Pinx(GPIOx_Pinx_enum GPIOx_Pinx,u8 val)

{

 GPIO_TypeDef* GPIOx;

 uint16_t GPIO_Pin;

 

  Check_GPIOx_Pinx(GPIOx_Pinx,&GPIOx,&GPIO_Pin);

 

 GPIO_WriteBit(GPIOx,GPIO_Pin,(BitAction)val);

}


 


/**************************************

功能 :读GPIO

参数1:选择GPIO

返回 :GPIO值

**************************************/

uint8_t Read_GPIOx_Pinx(GPIOx_Pinx_enum GPIOx_Pinx)

{

 GPIO_TypeDef* GPIOx;

 uint16_t GPIO_Pin;

 

 Check_GPIOx_Pinx(GPIOx_Pinx,&GPIOx,&GPIO_Pin);

 

 return (GPIO_ReadInputDataBit(GPIOx,GPIO_Pin));

}


 


void Check_GPIOx_Pinx(GPIOx_Pinx_enum GPIOx_Pinx,GPIO_TypeDef** GPIOx,uint16_t* GPIO_Pin)   

{

 if(GPIOx_Pinx < 16*1)        *GPIOx = GPIOA;

 else if(GPIOx_Pinx < 16*2)   *GPIOx = GPIOB;

 else if(GPIOx_Pinx < 16*3)   *GPIOx = GPIOC;

 else if(GPIOx_Pinx < 16*4)   *GPIOx = GPIOD;

 else if(GPIOx_Pinx < 16*5)   *GPIOx = GPIOE;

 else if(GPIOx_Pinx < 16*6)   *GPIOx = GPIOF;

 else if(GPIOx_Pinx < 16*7)   *GPIOx = GPIOG;

 

 if(GPIOx_Pinx % 16 == 0)        *GPIO_Pin = GPIO_Pin_0;

 else if(GPIOx_Pinx % 16 == 1)   *GPIO_Pin = GPIO_Pin_1;

 else if(GPIOx_Pinx % 16 == 2)   *GPIO_Pin = GPIO_Pin_2;

 else if(GPIOx_Pinx % 16 == 3)   *GPIO_Pin = GPIO_Pin_3;

 else if(GPIOx_Pinx % 16 == 4)   *GPIO_Pin = GPIO_Pin_4;

 else if(GPIOx_Pinx % 16 == 5)   *GPIO_Pin = GPIO_Pin_5;

 else if(GPIOx_Pinx % 16 == 6)   *GPIO_Pin = GPIO_Pin_6;

 else if(GPIOx_Pinx % 16 == 7)   *GPIO_Pin = GPIO_Pin_7;

 else if(GPIOx_Pinx % 16 == 8)   *GPIO_Pin = GPIO_Pin_8;

 else if(GPIOx_Pinx % 16 == 9)   *GPIO_Pin = GPIO_Pin_9;

 else if(GPIOx_Pinx % 16 == 10)  *GPIO_Pin = GPIO_Pin_10;

 else if(GPIOx_Pinx % 16 == 11)  *GPIO_Pin = GPIO_Pin_11;

 else if(GPIOx_Pinx % 16 == 12)  *GPIO_Pin = GPIO_Pin_12;

 else if(GPIOx_Pinx % 16 == 13)  *GPIO_Pin = GPIO_Pin_13;

 else if(GPIOx_Pinx % 16 == 14)  *GPIO_Pin = GPIO_Pin_14;

 else if(GPIOx_Pinx % 16 == 15)  *GPIO_Pin = GPIO_Pin_15;

}


 


gpio.h文件


 


#ifndef __GPIO_H_

#define __GPIO_H_     

#include "sys.h"


typedef enum 

{

    GPIOA_Pin0 = 0,GPIOA_Pin1,GPIOA_Pin2,GPIOA_Pin3,GPIOA_Pin4,GPIOA_Pin5,GPIOA_Pin6,GPIOA_Pin7,GPIOA_Pin8,GPIOA_Pin9,GPIOA_Pin10,GPIOA_Pin11,GPIOA_Pin12,GPIOA_Pin13,GPIOA_Pin14,GPIOA_Pin15,

    GPIOB_Pin0,GPIOB_Pin1,GPIOB_Pin2,GPIOB_Pin3,GPIOB_Pin4,GPIOB_Pin5,GPIOB_Pin6,GPIOB_Pin7,GPIOB_Pin8,GPIOB_Pin9,GPIOB_Pin10,GPIOB_Pin11,GPIOB_Pin12,GPIOB_Pin13,GPIOB_Pin14,GPIOB_Pin15,

    GPIOC_Pin0,GPIOC_Pin1,GPIOC_Pin2,GPIOC_Pin3,GPIOC_Pin4,GPIOC_Pin5,GPIOC_Pin6,GPIOC_Pin7,GPIOC_Pin8,GPIOC_Pin9,GPIOC_Pin10,GPIOC_Pin11,GPIOC_Pin12,GPIOC_Pin13,GPIOC_Pin14,GPIOC_Pin15,

    GPIOD_Pin0,GPIOD_Pin1,GPIOD_Pin2,GPIOD_Pin3,GPIOD_Pin4,GPIOD_Pin5,GPIOD_Pin6,GPIOD_Pin7,GPIOD_Pin8,GPIOD_Pin9,GPIOD_Pin10,GPIOD_Pin11,GPIOD_Pin12,GPIOD_Pin13,GPIOD_Pin14,GPIOD_Pin15,

    GPIOE_Pin0,GPIOE_Pin1,GPIOE_Pin2,GPIOE_Pin3,GPIOE_Pin4,GPIOE_Pin5,GPIOE_Pin6,GPIOE_Pin7,GPIOE_Pin8,GPIOE_Pin9,GPIOE_Pin10,GPIOE_Pin11,GPIOE_Pin12,GPIOE_Pin13,GPIOE_Pin14,GPIOE_Pin15,

    GPIOF_Pin0,GPIOF_Pin1,GPIOF_Pin2,GPIOF_Pin3,GPIOF_Pin4,GPIOF_Pin5,GPIOF_Pin6,GPIOF_Pin7,GPIOF_Pin8,GPIOF_Pin9,GPIOF_Pin10,GPIOF_Pin11,GPIOF_Pin12,GPIOF_Pin13,GPIOF_Pin14,GPIOF_Pin15,

    GPIOG_Pin0,GPIOG_Pin1,GPIOG_Pin2,GPIOG_Pin3,GPIOG_Pin4,GPIOG_Pin5,GPIOG_Pin6,GPIOG_Pin7,GPIOG_Pin8,GPIOG_Pin9,GPIOG_Pin10,GPIOG_Pin11,GPIOG_Pin12,GPIOG_Pin13,GPIOG_Pin14,GPIOG_Pin15,

}GPIOx_Pinx_enum;


void Check_GPIOx_Pinx(GPIOx_Pinx_enum GPIOx_Pinx,GPIO_TypeDef** GPIOx,uint16_t* GPIO_Pin);

void GPIO_Quick_Init(GPIOx_Pinx_enum GPIOx_Pinx, GPIOMode_TypeDef GPIO_Mode,u8 val) ;

void Write_GPIOx_Pinx(GPIOx_Pinx_enum GPIOx_Pinx,u8 val) ;

uint8_t Read_GPIOx_Pinx(GPIOx_Pinx_enum GPIOx_Pinx);         

void Get_Key_Time(GPIOx_Pinx_enum GPIOx_Pinx,long* PressLastTimes,u8 PressCN,u8 IsWait);

#endif


关键字:STM32F103  GPIO  输入输出  快速初始化 引用地址:STM32F103_GPIO输入输出快速初始化

上一篇:STM32应用简章之PWM输出
下一篇:STM32快速初始化引脚 一行代码完成引脚初始化

推荐阅读

2018年8月23日,重庆,机器人集体跳起开场舞蹈迎接参会嘉宾。当日,首届中国国际智能产业博览会在重庆开幕。机器人产业处在转型升级的关键转折点,打造全球生态链条成为行业共识。当前,机器人产业处于科技和产业革命的变革前沿,传感器、大数据、物联网、新材料等前沿技术的综合运用,引发了新的制造模式和智能经济的发展。“机器人不仅应用在制造业,还...
据第一财经消息,华星光电8月30日透露,预计2020年将量产上市多款柔性折叠屏产品。华星光电很早就布局柔性屏幕,早在2017年6月,总投资350亿元的华星光电第6代柔性LTPS-AMOLED显示面板生产线(简称:t4项目)就在武汉开工建设,这是国内第一条主攻折叠显示屏的6代柔性LTPS-AMOLED显示面板生产线。项目设计月产能为4.5万大片玻璃基板,相当于每年可生产116...
和P40系列类似,华为Mate 40系列今年可能推出三款,即Mate 40、Mate 40 Pro和Mate 40 Pro+。  有数码大V在微博爆料称,Mate 40 Pro+的曲率比Mate 40 Pro更大。  当然,结合P40 Pro+的打造思路,Mate 40 Pro+在拍照元器件规格、存储规格、机身材质等方面或亦有不同之处。  至于Mate 40和Mate 40 Pro,外形均采用左上角的胶...
产能短缺、涨价俨然已成为半导体产业的新常态,始于去年的一系列行业乱象至今无解,时程来到第三季度,晶圆代工、封测以及IC设计厂商涨价的消息仍源源不断。那么半导体中游制造环节和下游封测环节齐涨价究竟苦了谁?芯片价格一路高涨又是否意味着半导体迎来了“通货膨胀”时代?制造封测齐涨价以台积电为首的晶圆制造厂近期均传出了涨价的消息。8月25日,...

史海拾趣

问答坊 | AI 解惑

MSP430初级资料分享

刚刚看到一个专于MSP430的个人网站,版主是南航 - 魏小龙 从里面看到了几个MSP430程序设计的初级资料,在这里分享一下 MSP430串口异步通讯原理与实现.pdf MSP430定时器的使用.pdf MSP430简单的端口、显示、中断综合应用.pdf…

查看全部问答∨

看穷忙族有感,这就是我们的明天么?

今天闲逛,在网上看到的这个图片,也许坛子里有人放过,但也顾不得了,因为它可以引出我接下来要谈的话题: 最近一周,是出奇的忙,再加上之前穷忙族的测试,80%和自己都相似,于是心里不禁一阵寒战。 回到家里,赶紧找出了都覆盖了尘土的《 ...…

查看全部问答∨

基于FPGA的步进电机模糊电流控制器设计

我做的毕业设计是关于《基于FPGA的步进电机模糊电流控制器设计》,可是我一点也不懂。有谁是做这个方面研究的,我想请教一下,非常感谢!…

查看全部问答∨

WINCE跑起来了,但启动画面停在logo处,没有跳到WINCE桌面???

我的系统是Centrality Atlas-III+wince 5.0 现象是:如果在OAL层OEMInit中初始化LCD控制器参数,并显示logo,系统启动OK,能进wince桌面;          如果在EBOOT中初始化LCD控制器参数,并显示logo,从打印信息看, ...…

查看全部问答∨

急!电池驱动的问题。

我用的是2450的平台,现在把电池的驱动加上以后,若电池充满电了,即BatteryLifePercent=100%了,系统托盘那电池的图标会不见了!!!若BatteryLifePercent比100%低,则会出来,我该怎么把电池充满电的图标显示出来呢?第二个问题,电池电量降低了 ...…

查看全部问答∨

请问proteus能不能自动加网络标签的

比如说有8个引脚。。 第一个是key1 第二个是key2 如此到key8 proteus有无这个功能。。有的话怎么具体操作是怎么样的呢? …

查看全部问答∨

求助:怎样设计寄存器,存储器这些东西。

我们选修课 计算机体系结构设计与仿真  要用这些东邪,但是 计算机组成原理书上没有这方面的设计,只有alu,控制器这些,我网上也没找到有谁做个这个设计。 问下论坛里有人做这个吗,或者知道这个的引导下。 …

查看全部问答∨

一个按键程序

P1.0~P1.3接行     P1.4~P1.7接列 #include<reg52.h> #define uchar unsigned char #define uint  unsigned int uchar num,temp,num1; uchar i=0,j=0; uchar code table[]={0x02,0X9F,0x25,0x0D,0x99,0x49 ...…

查看全部问答∨

IT Support IT支持工程师

有意请联系pangyuxi@danfoss.com IT Support   IT支持工程师   职位描述/要求: 职位描述: 计算机系统客户端软硬件及相关周边设备的日常维护支持 计算机生产系统的支持 公司局域网的日常维护与支持 公司最终用户的相关培训 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved