HAL库每天一例】系列例程从今天开始持续更新。。。。。
我们将坚持每天至少发布一个基于YS-F1Pro开发板的HAL库例程,
该系列例程将带领大家从零开始使用HAL库,后面会持续添加模块应用例程。
同样的,我们还程序发布基于HAL库的指导文档和视频教程,欢迎持续关注,并提出改进意见。
例程下载:
资料包括程序、相关说明资料以及软件使用截图
链接:http://pan.baidu.com/s/1i574oPv
密码:r3s3
(硬石YS-F1Pro开发板HAL库例程持续更新1. 软件设计之基本裸机例程(HAL库版本)YSF1_HAL-004. GPIO-按键状态判断之扫描式)
1
|
|
|
|
/**
******************************************************************************
* 硬石YS-F1Pro开发板例程功能说明
*
* 例程名称: YSF1_HAL-004. GPIO-按键状态判断之扫描式
*
******************************************************************************
* 说明:
* 本例程配套硬石stm32开发板YS-F1Pro使用。
*
* 淘宝:
* 论坛:http://www.ing10bbs.com
* 版权归硬石嵌入式开发团队所有,请勿商用。
******************************************************************************
*/
【1】例程简介
GPIO输入功能操作实现,之前控制GPIO输出高低电平实现LED灯亮灭,现在是时钟GPIO为输
入模式,按键按下时会改变GPIO的电平,对应的STM32检测到KEY对应IO电平发生变化,得出
按键状态,从而实现LED灯状态改变。 本例程在while(1)无限循环中不断检测按键状态,一
旦发现有状态改变就相应改变LED灯状态。
在下个例程我们将讲解另外一种按键检测模式--中断式。
|
|
|
|
|
【2】跳线帽情况
******* 为保证例程正常运行,必须插入以下跳线帽 **********
丝印编号 IO端口 目标功能引脚 出厂默认设置
JP3 PB0 LED1 已接入
JP4 PG6 LED2 已接入
JP5 PG7 LED3 已接入
【3】操作及现象
使用开发板配套的MINI USB线连接到开发板标示“调试串口”字样的MIMI USB接口为开发板供电。
下载完程序之后,板上三个LED灯全灭状态,按下KEY1或KEY2对应LED和蜂鸣器状态发生改变。
/******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/
|
|
|
|
|
bsp_key.h文件内容:
- #ifndef __BSP_KEY_H__
- #define __BSP_KEY_H__
- /* 包含头文件 ----------------------------------------------------------------*/
- #include "stm32f1xx_hal.h"
- /* 类型定义 --------------------------------------------------------------*/
- typedef enum
- {
- KEY_UP = 0,
- KEY_DOWN = 1,
- }KEYState_TypeDef;
- /* 宏定义 --------------------------------------------------------------------*/
- #define KEY1_RCC_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
- #define KEY1_GPIO_PIN GPIO_PIN_0
- #define KEY1_GPIO GPIOA
- #define KEY1_DOWN_LEVEL 1 /* 根据原理图设计,KEY1按下时引脚为高电平,所以这里设置为1 */
- #define KEY2_RCC_CLK_ENABLE __HAL_RCC_GPIOC_CLK_ENABLE
- #define KEY2_GPIO_PIN GPIO_PIN_13
- #define KEY2_GPIO GPIOC
- #define KEY2_DOWN_LEVEL 0 /* 根据原理图设计,KEY1按下时引脚为低电平,所以这里设置为0 */
- /* 扩展变量 ------------------------------------------------------------------*/
- /* 函数声明 ------------------------------------------------------------------*/
- void KEY_GPIO_Init(void);
- KEYState_TypeDef KEY1_StateRead(void);
- KEYState_TypeDef KEY2_StateRead(void);
- #endif // __BSP_KEY_H__
- /******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/
[color=rgb(51, 102, 153) !important]复制代码
[color=rgb(51, 102, 153) !important]
|
|
|
|
|
bsp_key.h文件内容:- /**
- ******************************************************************************
- * 文件名程: bsp_key.c
- * 作 者: 硬石嵌入式开发团队
- * 版 本: V1.0
- * 编写日期: 2015-10-04
- * 功 能: 板载独立按键底层驱动函数
- ******************************************************************************
- * 说明:
- * 本例程配套硬石stm32开发板YS-F1Pro使用。
- *
- * 淘宝:
- * 论坛:ing10bbs
- * 版权归硬石嵌入式开发团队所有,请勿商用。
- ******************************************************************************
- */
- /* 包含头文件 ----------------------------------------------------------------*/
- #include "key/bsp_key.h"
- /* 私有类型定义 --------------------------------------------------------------*/
- /* 私有宏定义 ----------------------------------------------------------------*/
- /* 私有变量 ------------------------------------------------------------------*/
- /* 扩展变量 ------------------------------------------------------------------*/
- /* 私有函数原形 --------------------------------------------------------------*/
- /* 函数体 --------------------------------------------------------------------*/
- /**
- * 函数功能: 板载按键IO引脚初始化.
- * 输入参数: 无
- * 返 回 值: 无
- * 说 明:使用宏定义方法代替具体引脚号,方便程序移植,只要简单修改bsp_key.h
- * 文件相关宏定义就可以方便修改引脚。
- */
- void KEY_GPIO_Init(void)
- {
- /* 定义IO硬件初始化结构体变量 */
- GPIO_InitTypeDef GPIO_InitStruct;
- /* 使能(开启)KEY引脚对应IO端口时钟 */
- KEY1_RCC_CLK_ENABLE();
- KEY2_RCC_CLK_ENABLE();
- /* 配置KEY1 GPIO:输入下拉模式 */
- GPIO_InitStruct.Pin = KEY1_GPIO_PIN;
- GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
- GPIO_InitStruct.Pull = GPIO_PULLDOWN;
- HAL_GPIO_Init(KEY1_GPIO, &GPIO_InitStruct);
- /* 配置KEY2 GPIO:输入上拉模式 */
- GPIO_InitStruct.Pin = KEY2_GPIO_PIN;
- GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
- GPIO_InitStruct.Pull = GPIO_PULLUP;
- HAL_GPIO_Init(KEY2_GPIO, &GPIO_InitStruct);
- }
- /**
- * 函数功能: 读取按键KEY1的状态
- * 输入参数:无
- * 返 回 值: KEY_DOWN:按键被按下;
- * KEY_UP :按键没被按下
- * 说 明:无。
- */
- KEYState_TypeDef KEY1_StateRead(void)
- {
- /* 读取此时按键值并判断是否是被按下状态,如果是被按下状态进入函数内 */
- if(HAL_GPIO_ReadPin(KEY1_GPIO,KEY1_GPIO_PIN)==KEY1_DOWN_LEVEL)
- {
- /* 延时一小段时间,消除抖动 */
- HAL_Delay(10);
- /* 延时时间后再来判断按键状态,如果还是按下状态说明按键确实被按下 */
- if(HAL_GPIO_ReadPin(KEY1_GPIO,KEY1_GPIO_PIN)==KEY1_DOWN_LEVEL)
- {
- /* 等待按键弹开才退出按键扫描函数 */
- while(HAL_GPIO_ReadPin(KEY1_GPIO,KEY1_GPIO_PIN)==KEY1_DOWN_LEVEL);
- /* 按键扫描完毕,确定按键被按下,返回按键被按下状态 */
- return KEY_DOWN;
- }
- }
- /* 按键没被按下,返回没被按下状态 */
- return KEY_UP;
- }
- /**
- * 函数功能: 读取按键KEY2的状态
- * 输入参数:无
- * 返 回 值: KEY_DOWN:按键被按下;
- * KEY_UP :按键没被按下
- * 说 明:无。
- */
- KEYState_TypeDef KEY2_StateRead(void)
- {
- /* 读取此时按键值并判断是否是被按下状态,如果是被按下状态进入函数内 */
- if(HAL_GPIO_ReadPin(KEY2_GPIO,KEY2_GPIO_PIN)==KEY2_DOWN_LEVEL)
- {
- /* 延时一小段时间,消除抖动 */
- HAL_Delay(10);
- /* 延时时间后再来判断按键状态,如果还是按下状态说明按键确实被按下 */
- if(HAL_GPIO_ReadPin(KEY2_GPIO,KEY2_GPIO_PIN)==KEY2_DOWN_LEVEL)
- {
- /* 等待按键弹开才退出按键扫描函数 */
- while(HAL_GPIO_ReadPin(KEY2_GPIO,KEY2_GPIO_PIN)==KEY2_DOWN_LEVEL);
- /* 按键扫描完毕,确定按键被按下,返回按键被按下状态 */
- return KEY_DOWN;
- }
- }
- /* 按键没被按下,返回没被按下状态 */
- return KEY_UP;
- }
- /******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/
[color=rgb(51, 102, 153) !important]复制代码
|
|
|
|
|
- /**
- * 函数功能: 系统时钟配置
- * 输入参数: 无
- * 返 回 值: 无
- * 说 明: 无
- */
- void SystemClock_Config(void)
- {
- RCC_OscInitTypeDef RCC_OscInitStruct;
- RCC_ClkInitTypeDef RCC_ClkInitStruct;
- RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; // 外部晶振,8MHz
- RCC_OscInitStruct.HSEState = RCC_HSE_ON;
- RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
- RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
- RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
- RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; // 9倍频,得到72MHz主时钟
- HAL_RCC_OscConfig(&RCC_OscInitStruct);
- RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
- |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
- RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; // 系统时钟:72MHz
- RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // AHB时钟:72MHz
- RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; // APB1时钟:36MHz
- RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; // APB2时钟:72MHz
- HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);
- // HAL_RCC_GetHCLKFreq()/1000 1ms中断一次,即HAL_Delay函数延时基准为1ms
- // HAL_RCC_GetHCLKFreq()/100000 10us中断一次,即HAL_Delay函数延时基准为10us
- // HAL_RCC_GetHCLKFreq()/1000000 1us中断一次,即HAL_Delay函数延时基准为1us
- HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000000); // 配置并启动系统滴答定时器
- /* 系统滴答定时器时钟源 */
- HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
- /* 系统滴答定时器中断优先级配置 */
- HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
- }
|
|
|
|
|