Web introduction

This is about Heisenberg's little story

STM32 GPIO的使用

@

STM32时钟线图以及部分原理图

请添加图片描述
请添加图片描述
每个 IO 端口都有 7 个寄存器来控制:
配置模式的 2 个 32 位的端口配置寄存器 CRL 和 CRH
2 个 32 位的数据寄存器 IDR 和 ODR
1 个 32 位的置位/复位寄存器BSRR
1 个 16 位的复位寄存器 BRR
1 个 32 位的锁存寄存器 LCKR


按键点亮LED

//LED_Key.c
#include "Led_Key.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"

void Delay(unsigned long nCount)
{
	while(nCount--)
	{
	}
}

void Led_Configuration(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;											//建立结构体

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);                           //使能APB2 外设时钟
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;//设置GPIO
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;								//设置选中管脚的速率
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;								//设置管脚模式推挽输出
	GPIO_Init(GPIOA, &GPIO_InitStructure);											//提交结构体,初始化GPIOA
}

//PA0--KEY1  input
void Key_Configuration(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; 									//上拉输入
	GPIO_Init(GPIOA, &GPIO_InitStructure);
}

int Key_Scan(GPIO_TypeDef* GPIOx, unsigned int Pin)
{
	if(GPIO_ReadInputDataBit(GPIOx, Pin) == 0)										//读取管脚电平状态
	{
		Delay(1000);
		if(GPIO_ReadInputDataBit(GPIOx, Pin) == 0)									//按键消抖
		{
			while(GPIO_ReadInputDataBit(GPIOx, Pin) == 0);
			return KEY_ON;
		}
		return KEY_OFF;
	}
	return KEY_OFF;
}
//Led_Key.h
#ifndef __LED_KEY_H__
#define __LED_KEY_H__

#include <stm32f10x.h>

#define KEY_ON 	0
#define KEY_OFF	1

void Delay(unsigned long nCount);
void Led_Configuration(void);
void Key_Configuration(void);
int Key_Scan(GPIO_TypeDef* GPIOx, unsigned int Pin);

#endif

//main.c
// 效果:按键按下,四个GPIO灯电平取反
int main(void)
{
	//初始化操作
 	Led_Configuration();
	Key_Configuration();
 	while(1)
 	{
 		if(Key_Scan(GPIOA, GPIO_Pin_0) == KEY_ON)								//判断按钮是否被按下
 			GPIOA->ODR ^= GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;    // GPIOA电平取反
 	}
 }

呼吸灯

//main.c
//效果:呼吸灯
int main(void)
{
	int i;
	
	Led_Configuration();
	
	while(1)
	{
		for(i = 0; i < 4000; i++)  //LED逐渐变亮
		{
			GPIO_ResetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4);
			Delay(4000 - i);
			GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4);
			Delay(i);
		}
		for(i = 0; i < 4000; i++) //LED逐渐变暗
		{
			GPIO_ResetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4);
			Delay(i);
			GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4);
			Delay(4000 - i);
		}
	}
}

...Thank you for reading...______________________Heisenberg_Poppings

posted @ 2021-08-05 18:58  Heisenberg_Poppings  阅读(198)  评论(0)    收藏  举报