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

浙公网安备 33010602011771号