赞
踩
目录
硬件知识
一、LED
二、按键
函数库知识
一、例程解析
二、函数解析
代码编写
一、小灯闪烁
二、按键开关灯
硬件知识
一、LED知识
①原理
LED:当阳极电平>阴极电平时,LED导通发光
在图中:LED阴极接地,则
②初始化设置
选择A1为输出模式
通过左边的设置界面找到GPIO,然后设置参数
有关参数如下
剩余三个都这样调,以后都是这样、
暂不做要求,记住就好
二、按键知识
①原理
当按键按下后,两端导通
在图中,按键接地
按下后相当于B0接地,会变成低电平
若接3.3v正极,按下后变为高电平
②初始化设置
B0选Input
参数设置
选择pull-up上拉,上拉就是往电平往上拉
代表B0平时为高电平
函数库知识
一、例程解析
①例程描述
按这个路径慢慢找就好
先点开这个readme看看
找到最重要的Example Description
- @par Example Description //例程描述
-
- How to configure and use GPIOs through the HAL API.
-
- PA.05 IO (configured in output pushpull mode) toggles in a forever loop.
- On STM32F103RB-Nucleo board this IO is connected to LED2.
-
- In this example, HCLK is configured at 64 MHz.
Toggle:翻转
API:可以理解为函数集
stm32……:官方的板子,我们用的是stm32f103c8t6最小系统板
HCLK:不知道是什么,当做系统运行频率吧
大意翻译:怎么配置和使用GPIO,通过HAL里的函数
A5调好了输出模式,会在死循环内不停翻转电平
在官方板子里这个IO口连接LED2
这里,HCLK的频率为64MHZ
很明显,这个例程的现象就是A5连着的灯亮个不停
②主函数
点开main函数,看看写了啥
这是主函数里面一堆初始化,无视就好
死循环里的才是重点
- HAL_GPIO_TogglePin(LED2_GPIO_PORT, LED2_PIN);
- /* Insert delay 100 ms */
- HAL_Delay(100)
二、函数库讲解
右键跳转一下定义
可以看到这样一个库
接下来讲解里面重要的函数
例:HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1,GPIO_PIN_RESET );
A1写入低电平
代码编写
一、小灯闪烁
①初始化
复制模板改名
然后按上面说的那样子,配好A1
这里我顺手配了B0,问题不大
②在主文件死循环里加个和例程差不多的
像这样快速定位要引用的函数
复制到死循环内
- HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_1);
- HAL_Delay(500);
然后下载
实验现象:A1红灯每500ms亮灭一次
二、按键开关小灯
①初始化
②代码编写
刚刚说了按键原理,那么基本思路就是
if(按键按下){翻转A1电平},代码如下
- if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0) ==GPIO_PIN_RESET){
-
- HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_1);
-
- }
简单如斯
但实际上,按键和手都可以是劣质的
你按下后B0不一定为低电平,你偶尔按了没反应
所以我们一般在外面加个延时
- if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0) ==GPIO_PIN_RESET){
- HAL_Delay(20);
-
- if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0) ==GPIO_PIN_RESET){
-
- HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_1);
-
- }
- }
其实加完也没稳定太多,图个心理安慰
补充:专属库的改进
官方代码太长了不想复制那么多,我一般这样改
- /*Mine.h*/
-
- #include "main.h"
-
-
-
-
- #define Red GPIO_PIN_1
- #define Green GPIO_PIN_5
-
-
- #define Key1 GPIO_PIN_0
- #define Key2 GPIO_PIN_1
- #define Key3 GPIO_PIN_10
- #define Key4 GPIO_PIN_11
-
-
- #define Pressed GPIO_PIN_RESET
-
-
- #define Red_On() HAL_GPIO_Writein(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);
- #define Red_Off() HAL_GPIO_Writein(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);
- #define Red_Toggle() HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_1);
-
-
- GPIO_PinState ReadPin(uint16_t GPIO_Pin) ;
-
-
-
-
- /*Mine.c*/
-
- #include "Mine.h"
-
-
- GPIO_PinState ReadPin(uint16_t GPIO_Pin) {
-
-
-
- return HAL_GPIO_ReadPin(GPIOB, GPIO_Pin);
-
- }
-
-
-
-
-
-
-
- /* Mine.h*/
-
-
- /* USER CODE BEGIN Includes */
- #include "Mine.h"
- /* USER CODE END Includes */
-
-
- if(ReadPin(GPIO_PIN_0) == Pressed){
- HAL_Delay(20);
-
- if(ReadPin(GPIO_PIN_0) == Pressed){
-
- Red_Toggle();
-
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。