历史上的今天
返回首页

历史上的今天

今天是:2024年09月06日(星期五)

正在发生

2018年09月06日 | STM32之GPIO按键实验

2018-09-06 来源:eefocus

实验板:带有按键的Stm32开发板一块,本人用得是Open107V实验板,型号是107的

库函数:STM32官方3.5的库

其他材料:ST-LINK、跳线若干

实验原理:按键实验和LED实验类似, GPIO点灯是向led的pin脚输出高低电平, 而按键则是向pin口输入高低电平。 对于按键有两种输入模式可以选择, 一,采用上拉输入模式,二,采用浮动浮空输入模式,上拉输入模式在没有按键按下的时候是默认是高电平。符合这个要求。原理图如下:

实验描述:PE5连接到key1,用扫描的方式查询是否有按键按下,key1按下时,LED1状态取反。

库文件:startup/start_stm32f10x_cl.s

              CMSIS/core_cm3.c

              CMSIS/system_stm32f10x.c

               FWlib/stm32f10x_gpio.c

               FWlib/stm32f10x_rcc.c

用户文件:USER/main.c

                  USER/ stm32f10x_it.c

                  USER/led.c

                  USER/key.c

首先配置好工程环境,添加h头文件,接着初始化配置GPIO

******************************led.c******************************

#include"led.h"

void LED_GPIO_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3 | GPIO_Pin_4 |GPIO_Pin_5;
 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
 GPIO_Init(GPIOC,&GPIO_InitStructure);
 GPIO_SetBits(GPIOC,GPIO_Pin_3 | GPIO_Pin_4 |GPIO_Pin_5);
}

****************************led.h**********************************

#ifndef __LED_H
#define __LED_H
#include "stm32f10x.h"
#define ON 1
#define OFF 0
#define LED1(a) if(a) \
     GPIO_SetBits(GPIOC,GPIO_Pin_3);\
      else            \
   GPIO_ResetBits(GPIOC,GPIO_Pin_3)
#define LED2(a) if(a) \
     GPIO_SetBits(GPIOC,GPIO_Pin_4);\
      else            \
   GPIO_ResetBits(GPIOC,GPIO_Pin_4)   
#define LED3(a) if(a) \
     GPIO_SetBits(GPIOC,GPIO_Pin_5);\
      else            \
   GPIO_ResetBits(GPIOC,GPIO_Pin_5) 
void LED_GPIO_Config(void);
#endif             

********************************key.c******************************

#include"led.h"
void Key_GPIO_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);
 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
 GPIO_Init(GPIOE,&GPIO_InitStructure);
 
}

******************************main.c****************************

#include "stm32f10x.h"
#include "led.h"
#define KEY_ON 0
#define KEY_OFF 1
void Delay(__IO u32 nCount);
u8 Key_Scan(GPIO_TypeDef* GPIOx,u16 GPIO_Pin);

int main(void)
{
  LED_GPIO_Config();
 LED1(ON);
 
 /*config key*/
 Key_GPIO_Config();
 //GPIO_SetBits(GPIOC,GPIO_Pin_3);
 while(1)
 {
  if(Key_Scan(GPIOE,GPIO_Pin_5)==KEY_ON)
  {
     /*config key*/
   GPIO_WriteBit(GPIOC,GPIO_Pin_3,(BitAction)((1-GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_3))));
  }
 }
}

u8 Key_Scan(GPIO_TypeDef* GPIOx,u16 GPIO_Pin)
{
  
 if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)==KEY_ON)
  {
      Delay(0x7ffff);
        if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)==KEY_ON)
     {
        while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)==KEY_ON);
      return KEY_ON;
     }
     else
      return KEY_OFF;
  }
  else
   return KEY_OFF;
}

void Delay(__IO u32 nCount)
{
   for(;nCount != 0; nCount--);
}

