STM32 GPIO的使用
阿新 • • 發佈:2021-08-05
@
目錄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