历史上的今天
今天是:2024年08月30日(星期五)
2021年08月30日 | 玩转STM32CubeMX | 按键输入
2021-08-30 来源:eefocus
1.实验介绍
本实验介绍如何使用STM32F103的IO口作为输入使用。IO口作为输入使用时,是通过读取IDR的内容来读取IO口的状态的。实验中利用板载的4个按键,来控制板载的两个LED的亮灭和蜂鸣器。其中KEY_UP控制蜂鸣器;K1控制D1,按一次亮再按一次灭;K2控制D2,按一次亮再按一次灭;K3同时控制D1和D2,按一次它们的状态就翻转一次
2.硬件设计
用到的硬件资源有:
*指示灯D1、D2
*蜂鸣器BUZ
*4个按键
硬件连接原理图如下,注意K1、K2、K3是低电平有效的,而KEY_UP是高电平有效,并且外部都没有上下拉电阻,所以需要在STM32F1内部设置上下拉;
STM32F103芯片单个IO口最大输出电流是25mA,而蜂鸣器的驱动电流是30mA左右,整个芯片的输出电流最大为150mA,如果在蜂鸣器上就消耗30mA,那么芯片的其他IO口及外设电流就比较拮据了,因此此处不会直接使用IO口驱动蜂鸣器,而是通过三极管把电流放大后再驱动蜂鸣器,这样IO口只需提供不到1mA的电流就可以控制蜂鸣器

