接触STM32有一段时间了,也算是简单入了门,但由于一些原因,今天才来写本应该是入门级的按键相关程序,分为扫描模式和中断模式
MCU:STM32F334C8
1.扫描模式
首先配置按键引脚为上拉输入模式,根据原理图按键接PA0,按键没有按下的时候引脚输入为低电平0,按键按下输入高电平1,松开又回到低电平0
然后在死循环中不断读取相应引脚的输入状态,并根据返回结果判断按键是否按下,做出相应处理
下面的代码完成的功能是:按键第一次按下,点亮灯,再按一次,熄灭,重复。
#include "Userkey.h"
u8 flag=0;
void key_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
void key_scanmode(void)
{
key_GPIO_Config();
while(1)
{
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0))
{
flag =~flag;
if(flag)//第1?3?5,,次按下
{
GPIO_SetBits(GPIOB, GPIO_Pin_6);
}
else//第2?4?6,,,次按下
{
GPIO_ResetBits(GPIOB, GPIO_Pin_6);
}
}
}
}
2.中断模式
第一步和上面相同,将接按键的引脚配置为上拉输入,然后配置相应中断,PA0对应外部中断0
功能:按键按下,点亮LED并向串口发送按键按下到PC,按键松开,关掉LED并发送按键松开
void key_interruptmode(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStruct;
key_GPIO_Config();
NVIC_InitStruct.NVIC_IRQChannel =EXTI0_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);
EXTI_ClearITPendingBit(EXTI_Line0);
EXTI_InitStructure.EXTI_Line=EXTI_Line0;
EXTI_InitStructure.EXTI_LineCmd =ENABLE;
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising_Falling;
EXTI_Init(&EXTI_InitStructure);
}
void EXTI0_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line0))
{
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0))//按键按下
{
GPIO_SetBits(GPIOB, GPIO_Pin_6);
printf("按键按下\n"); //串口打印状态
}
else //按键松开
{
GPIO_ResetBits(GPIOB, GPIO_Pin_6);
printf("按键松开\n");
}
}
EXTI_ClearITPendingBit(EXTI_Line0);
}
注:如果要实现和1一样的功能,将EXTI_Trigger改为上升沿或者下降沿,再改一下中断处理函数即可
关键字:STM32 按键扫描 按键中断 外部中断
引用地址:
STM32按键扫描/按键中断/外部中断
推荐阅读最新更新时间:2024-03-16 15:39
stm32+sdio+文件系统 源码分析
一、概述 1、目的 在移植之前,先将源代码大概的阅读一遍,主要是了解文件系统的结构、各个函数的功能和接口、与移植相关的代码等等。 2、准备工作 在官方网站下载了0.07c版本的源代码,利用记事本进行阅读。 二、源代码的结构 1、源代码组成 源代码压缩包解压后,共两个文件夹,doc是说明,src里就是代码。src文件夹里共五个文件和一个文件夹。文件夹是option,还有00readme.txt、diskio.c、diskio.h、ff.c、ff.h、integer.h。对比网上的文章,版本已经不同了,已经没有所谓的tff.c和tff.h了,估计现在都采用条件编译解决这个问题了,当然文件更少,可能编译选项可能越复杂。 2、0
[单片机]
基于STM32单片机利用ST库函数设置Systick
Systick是STM32中特有的系统时钟SysTIck有两个功能:1.可以产生精确延时;2.可以提供给系统一个单独的时钟节拍。一般延时程序: DELAY(N) { for( i=0 ; i《=x ; i++ ) ; } 对于STM32系列的微处理器中,执行一条指令只需要几十ns,进行for循环时,要实现N毫秒延时,那么x的意义非常大,而且由于系统频率的宽广,很难计算出延时N毫秒的精确值,那么在一些高速电路中,是不允许的,容易出现问题,很难查找出来。尤其在液晶驱动中,延时要求非常精确。针对STM32的处理器中,需要重新设计一个方法实现该功能,来代替DELAY(N)延时; cortex-m3中包含了一个SysTI
[单片机]
STM32管脚复用的理解
STM32中定时器3为例。重点是Full remap和Partial remap的理解。 1.管脚功能图。 2.完全复用和部分复用说明。 3.相关配置说明,时钟说明AFIO和管脚复用FullRemap。
[单片机]
STM32的ADC获取电池电压
adc.c #include adc.h void Adc_Init(void) { ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1 , ENABLE ); //使能ADC1通道时钟 RCC_ADCCLKConfig(RCC_PCLK2_Div6); //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M //PA4 作为模拟通道输入引脚
[单片机]
STM32大行当道,Microchip却集中发布60余款8位MCU
为满足对 8 位微控制器 (MCU) 的需求,Microchip 一下子推出了 5 个新系列、超过 60 款器件,涵盖PIC 和 AVR。 嵌入式设计正成为电子产品越来越流行和重要的元素。就目前而言,您可以在市场上的绝大多数电子和消费设备中找到 MCU。 支持种类繁多的嵌入式设备需要一个多功能的市场,提供满足大多数应用需求的产品。为了满足这一需求,Microchip 最近发布了五个全新的 8 位 PIC 和 AVR MCU 系列,总计超过 60 款器件。 在本文中,我们将介绍 8 位 MCU,它们为何如此重要,以及 Microchip 的五个新系列带来了什么。 单片机位宽 由于 MCU 可用于许多不同的应用,因
[单片机]
串行通信 软件仿真STM32与74LS164通信
1、串行通信 2、常见的4种串行通信标准 3、对74LS164芯片的介绍 74LS164:串行转并行芯片,内部是1个8位的移位寄存器组成,由8个D触发器组成 缺点是:不带锁存寄存器,移位寄存器移位的过程会表现在164的输出引脚上,容易产生输出干扰。 4、用KEIL4进行软件仿真时,按正常步骤建立工程,然后在下图位置按照下图设置即可。 5、软件仿真:STM32与74LS164进行通信的程序如下: /**************************************************************************************************
[单片机]
详解STM32的PWM输出及频率和脉宽(占空比)的计算
一、stm32的pwm输出引脚是使用的IO口的复用功能。 二、T2~T5这4个通用定时器均可输出4路PWM——CH1~CH4。 三、我们以tim3的CH1路pwm输出为例来进行图文讲解(其它类似),并在最后给出tim3的ch1和ch2两路pwm输出的c代码(已在STM32F103RBT6上测试成功,大家放心使用!)。 四、给出了PWM频率和占空比的计算公式。 步骤如下: 1、使能TIM3时钟 RCC- APB1ENR |= 1 1; 2、配置对应引脚(PA6)的复用输出功能 GPIOA- CRL &= 0XF0FFFFFF;//PA6清0 GPIOA- CRL |= 0X0B000000;//复用功能输出(推挽50MHz
[单片机]
使用VSCode搭建STM32开发环境
首先附上一张VS Code图一直都喜欢这种,黑色主题感觉高大上。 一、需要的软件和工具。 下载最新版VS Code: 安装好插件,具有良好的代码补全与调试功能。 “VS Code下载地址:https://code.visualstudio.com/” 下载 LLVM:用于代码补全,其实可以理解为 Clang。因为VS Code 中“C/C++”插件的自动补全功能不太好用。STM32中好多库函数都补全不出来。记得按照好之后,将路径添加到环境变量里。 “LLVM下载地址:http://releases.llvm.org/download.html” 下载安装 Git for Windows: 提供Git支持和MINGW64指令终端
[单片机]