1. 程式人生 > 其它 >STM32 GPIO的使用

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