stm32学习笔记07 使用固件库点灯 按键检测

59 阅读1分钟

使用固件库点亮LED灯

  1. 在User文件夹下新建 Led的c和头文件
  2. 在Keil下添加Led的c文件
  3. Led的头文件要添加防止重定义的额语法
  4. 将Led的头文件路径包含进编译器的路径选择中
  5. 可以通过F12查看相关函数的原型
  6. 一种其他通过宏定义,用ON和OFF开关的方法

image.png

image.png

示例

头文件
#ifndef __BSP_LED_H
#define __BSP_LED_H

#include "stm32f10x.h"

#define LED_G_GPIO_PIN            GPIO_Pin_0
#define LED_G_GPIO_PORT           GPIOB

#define LED_GPIO_CLK              RCC_APB2Periph_GPIOB

void LED_GPIO_Config(void);

#endif

函数实现
// bsp:board support package 板级支持包

#include "bsp_LED.h"

void LED_GPIO_Config(void)
{
	
	RCC_APB2PeriphClockCmd(LED_GPIO_CLK, ENABLE);
	GPIO_InitTypeDef Gpio_InitStruct;
	
	Gpio_InitStruct.GPIO_Pin = LED_G_GPIO_PIN;
	Gpio_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
	Gpio_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(LED_G_GPIO_PORT,  &Gpio_InitStruct);
	
}

使用固件库检测按键

端口输入数据寄存器 IDR,如果是0表示检测到低电平,如果是1表示检测到高电平。

按键采用查询的方法(不使用中断)

  1. 按键的初始化和配置函数

  2. 按键的松手检测

  3. 异或的运算方法 LED_TOGGLE

        #define LED_R_TOGGLE  {LED_R_GPIO_PORT->ODR ^= LED_R_GPIO_PIN;}
     //这一句的运算符 ^= 是异或 运算符, 是C语言里的一个二进制运算符,相异为1,相同为0。
    

示例:

Key的头文件
#ifndef __BSP_KEY_H
#define __BSP_KEY_H 

#include "stm32f10x.h"

#define KEY1_GPIO_PIN            GPIO_Pin_0
#define KEY1_GPIO_PORT           GPIOA

#define KEY1_GPIO_CLK            RCC_APB2Periph_GPIOA

#define KEY2_GPIO_PIN            GPIO_Pin_13
#define KEY2_GPIO_PORT           GPIOC

#define KEY2_GPIO_CLK            RCC_APB2Periph_GPIOC

#define KEY_ON                   1
#define KEY_OFF                  0

void KEY_GPIO_Config(void);
uint8_t Key_Scan(GPIO_TypeDef * GPIOx,uint16_t GPIO_Pin);

#endif

Key的函数实现
#include "bsp_key.h"

void KEY_GPIO_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitTypeDef GPIO_InitStruct1;
	RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK, ENABLE);
	RCC_APB2PeriphClockCmd(KEY2_GPIO_CLK, ENABLE);
	
	GPIO_InitStruct.GPIO_Pin = KEY1_GPIO_PIN;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(KEY1_GPIO_PORT,  &GPIO_InitStruct);
	
	GPIO_InitStruct1.GPIO_Pin = KEY2_GPIO_PIN;
	GPIO_InitStruct1.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(KEY2_GPIO_PORT,  &GPIO_InitStruct1);
}

uint8_t Key_Scan(GPIO_TypeDef * GPIOx,uint16_t GPIO_Pin)
{
	if(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == KEY_ON)
	{
			//松手检测,注意这里while的写法,直接是加了分号,说明这句松手的时候才会执行下一句
			while(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == KEY_ON);
			return KEY_ON;
	}
	else return KEY_OFF;
}
主函数

int main (void)
{

	//来到这里的时候,系统的时钟已经被配置成72M
	LED_GPIO_Config();
	KEY_GPIO_Config();
	LED_G_TOGGLE;
	LED_R_TOGGLE;
	while(1)
	{
		if(Key_Scan(KEY1_GPIO_PORT,KEY1_GPIO_PIN)==KEY_ON)
			LED_G_TOGGLE;
		if(Key_Scan(KEY2_GPIO_PORT,KEY2_GPIO_PIN)==KEY_ON)
			LED_R_TOGGLE;	
	}                                     
}