前言

通过上两章,我们熟悉了解了STM32cubeMX软件的使用和延时程序的编写。现在,我们就可以直接来正式学习单片机了。最先,我们来学习GPIO,单片机的输入输出。任何单片机的学习都是从跑马灯开始的,所以直接上灯。

电路

cubemax 两个按键一起按下_cubemax 两个按键一起按下

配置工程

之前有配置过一个工程,但是只加了个SW烧录口,现在需要配置IO口。只需要在原有工程上添加新外设就可以了。找到工程文件,双击点开.ioc文件,就可以进入cubeMX了

cubemax 两个按键一起按下_学习_02

配置GPIO引脚输入输出

System Core -> GPIO -> 右边模拟单片机的IO口PA3 -> GPIO_Input配置PA3为输入引脚。

相同的方法,把PC13配置成GPIO_Output输出引脚(很多人用的F103最小系统板都是PC13自带LED灯的)。

cubemax 两个按键一起按下_学习_03

GPIO mode -> Input mode -> IO口模式这是刚才点击模拟单片机引脚就配置好的

GPIO Pull-up/Pull-down -> Pull-up -> 是否上下拉,这里选上拉。

(如果硬件没加上拉电阻,也不配置内部上拉,也就是单片机引脚不能处于完全悬空,会造成单片机引脚处于不稳定状态)

Use Label -> KEY_1 -> 用户自定义标签。

cubemax 两个按键一起按下_嵌入式硬件_04

GPIO output level -> High -> IO口初始输出,这里配置成高电平

GPIO made -> output Pesh Pull ->  输出模式,推挽输出

GPIO Pull-up/Pull-down -> No pull-up and no Pull-down -> 不需要芯片内部上下拉

Maximum output speed -> High -> 高速输出

User Label -> LED_1

cubemax 两个按键一起按下_stm32_05

检查一下配置,然后输出程序。

cubemax 两个按键一起按下_嵌入式硬件_06

编译一下,0错误0警告

cubemax 两个按键一起按下_学习_07

生成代码介绍

点击左侧gpio.c,如图所示,

GPIO_InitTypeDef GPIO_InitStruct = {0};将GPIO_InitTypeDef类型的结构体命名为GPIO_InitStruct并初始化为0。

__HAL_RCC_GPIOC_CLK_ENABLE();使能GPIOC时钟,开启GPIOC这一组IO口(在使用任何一个IO口之前,都需要使能该IO的时钟,否则IO口处于掉电状态,无法使用)。

后面就是刚才使用CubeMX配置的了,因为在Use Label修改标签名了,所以在这用LED_1_GPIO_Port代替了GPIOC,LED_1_Pin代替GPIO_PIN_1;相应的宏定义在main.h;

cubemax 两个按键一起按下_cubemax 两个按键一起按下_08

代码

在use文件夹新建key.c文件(前面有步骤),在use文件夹新建key.h文件:

新建 -> 保存 (以key.h命名保存到use文件夹中) ;然后宏定义一个KEY1,表示读取A_3的状态(宏定义结尾不能写分号);

每次创建一个新的.h文件,先加上#ifndef __KEY_H        #define __KEY_H        #endif;然后写程序就在#define和#endif之间写,这段是头文件保护宏,用于避免头文件的重复包含。

cubemax 两个按键一起按下_stm32_09

HAL库的读取函数,我们看向Funtions -> stm32f1xx_hal_gpio.c -> HAL_GPIO_ReadPin

我们开发中用到的,一般只有最下面三个函数;

HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0);读取GPIOA0引脚电平

HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0);翻转GPIOA0引脚电平

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);给GPIOA0一个高电平,低电平改为RESET;

cubemax 两个按键一起按下_stm32_10

回到key.c文件;添加以下代码:

#include "delay.h"
#include "key.h"



uint8_t Key_Scan(void)
{
	if(!KEY1)
	{
		delay_ms(10);		//消抖
		if(!KEY1)
		{
			while(!KEY1);	//等待松开按键
			return 1;
		}
	}
	return 0;
}

因为要在main.c文件中用到函数Key_Scan()函数,所以Key_Scan()函数需要在key.h中声明,然后main.c中需要引用key.h文件(注意:所有由SMT32cubeMX生成的文件,编写程序都必须在同一个user begin与user end中间);又因为函数是uint8_t类型,所以还需要在.h文件中引用main.h文件;

cubemax 两个按键一起按下_学习_11

cubemax 两个按键一起按下_嵌入式硬件_12

回到main.c;添加如下代码,就可以做到按键控制灯的亮灭了。

cubemax 两个按键一起按下_单片机_13