3.软件设计
3.1 STM32CubeMX设置
➡️ RCC设置外接HSE,时钟设置为72M
➡️ PC0和PC2设置为GPIO推挽输出模式、上拉、高速、默认输出电平为高电平
➡️ PB5设置为GPIO推挽输出、高速模式
➡️ PA0设置为GPIO输入下拉模式;PE2、PE3、PE4设置为GPIO输入上拉模式
➡️ 输入工程名,选择工程路径(不要有中文),选择MDK-ARM V5;勾选Generated periphera initialization as a pair of ‘.c/.h’ files per IP ;点击GENERATE CODE,生成工程代码
3.2 MDK-ARM软件编程
➡️ 在gpio.c文件中可以看到PC0、PC1、PB5、PA0、PE2、PE3、PE4管脚的初始化函数
void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOE_CLK_ENABLE(); //开启GPIOE时钟
__HAL_RCC_GPIOC_CLK_ENABLE(); //开启GPIOC时钟
__HAL_RCC_GPIOA_CLK_ENABLE(); //开启GPIOA时钟
__HAL_RCC_GPIOB_CLK_ENABLE(); //开启GPIOB时钟
//LED1/LED2默认输出是电平为高电平
HAL_GPIO_WritePin(GPIOC, LED1_Pin|LED2_Pin, GPIO_PIN_SET);
//BUZ默认输出是电平为低电平
HAL_GPIO_WritePin(BUZ_GPIO_Port, BUZ_Pin, GPIO_PIN_RESET);
GPIO_InitStruct.Pin = K_LEFT_Pin|K_DOWN_Pin|K_RIGHT_Pin; //PE2/PE3/PE4
GPIO_InitStruct.Mode = GPIO_MODE_INPUT; //输入
GPIO_InitStruct.Pull = GPIO_PULLUP; //上拉
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
GPIO_InitStruct.Pin = LED1_Pin|LED2_Pin; //PC0/PC1
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; //推挽输出
GPIO_InitStruct.Pull = GPIO_PULLUP; //上拉
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; //高速
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
GPIO_InitStruct.Pin = K_UP_Pin; //PA0
GPIO_InitStruct.Mode = GPIO_MODE_INPUT; //输入
GPIO_InitStruct.Pull = GPIO_PULLDOWN; //下拉
HAL_GPIO_Init(K_UP_GPIO_Port, &GPIO_InitStruct);
GPIO_InitStruct.Pin = BUZ_Pin; //PB5
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; //推挽输出
GPIO_InitStruct.Pull = GPIO_NOPULL; //无上下拉
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; //高速
HAL_GPIO_Init(BUZ_GPIO_Port, &GPIO_InitStruct);
}
➡️ 在工程的应用文件目录下创建key.c文件,编写按键相关函数
/***********************************************************
*函 数 名: KEY_Scan(uint8_t mode)
*功 能: 按键处理函数
*形 参: mode:0 不支持连续按;1 支持连续按
*返 回 值: 返回按键值 0:表示未有按键按下
* 1:KEY_RIGHT按下 2:KEY_DOWN按下
* 3:KEY_LEFT按下 4:KEY_UP按下
***********************************************************/
uint8_t KEY_Scan(uint8_t mode)
{
static uint8_t key = 1; //按键松开标志
if(mode == 1){ //支持连按
key = 1;
}
if(key&&(KEY_UP==1||KEY_DOWN==0||KEY_LEFT==0||KEY_RIGHT==0)){
HAL_Delay(10); //按键消抖
key = 0;
if(KEY_UP==1) return K_UP_PRES;
else if(KEY_DOWN==0) return K_DOWN_PRES;
else if(KEY_LEFT==0) return K_LEFT_PRES;
else if(KEY_RIGHT==0) return K_RIGHT_PRES;
}
else if(KEY_UP==0&&KEY_DOWN==1&&KEY_LEFT==1&&KEY_RIGHT==1){
key = 1;
}
return 0;
}
➡️ 在工程的头文件目录下创建key.h文件,编写相关声明
#ifndef _KEY_H_
#define _KEY_H_
#include "stm32f1xx.h"
//操作HAL库函数读取IO口状态
#define KEY_RIGHT HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4)
#define KEY_DOWN HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3)
#define KEY_LEFT HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2)
#define KEY_UP HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)
//定义按键按下时的键值
#define KEY_RIGHT_PRES 1
#define KEY_DOWN_PRES 2
#define KEY_LEFT_PRES 3
#define KEY_UP_PRES 4
uint8_t KEY_Scan(uint8_t mode);
#endif
➡️ 在main.c函数中编写相关程序
int main(void)
{
/* USER CODE BEGIN 1 */
uint8_t key;
/* USER CODE END 1 */
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
/* USER CODE BEGIN WHILE */
while (1)
{
key = KEY_Scan(0);
switch(key){
case KEY_UP_PRES:
HAL_GPIO_WritePin(GPIOB,BUZ_Pin,GPIO_PIN_SET);
HAL_Delay(300);
HAL_GPIO_WritePin(GPIOB,BUZ_Pin,GPIO_PIN_RESET);
HAL_Delay(300);
break;
case KEY_LEFT_PRES:
HAL_GPIO_TogglePin(GPIOC,LED1_Pin);
break;
case KEY_DOWN_PRES:
HAL_GPIO_TogglePin(GPIOC,LED2_Pin);
break;
case KEY_RIGHT_PRES:
HAL_GPIO_TogglePin(GPIOC,LED1_Pin);
HAL_GPIO_TogglePin(GPIOC,LED2_Pin);
break;
}
HAL_Delay(10);
/* USER CODE END WHILE */
}
}
4.下载验证
编译无误后下载到开发板,按下KEY_UP蜂鸣器响一下;K1控制D1,按一次亮再按一次灭;K2控制D2,按一次亮再按一次灭;K3同时控制D1和D2,按一次它们的状态就翻转一次
史海拾趣
|
程序中,duty为控制占空比的参数;count为控制分频的参数。通过改变duty和count两个参数,得到占空比及分频数可调的时钟信号,极为方便。 2.2 其他模块的实现 其他控制模块包括地址发生器、DAC控制电路、并/串转换电路。存储数据 ...… 查看全部问答> |
|
哪位大侠能提供一下nor flash M29W128G 的fast program 的代码 nor flash M29W128G 可以32个words fast program, 哪位大哥有这个写的代码,能否给小弟一下,谢谢了。… 查看全部问答> |
|
平台:6410+WINCE6.0 新开一个贴,再讨论一下这个CAMERA应用开发,因为本人一直是做驱动的,现在要写应用,而且是COM接口的directshow,所以有很多东西要向大家请教, 用640X480分辩进行preview 和 拍照都没有问题,但是,我驱动给di ...… 查看全部问答> |
|
我主要想知道硬件编解码之前的数据是什么格式或者封装的?之后应该就是H.264,MPEG-4之类的吧。之前呢?通过以太网接口的以太网数据帧(应该包含视频流的)能直接通过硬件编解码进行播放吗? 还有TV-in,进来的是什么数据?那个接口是接什么的? ...… 查看全部问答> |
|
第一次来这里,谢谢大家 刚开始做做BSP5.0移植到6.0 现在编出来的内核打印信息如下: Windows CE Kernel for ARM (Thumb Enabled) Built on Sep 6 2006 at 19:14:27 INFO:OALLogSetZones: dpCurSettings.ulZoneMask: 0xb OEM: Not ...… 查看全部问答> |
|
想写一个过滤驱动,实现禁用蓝牙,红外线等设备, 请问要将过滤驱动挂载在注册表的什么地方? 我发现过载在 注册表HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentConrolSet\\Control\\Class\\{E0CBF06C-CD8B-4647-BB8A-263B43F0F974},在这个位置并不能完 ...… 查看全部问答> |
|
野火STM32开发板,买的是428的套餐,买到手里1个多月,没用过,就是刚到手里的时候吧包装拆开了,现打算350包邮出,有意的可以直接拍下,帮我同学卖的,不刀,要的可以联系我QQ 99044007 照片就不上了,没有任何的使用,所以也不需要看 ...… 查看全部问答> |




