隔了好久才写这第二篇,期间重感冒,身体难受大约十天,今天重新写,又踩了好多的坑。
1:首先,按键实验是GPIO口的另一应用,上一次的跑马灯实验是将GPIO口作为输出,此次按键实验是将GPIO口作为输入。
和跑马灯实验实验一样,要启用GPIO口,第一步要做的就是使能GPIO所在的时钟总线,具体库函数操作为:RCC_APB2PeriphClockCmd(GPIOA,ENABLE);
2:接下来说说GPIO作为输入时和输入的不同:
(1):首先需要了解按键是低电平有效还是高电平有效,因为此处需要配置GPIO口的输入模式。大家都知道GPIO口有四种输入模式,四种输出模式(具体请看我的第一篇笔记)。我使用的是STM32F103C8T6,按键s2为低电平有效,故,此处配置输出模式时应为上拉输入模式,即GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
注:关于为什么低电平有效就用上拉输入,这里多讲几句。
首先,上拉电阻是为了保证在没有信号输入的时候,IO口保持高电平,若按键为低电平有效,则没有信号的时候,IO应呈现高电平,所以,此处应设置为上拉输入。
同理,下拉电阻是为了保证在没有信号输入的时候,IO口保持低电平,若按键为高电平有效,则没有信号的时候,IO应呈现低电平。
然后再配置一下IO口引脚,初始化PA0即可。作为输入时,不需要配置速度。
(2)GPIO口各项功能配置完毕之后就是编写按键函数。库函数操作为:GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0);若是很简单要实现按键控制LED灯的功能,只需如下的代码:
这里led灯的转换是通过位带操作的,具体操作是在LED.h里写如下代码:#define LED0 PAout(0)即可
考虑道按键防抖,写了如下的按键扫描函数:
这里在编写主函数的时候还有一个大坑,我很好奇,但是不知道为什么。
这里的按键扫描函数还需要在主函数中声明一次,不然会出现warning : function "KEY_Scan()"declared implaitility.可我明明在头文件里添加了key.h了。。。。
关键字:STM32 学习笔记 按键输入
引用地址:
STM32学习笔记——按键输入
推荐阅读最新更新时间:2024-11-11 15:11
STM32CubeMX学习笔记——STM32H743外部中断
STM32CubeMX配置 STM32CubeMX版本:4.27.0 配置流程: Pinout界面选择并开启需要使用外部中断的引脚 Clock Configuration配置时钟树 Configuration界面配置System 生成工程 Pinout配置 该界面用于配置生成硬件中断的引脚 Clock Configuration配置 开启系统时钟 Configuration 左侧主要系统功能的开启,或中间软件层功能的开启(如:RTOS、JPEG解码器,文件系统等) 右侧是系统及外设模块的具体配置 GPIO 配置生成外部中断的引脚与LED引脚 开启EXTI2、3中断线 NVIC 设置中断向
[单片机]
stm32学习之十
USART,AD与GPIO的温度传感器: 注意的是: 1、ADC_RegularChannelConfig(ADC1,ADC_Channel_16,1,ADC_SampleTime_239Cycles5); 2、ADC_TempSensorVrefintCmd(ENABLE); 依照上一节的程序,可以改写以下,形成现在的程序与效果: add.h和add.h(写成这种方式,原因与上一节一样) add.h的代码: #ifndef _ADD_H #define _ADD_H #include stm32f10x.h //对于12位的ADC,3.3V的ADC值为0xfff,温度为25度时对应的电压值为1.43V即0
[单片机]
关于STM32 DMA的使用
1.DMA的使用范围: DMA(直接存储器存取)提供在外设与存储器之间或者存储器和存储器之间的高速数据传输使用。注意这里的外设指的是32的外设,比如spi、usart、iic、adc等基于APB1 、APB2或AHB时钟的外设,而这里的存储器包括32自身的闪存(flash)或者内存(SRAM)以及外设的存储设备都可以作为访问的源或者目的、 注意外部存储设备其自身在这就是外设了,配置时属于外设,不要与配置寄存器的存储设备混淆 2.以目前嵌入式为例,DMA和CPU两者怎么实现分时使用内存: 通常采用以下三种方法:(1)停止CPU访内存;(2)周期挪用;(3)DMA与CPU交替访问内存. 停止CPU访问内存 当外围设备要求传送一批
[单片机]
在STM32单片机上运行除零运算的C程序代码时为何程序不崩溃?
众所周知,在 C 语言中,当一个数除以0的时候,会导致除法运算异常。程序也会因此崩溃。 为了避免程序崩溃,我们需要在代码中包含对 0 的判断。 但是呢,在 STM32 单片机上运行除零运算的C程序代码时,却不会出现程序崩溃的现象。这是怎么回事呢? 今天来简单聊一聊这个问题。 聊一聊 按照常规的认知,如果 C 语言程序代码中出现除以零的操作时,会进入异常处理,而导致程序出现异常。 有小伙伴遇到过这种场景,除零操作后续的代码可以正常执行。其单片机为STM32系列单片机。 我们查阅 Cortex-M3 指南,可以看到除以零操作会导致用法异常(Usage Fault)。 从中可以得知,进入Usage Fault 是有前提条件的,即
[单片机]
stm32 芯片与Cat的对应分类
最近在使用stm32l151cbu6开发一个项目,在查询datasheet关于DMA使用的时候,发现不同的cat分类,对应的功能还有些区别, 例如上面这个就是针对Cat.1和Cat.2。 这上面这个对应的就是Cat.3。 那么问题来了,怎么知道我的stm32l151cbu6是属于Cat.x呢,再慢慢翻datasheet,发现还真有。在P40页, 可以看到Cat分类是与flash大小直接相关的,这里面有个坑,表格里面的符号是“x”与“-”,‘x’反而表示flash大小与芯片型号的对应。往下看,我们还能看到更细致的芯片分类, 我项目的stm32l151cbu6属于STM32L 15XXB分类,对应的就是Cat.1分
[单片机]
STM32的内部温度传感器
1、STM32的内部温度传感器 STM32内部温度传感器与ADC的通道16相连,与ADC配 合使用实现温度测量。测量范围–40~125℃,精度 ± 1.5℃ 操作流程: 1)、设置ADC相关参数 // ADC1 configuration ----------------------------- ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = ENABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructu
[单片机]
应用笔记|管理STM32 MCU中的内存保护单元
1 前言 本应用笔记介绍如何管理 STM32 产品中的内存保护单元(MPU)。MPU 是用于存储器保护的可选组件。STM32 微控制器(MCU)中嵌入 MPU 之后变得更稳健可靠。在使用 MPU 之前,必须对其进行编程并加以启用。如果 MPU 没有启用,则存储系统的行为不会变化。 2 概述 MPU 可以使嵌入式系统更加稳健和安全:• 禁止用户应用程序破坏关键任务(例如操作系统核心)使用的数据• 将 SRAM 存储区域定义为非可执行(禁止执行 XN),以防止代码注入攻击• 修改存储访问属性MPU可最多保护16个内存区域。在 Armv6、Armv7 架构(Cortex-M0+、M3、M4、M
[单片机]
STM32寄存器列表 I2C相关寄存器
I2C_CR1(控制寄存器1) 15位:SWRST软件复位,当被置位时,I2C处于复位状态,在复位该位前确信I2C的引脚被释放,总线是空的,定义:0(I2C模块不处于复位状态),1(I2C模块处于复位状态) 注:该位可以用于BUSY位为’1’,在总线上又没有检测到停止条件时。 13位:ALERT-SMBus提醒,软件可以设置或清除该位;当PE=0时,由硬件清除。定义: 0(释放SMBAlert引脚使其变高。提醒响应地址头紧跟在NACK信号后面),1(驱动SMBAlert引脚使其变低。提醒响应地址头紧跟在ACK信号后面) 12位:PEC数据包出错检测,软件可以设置或清除该位;当传送PEC后,或起始或停止条件时,或当PE=
[单片机]