实验中采用的是3.5版本的库,上电后,启动文件已经调用了SystemInit()将我们的系统时钟SYSCLK配置为72MHZ。进入mian函数,第一步先调用了在LED灯例程中编写的GPIO_Config(),配置为LED用到的I/O。再使用LED1(ON)宏把LED设置为点亮状态。为了使用LED的工程代码,将led.c和led.h文件也添加到工程中直接调用,将led.c添加到工程中就可以了。在main函数中,检测到有按键按下,就开始执行LED反转的操作。

        最后的实验现象是将配套的STM32开发板供电后,插上ST-LINK,将编译好的程序下载到开发板,LED1亮,按下按键时LED1灭,再按下按键LED1亮,再按下灭,如此可以实现控制操作。


推荐阅读

史海拾趣

AMSCO [Austria micro systems AG]公司的发展小趣事

Austria Micro Systems AG(AMS)是一家总部位于奥地利的半导体制造商,专注于模拟IC、传感器和感应器解决方案。以下是 AMS 公司发展的五个相关故事:

  1. 创立与初期发展:AMS 公司成立于1981年,最初是一家小型的半导体公司,成立之初主要从事晶圆制造和生产模拟集成电路(IC)。在公司创始人的领导下,AMS 迅速崛起,凭借着其创新能力和对技术的独特洞察力,迅速在半导体市场上占据了一席之地。

  2. 技术创新与产品扩展:随着时间的推移,AMS 公司不断进行技术创新,并不断扩展其产品线。公司致力于开发高性能、低功耗的模拟IC和传感器解决方案,以满足汽车、工业、医疗等各个领域的客户需求。AMS 的产品涵盖了光学传感器、环境传感器、声学传感器等多个领域。

  3. 全球化发展与市场拓展:AMS 公司通过不断拓展全球市场,加强与客户和合作伙伴的合作关系,实现了快速的业务增长。公司在欧洲、亚洲和美洲设立了多个销售办事处和生产基地,建立了完善的全球供应链和销售网络。公司的产品销售网络覆盖了全球范围,得到了国内外客户的广泛认可。

  4. 收购与合并:为了进一步壮大自身实力和拓展市场份额,AMS 公司通过收购和合并等方式不断强化自身。公司先后收购了一些技术领先的公司,扩大了产品线和市场份额。此举进一步提升了公司在模拟IC和传感器领域的竞争优势,加速了公司的业务增长。

  5. 持续创新与未来展望:AMS 公司将继续致力于技术创新和产品研发,不断提升产品性能和品质水平。公司将关注新兴技术和市场趋势,积极布局未来的发展方向,包括人工智能、物联网、汽车电子等领域。同时,公司还将加强与客户和合作伙伴的合作,共同推动行业的发展和进步。

ALCOA公司的发展小趣事

近年来,随着环保意识的提高,ALCOA积极推动可持续发展和环保倡议。公司致力于减少生产过程中的能源消耗和废弃物排放,同时也在研发更环保的铝材和生产工艺。这些努力不仅提升了公司的社会形象,也为其在电子行业中的长期发展奠定了坚实的基础。

以上五个故事,只是ALCOA公司发展历程中的一部分。然而,这些故事足以展现出这家公司在电子行业中的卓越成就和持续创新的精神。

CDE [ CORNELL DUBILIER ELECTRONICS ]公司的发展小趣事

近年来,随着新能源市场的蓬勃发展,CDE公司敏锐地抓住了这一机遇。公司积极参与军事和能源应用的高压直流链路电容器市场,并成功推出了针对EV快速充电的高压直流链路电容器。这一产品的推出不仅满足了市场对高效、可靠电容器的需求,也为CDE在新能源领域的发展奠定了坚实基础。

Filtran Ltd公司的发展小趣事

