1.GPIO结构学习
![](https://i-blog.csdnimg.cn/direct/d80429821f52487bbaceddd55563c781.png)
![](https://i-blog.csdnimg.cn/direct/1549aff8812a4ae494ff1da175de03cf.png)
2.stm32的基本认知(开启时钟)------>为什么
人活着一直在变的是时间,它伴随着人的心脏跳动,那么RCC_APB2PeriphClockCmd(时钟)就是stm32的心脏,每当用时必定要开启时钟。
3.按键学习
这些是常见的按键设计方案
在我的代码用的是第2张图(属于上拉模式)
Key.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
void Key_Init()
{
/**
* 函 数:按键初始化
* 参 数:GPIO_Mode_IPU(上拉输入)
* 返 回 值:无
*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//开启GPIOB的时钟
/*GPIO初始化*/
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);
}
uint8_t Key_GetNum(void)
{
uint8_t KeyNum=0; //每次调用进行返回值初始化
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0)//读PB1输入寄存器的状态,如果为0,则代表按键1按下(上拉输入)
{
Delay_ms(20);//延时消抖
while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0);//等待按键松手
Delay_ms(20);//延时消抖
KeyNum = 1;//置键码为1
}
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==0)//读PB1输入寄存器的状态,如果为0,则代表按键1按下(上拉输入)
{
Delay_ms(20);//延时消抖
while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0);//等待按键松手
Delay_ms(20);//延时消抖
KeyNum = 2;//置键码为2
}
return KeyNum;//返回键码值
}
Key.h
#ifndef __KEY_H
#define __KEY_H
void Key_Init();
uint8_t Key_GetNum(void);
#endif
4.LED学习
LED:发光二极管,正向通电点亮,反向通电不亮
![](https://i-blog.csdnimg.cn/direct/f32f621c97f646d9b65edb3ab432abf7.png)
在代码中使用的是推挽输出图4
LED.c
#include "stm32f10x.h" // Device header
/**
* 函 数:LED初始化
* 参 数:无
* 返 回 值:无
*/
void LED_Init()
{
/*开启时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//开启GPIOA的时钟
/*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); //将PA1和PA2引脚初始化为推挽输出
/*设置GPIO初始化后的默认电平*/
GPIO_SetBits(GPIOA,GPIO_Pin_1 | GPIO_Pin_2|GPIO_Pin_3 | GPIO_Pin_4|GPIO_Pin_5); //设置PA1和PA2引脚为高电平
}
/**
* 函 数:LED1开启
* 参 数:GPIO_ResetBits函数解释:对io管脚进行复位(输出低电平)。
* 这个函数使用GPIOx_BSRR寄存器来实现原子读或者修改操作。
* 在这种情况下,在读和修改访问时发生一个IRQ中断是没有危险的。
* 返 回 值:无
*/
void LED_open1(void)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_1); //LED1高脚接正极
}
/**
* 函 数:LED2开启
* 参 数:GPIO_ResetBits函数解释:对io管脚进行复位(输出低电平)。
* 这个函数使用GPIOx_BSRR寄存器来实现原子读或者修改操作。
* 在这种情况下,在读和修改访问时发生一个IRQ中断是没有危险的。
* 返 回 值:无
*/
void LED_open2(void)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_2); //LED2高脚接正极
}
/**
* 函 数:LED1关闭
* 参 数:GPIO_SetBits对io管脚进行置位(输出高电平)。
* 这个函数使用GPIOx_BSRR寄存器来实现原子读或者修改操作。
* 在这种情况下,在读和修改访问时发生一个IRQ中断是没有危险的。
* 返 回 值:无
*/
void LED1_OFF(void)
{
GPIO_SetBits(GPIOA, GPIO_Pin_1); //设置LED1底引脚为高电平
}
void LED2_OFF(void)
{
GPIO_SetBits(GPIOA, GPIO_Pin_2); //设置LED2底引脚为高电平
}
LED.h
#ifndef __KEY_H
#define __KEY_H
void LED_Init();
void LED_open1(void);
void LED_open2(void);
void LED1_OFF(void);
void LED2_OFF(void);
#endif
5.main.c 完成
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "LED.h"
#include "Key.h"
uint8_t KeyNum; //定义用于接收按键键码的变量
int main(void)
{
/*模块初始化*/
LED_Init();//LED初始化
Key_Init();//按键初始化
while(1)
{
KeyNum = Key_GetNum();//获取按键键码
if (KeyNum == 1)//按键1按下
{
Delay_ms(20);//延迟
LED_open1();//LED1打开
Delay_ms(20);
LED1_OFF();//LED关闭
}
if (KeyNum == 2)//按键2按下
{
Delay_ms(20);//延迟
LED_open2();//LED2打开
Delay_ms(20);
LED2_OFF();//LED关闭
}
}
}
Delay可以根据自己习惯定义