历史上的今天
今天是: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亮,再按下灭,如此可以实现控制操作。
上一篇:STM32几种IO设置模式
下一篇:STM32学习记录之GPIO篇
史海拾趣
|
处理PFILE_BOTH_DIR_INFORMATION可以实现文件隐藏,可否实现添加文件呢?? (PFILE_BOTH_DIR_INFORMATION)Irp->UserBuffer… 查看全部问答> |
|
我在evc中编写了一个简单的tcp socket聊天程序,基于dialog的,在界面上添加了三个edit控件,分别用来存放接收信息,ip,发送信息。每个edit控件对应了一个变量,ip对应的变量是m_ip。在点击发送按钮的事件里要获得发送目的地的ip。 & ...… 查看全部问答> |
|
我建了个单文档工程,想在 MyView 上创建一个窗,窗口的 dwStyle 若指定为 WS_CHILD | WS_VISIBLE ,在窗口上着色后 该窗口无法显示颜色 只有框架的轮廓 若将 dwStyle 只指定为 WS_CHILD 则 能显示窗口 且也可以绘上颜色 若为这样就不 ...… 查看全部问答> |
|
我用的是 索爱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 然后 ...… 查看全部问答> |
|
问题描述: 我在学习WindowsWDM设备驱动程序开发指南一书的时候,尝试编译其下面的范例程序wdm1,但在build -cZ时,总是提示说pnp.obj recomplie问题,我将source文件里面dispach.cpp和pnp.cpp置换之后,又提示说dispach.obj问题。 提 ...… 查看全部问答> |
|
菜鸟求助,为什么我用TLC2543A/D转换测电压值跳动的很厉害? 值跳动的很厉害,而且幅度比较大,都快有0.1V了,是程序问题么? unsigned int read2543(unsigned char port) { unsigned int ad=0; unsigned int i=0; &nbs ...… 查看全部问答> |
|
工作中遇到的有源滤波器问题(图中的所有元器件的值不记得了,没有标出。运放都是同相输入的,5V单电源供电。红色框里的两个电阻阻值相等): 差分信号输入,经过无源滤波器和有源滤波器过后,输出信号。 有几个问题不明白: 1.为什么要把运放的 ...… 查看全部问答> |




