STM32学习笔记

发布于:2025-06-29 ⋅ 阅读:(22) ⋅ 点赞:(0)

实现按键控制LED灯

前置知识:

基本的GPIO

  • 输入模式:读取外部信号(如按键、传感器状态)。——主要用到上拉输入
  • 输出模式:向外部输出信号(如控制 LED、继电器)。——主要用到推挽输出
  • 其他模式:模拟输入、复用功能(如 USART、I2C)等。

按键的知识与常识

  • 按键未按下:GPIO 引脚通过上拉电阻连接到 VCC,读取为高电平(1)
  • 按键按下:按键将 GPIO 引脚直接接地,读取为低电平(0)

有关LED的代码部分

执行文件.c

#include "stm32f10x.h"                  // Device header

//LED的初始化函数
void LED_Init(void)
{
	//时间时钟函数
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	//设置GPIO的结构体
	GPIO_InitTypeDef GPIO_InitStructure;
	//设置为推挽输出
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	//setbits是使它值为1(高电平)
	GPIO_SetBits(GPIOA,GPIO_Pin_1 | GPIO_Pin_2);
}

void LED1_ON(void){
	GPIO_ResetBits(GPIOA,GPIO_Pin_1);
}

void LED1_OFF(void){
	GPIO_SetBits(GPIOA,GPIO_Pin_1);
}

void LED1_Turn(void){
	if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_1)==0) {
		GPIO_SetBits(GPIOA,GPIO_Pin_1);
	}
	else{
		GPIO_ResetBits(GPIOA,GPIO_Pin_1);
	}
}
void LED2_ON(void){
	GPIO_ResetBits(GPIOA,GPIO_Pin_2);
}

void LED2_OFF(void){
	GPIO_SetBits(GPIOA,GPIO_Pin_2);
}
void LED2_Turn(void){
	if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_2)==0) {
		GPIO_SetBits(GPIOA,GPIO_Pin_2);
	}
	else{
		GPIO_ResetBits(GPIOA,GPIO_Pin_2);
	}
}

 头文件.h

#ifndef __LED_H
#define __LED_H

void LED_Init(void);
void LED1_ON(void);
void LED1_OFF(void);
void LED1_Turn(void);
void LED2_ON(void);
void LED2_OFF(void);
void LED2_Turn(void);

#endif

有关按键部分:

执行文件.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"

void Key_Init(void){
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStructure);
}
/*
按键未按下:GPIO 引脚通过上拉电阻连接到 VCC,读取为高电平(1)。
按键按下:按键将 GPIO 引脚直接接地,读取为低电平(0)。
*/
uint8_t Key_GetNum(void){
	uint8_t KeyNum = 0;
	if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1)==0){
		Delay_ms(20);
		while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1)==0)
		Delay_ms(20);
		KeyNum =1;
	}
	if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11)==0){
		Delay_ms(20);
		while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11)==0)
		Delay_ms(20);
		KeyNum =2;
	}
	
	return KeyNum;
}

头文件.h

#ifndef __KEY_H
#define __KEY_H

void Key_Init(void);
uint8_t Key_GetNum(void);

#endif

main.c

#include "stm32f10x.h"
#include "Delay.h"
#include "LED.h"
#include "Key.h"

uint8_t KeyNum;

int main(void)
{
	//主函数初始化
	LED_Init();
	Key_Init();
	
	while(1){
		//进入循环后,获取按键状态
		KeyNum = Key_GetNum();
		if(KeyNum == 1){
			LED1_Turn();
		}
		if(KeyNum == 2){
			LED2_Turn();
		}
		
	}
}


网站公告

今日签到

点亮在社区的每一天
去签到