历史上的今天
返回首页

历史上的今天

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

正在发生

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

2019-09-03 来源:eefocus

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


推荐阅读

史海拾趣

Alps Alpine Co Ltd公司的发展小趣事

Alps Alpine Co., Ltd.是一家总部位于日本的跨国电子制造公司,专注于设计和制造汽车电子、消费电子和工业电子产品。以下是关于Alps Alpine公司发展的五个相关故事:

  1. 公司合并:Alps Electric Co., Ltd.和Alpine Electronics, Inc.于2019年进行了合并,正式成立了Alps Alpine Co., Ltd. 这一合并为两家公司带来了更强大的整合资源和技术实力,使得Alps Alpine能够在全球范围内提供更多样化的电子解决方案。

  2. 汽车电子领域的发展:Alps Alpine在汽车电子领域拥有丰富的经验和技术积累。公司致力于开发汽车内部电子系统,包括车载娱乐系统、导航系统、车载通信系统、驾驶辅助系统等。随着汽车智能化和互联网化的发展,Alps Alpine不断推出创新产品,满足汽车制造商和消费者对智能驾驶体验的需求。

  3. 消费电子产品的多样化:除了汽车电子,Alps Alpine还在消费电子领域拥有广泛的产品线。公司的产品涵盖了手机、平板电脑、摄像机、音响设备等多个终端设备,并不断推出新品,以满足消费者对功能性和设计性的需求。

  4. 工业电子市场的拓展:Alps Alpine在工业电子领域也取得了长足的发展。公司的产品被广泛应用于工业自动化、机器人技术、医疗设备、能源管理等领域,为各行各业提供高性能、可靠的电子解决方案。

  5. 技术创新与研发投入:作为一家技术驱动的企业,Alps Alpine不断加大对研发的投入,致力于技术创新和产品优化。公司拥有强大的研发团队和先进的研发设施,在各个领域持续推动技术进步,提升产品竞争力。

以上是关于Alps Alpine Co., Ltd.发展的五个相关故事,这些故事展示了公司在合并整合、汽车电子、消费电子、工业电子和技术创新方面的发展历程,以及其在电子行业中的重要地位和影响力。

AAEON公司的发展小趣事

AAEON公司是一家总部位于台湾的全球性电子公司,专注于提供嵌入式计算解决方案和人工智能应用平台。以下是关于该公司发展的五个相关故事:

  1. 公司成立和初期发展: AAEON公司成立于1992年,最初主要从事电脑主板的设计和生产。公司在成立初期致力于提供高质量、高性能的计算解决方案,迅速在台湾本地市场建立了良好的声誉。

  2. 技术创新和产品多样化: 随着技术的发展和市场需求的变化,AAEON开始进行技术创新,并逐步扩展产品线。公司不仅持续改进和推出新型的嵌入式计算产品,还积极涉足人工智能领域,开发智能边缘计算平台和解决方案。

  3. 国际市场拓展: 为了进一步扩大业务规模,AAEON积极拓展国际市场。公司与全球各地的合作伙伴建立了广泛的合作关系,产品销售网络覆盖了亚洲、欧洲、北美和其他地区。公司还在一些国家设立了分支机构和办事处,加强了对当地市场的开拓和服务。

  4. 合作伙伴关系和生态系统建设: AAEON与众多的合作伙伴建立了紧密的合作关系,共同推动产品的创新和市场拓展。公司与主流的芯片厂商、系统集成商、软件开发商等建立了长期稳定的合作关系,共同打造了完善的生态系统。

  5. 未来展望和发展方向: AAEON将继续致力于技术创新和产品升级,加强在嵌入式计算和人工智能领域的领先地位。公司将不断推出符合市场需求的新产品和解决方案,为客户提供更优质的服务和支持。同时,AAEON将继续加强与合作伙伴之间的合作,共同推动行业的发展和进步。

Crosspoint Solutions公司的发展小趣事