近年来,随着5G、物联网等技术的快速发展,电子行业面临着前所未有的挑战和机遇。Filtran Ltd深知唯有不断创新才能保持竞争力。公司加大了在研发方面的投入,建立了多个专项研究小组,专注于新技术、新材料和新工艺的探索。通过持续创新,Filtran Ltd成功推出了多款符合市场需求的新产品,进一步巩固了其在电子行业中的地位。同时,公司还积极拥抱数字化转型,利用大数据、人工智能等先进技术提升运营效率和服务水平。

DRI Relays Inc公司的发展小趣事

随着全球环保意识的提高,DRI Relays Inc公司积极响应环保号召,践行绿色环保理念。公司采用环保材料和节能技术,减少生产过程中的能源消耗和废弃物排放。同时,公司还注重产品的回收和再利用,为客户提供环保解决方案。这些举措不仅提升了公司的社会形象,还为公司带来了更多的商业机会和发展空间。

Eby Electro Inc公司的发展小趣事

进入21世纪后,电子行业竞争日益激烈,Eby Electro Inc意识到必须依靠技术创新才能保持竞争力。公司投入大量资金进行研发,成功推出了一系列具有自主知识产权的电子产品。其中,一款高效能、低功耗的集成电路芯片,因其出色的性能而受到市场的广泛认可。这次技术创新不仅为公司带来了可观的收益,也为公司在行业内树立了良好的技术形象。

问答坊 | AI 解惑

evc 中tcp socket通信

我在evc中编写了一个简单的tcp socket聊天程序,基于dialog的,在界面上添加了三个edit控件,分别用来存放接收信息,ip,发送信息。每个edit控件对应了一个变量,ip对应的变量是m_ip。在点击发送按钮的事件里要获得发送目的地的ip。    & ...…

查看全部问答>

100分求教 问题:WinCE 中窗口无法显示

我建了个单文档工程,想在 MyView 上创建一个窗,窗口的 dwStyle 若指定为 WS_CHILD | WS_VISIBLE ,在窗口上着色后 该窗口无法显示颜色 只有框架的轮廓 若将 dwStyle 只指定为 WS_CHILD 则 能显示窗口 且也可以绘上颜色  若为这样就不 ...…

查看全部问答>

GPRS 拨号总是报 718 错误是怎么回事

我用的是 索爱GC79 GPRS/GSM 模块 用此GPRS模块自带的软件进行拨号是可以的 先进超级终端设置如下: at+cgdcont=1,\"IP\",\"CMNET\" at+cgclass=\"B\" at+cfun=1 at+cgact=1,1 查看状态: at+cgact? 1,1 at+cgatt? 1 at+cgreg? 0,1 然后 ...…

查看全部问答>

vs2003与ddk2000编译问题

问题描述:   我在学习WindowsWDM设备驱动程序开发指南一书的时候,尝试编译其下面的范例程序wdm1,但在build -cZ时,总是提示说pnp.obj recomplie问题,我将source文件里面dispach.cpp和pnp.cpp置换之后,又提示说dispach.obj问题。 提 ...…

查看全部问答>

STM32的FLASH可以模拟为EEPROM么?

                                 请问,STM32的FLASH可以模拟为EEPROM么?…

查看全部问答>

菜鸟求助,为什么我用TLC2543A/D转换测电压值跳动的很厉害?

值跳动的很厉害,而且幅度比较大,都快有0.1V了,是程序问题么? unsigned int read2543(unsigned char port) {         unsigned int ad=0;         unsigned int i=0;       &nbs ...…

查看全部问答>

S40 电路板显微检测仪

 S40 电路板显微检测仪  …

查看全部问答>

lannchpad下一期的名单啥时候出来?

RT我做了好几个礼拜了- -改版之前做的- -…

查看全部问答>

压控电源型滤波器问题

工作中遇到的有源滤波器问题(图中的所有元器件的值不记得了,没有标出。运放都是同相输入的,5V单电源供电。红色框里的两个电阻阻值相等): 差分信号输入,经过无源滤波器和有源滤波器过后,输出信号。 有几个问题不明白: 1.为什么要把运放的 ...…

查看全部问答>