现在感觉学标准库更有利于自己对单片机的理解,所以之后还是决定用标准库了(主要是学校智能车实验室也要求使用标准库)
这里用的单片机是STM32F407ZGT6
一.GPIO初始化
GPIO_InitTypeDef GPIO_InitStructure; //定义一个结构体,初始化GPIO端口
1.使能时钟
需要用到哪边的GPIO就开哪边的使能时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOE, ENABLE) //使能GPIOF时钟,修改第一个变量
2..配置引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_X; //配置引脚编号,开一个
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //开两个
3.设置输入输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; //普通输入模式,常用于按键
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //普通输出模式,常用于LED
4.输出模式中设置是推挽还是开漏(常用推挽)
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; //设置他处于推挽输出模式
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; //设置他处于开漏输出模式
5.设置时钟速度
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //设置时钟速度为100M
6.设置上下拉电阻
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; //下拉
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NO; //不设置上下拉
注: 输出模式中不需要设置,但是好像设置什么都一样
7.初始化GPIO,不同的使能时钟分开写
GPIO_Init(GPIOF, &GPIO_InitStructure); //初始化GPIO
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIO
样例
1.LED配置(GPIO模式为输出)
LED是管子两端存在压降,才可以点亮,所以根据原理图,输出一个低电平他才会亮
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能GPIOF时钟
//GPIOF9,F10初始化设置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;//LED0和LED1对应IO口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化GPIO
GPIO_SetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);//GPIOF9,F10设置高,灯灭
}
2.按键配置(GPIO模式为输入)
按键要求按下和不按下可以区分,根据原理图,按下的时候低电平(因为接了GND),所以没按下的时候一定要是高电平,于是便连接了一个上拉电阻(WK_UP和其他按键相反)
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOE, ENABLE);//使能GPIOA,GPIOE时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4; //KEY0 KEY1 KEY2对应引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通输入模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100M
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE2,3,4
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//WK_UP对应引脚PA0
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN ;//下拉
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA0
}
二.设置电平以及读取电平
样例:
GPIO_SetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);//GPIOF9,F10设置高电平
GPIO_ResetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);//GPIOF9,F10设置低电平
GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) //读这个引脚的电平
样例:
pinState = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5);
if (pinState == BIT_SET)
{
// 引脚GPIOA.5处于高电平
// 执行相应的操作
}
else
{
// 引脚GPIOA.5处于低电平
// 执行相应的操作
}
//这里BIT_SET 和BIT_RESET 已经定义过了,也可以用0,1来代替