随着技术的不断更新换代,人才成为电子企业竞争的核心要素。Crosspoint Solutions公司高度重视人才培养和引进工作,通过校园招聘、社会招聘等多种渠道吸引优秀人才加入。同时,公司还建立了完善的培训体系,不断提升员工的技能水平和创新能力。这些优秀的人才为公司的发展提供了强有力的支撑。

DIALIGHT公司的发展小趣事

DIALIGHT公司一直专注于工业LED照明领域的发展。他们深入了解工业空间照明的需求和挑战,设计了一系列专为工业应用而定制的LED照明产品。这些产品不仅易于安装和维护,而且能在恶劣的环境下持续使用。此外,DIALIGHT还提供集成系统解决方案,帮助客户降低能源成本、维护成本和碳足迹,同时提高设施的安全性和生产力。通过不断创新和优质服务,DIALIGHT在工业LED照明领域赢得了广泛的认可和信赖。

Dynawave Incorporated公司的发展小趣事

在快速发展的过程中,Dynawave意识到企业文化的重要性。他们注重培养员工的团队合作精神和创新能力,鼓励员工积极参与公司的各项活动。同时,公司还建立了完善的激励机制和福利制度,为员工提供了良好的工作环境和发展空间。这些举措增强了员工的归属感和忠诚度,为公司的长期发展奠定了坚实的基础。

永丰盈(CST)公司的发展小趣事

深圳市永丰盈电子有限公司(CST)成立于2003年,初始阶段,公司只有几名员工和几台设备,专注于电子接插件产品的生产与销售。在创始人坚定的信念和团队不懈的努力下,CST逐步在市场上崭露头角。公司秉持“诚信、踏实、齐心、努力”的经营理念,通过严格的质量控制和持续的技术创新,赢得了客户的信任。

问答坊 | AI 解惑

一种数字集成电路测试系统的设计

摘要:介绍了一种数字集成电路测试系统的工作原理、组成。提出了系统的软硬件设计方案。该系统基于自定义总线结构,可测试电平范围宽。   关键词:数字集成电路 测试功能 测试通道板 精密测量单元   随着数字集成电路的广泛应用,测试系统就显 ...…

查看全部问答>

建议:坛里面组织LM3S8962开发板的朋友,对TI的驱动程序仔细研读

分配有开发板的朋友,每月提交一篇关于LM3S8962的使用心得。其实最好还是,像周立功那样,对所有的驱动程序进行分析验证,最后形成使用习惯,分享给广大学习者。这个任务很重,建议统一论坛组织,是一个长期的工作。这工作做好了,以后利用LM3S系列 ...…

查看全部问答>

頂一下我的編程網吧

頂一下我的編程網吧 www.kingofcoders.com…

查看全部问答>

渥瑞达“3G移动开发”免费试听课于北京交通大学举行,欢迎大家光临!

渥瑞达“3G移动开发”免费试听课于北京交通大学举行,欢迎大家光临! 渥瑞达“3G移动开发”免费试听课于北京交通大学举行,欢迎大家光临! 详情请参见 www.neworigin.net 同时欢迎大家与我们的609期学员交流!这期学员已与2月11日毕业 ...…

查看全部问答>

安装ADS_1.2时的问题?

当我安装ADS_1.2时有个界面让我输入“the temporary license key”我没有找到,不知从哪里找。我已发那封邮件,可是没有给我回。谢谢!…

查看全部问答>

电容三点式震荡电路『紧急求教』

这个震荡电路,一直调不出波形。不知道什么有什么错误之处。以前一样的电路调出过。不知道现在怎么出不来了。请大家帮忙看看。谢谢1…

查看全部问答>

CCS加载中的一些问题的讨论

本帖最后由 dontium 于 2015-1-23 13:34 编辑 你好,我自己开发了一块6711的板子,我在用CCS LOAD PROGRAM 时候总是LOAD不进去,错误提示为: “FILE hello.out does not match the target endianness,not loaded.Check build options,or use th ...…

查看全部问答>

2530加了2591 怎么样测量2530端输出了数据向2591

2530加了2591   怎么样测量2530端输出了数据向2591 …

查看全部问答>

用VHDL实现LMS算法的程序

急求VHDL实现lms算法的程序 …

查看全部问答>