打印
[应用相关]

寒假学习stm32 - 第三天 基于KEIL 开始点灯

[复制链接]
1865|30
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
2.1 了解第一个关于GPIO库函数
打开lib文件夹找到GPIO对应的源文件和头文件 stm32f10x_gpio.c 与stm32f10x_gpio.h 文件。在 stm32f10x_gpio.c 文件主要对stm32 GPIO的功能进行初始化配置以及相关操作,

沙发
hanzhen654|  楼主 | 2019-1-30 20:36 | 只看该作者
下面列举了一些对GPIO操作的函数。

函数
功能
GPIO_Init()
GPIO的初始化函数
GPIO_ReadInputDataBit()
GPIO读输入数据位函数
GPIO_ReadInputData()
GPIO读输入端口数据函数
GPIO_ReadOutputDataBit()
GPIO读输出数据位函数
GPIO_ReadOutputData()
GPIO读输出端口数据函数
GPIO_SetBits()
设置GPIO引脚为高电平
GPIO_ResetBits()
设置GPIO引脚为低电平

使用特权

评论回复
板凳
hanzhen654|  楼主 | 2019-1-30 20:37 | 只看该作者
需要深入了解GPIO初始化的过程,在void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);中这个函数有两个参数,第一个参数是用来指定 GPIO,取值范围为 GPIOA~GPIOG。第二个参数为初始化参数结构体指针,结构体类型为 GPIO_InitTypeDef。下面我们看看这个结构体的定义。首先通过keil打开LED灯实验,然后找到lib 组下面的 stm32f10x_gpio.c文件,定位到 GPIO_Init 函数体处,双击入口参数类型 GPIO_InitTypeDef 后右键选择“Go todefinition of …”

使用特权

评论回复
地板
hanzhen654|  楼主 | 2019-1-30 20:38 | 只看该作者
2.可以查看结构体的定义:
typedef struct
{
uint16_t GPIO_Pin;             // GPIO引脚      
GPIOSpeed_TypeDef GPIO_Speed;  // GPIO速度
GPIOMode_TypeDef GPIO_Mode;    // GPIO模式
}GPIO_InitTypeDef;  

使用特权

评论回复
5
hanzhen654|  楼主 | 2019-1-30 20:38 | 只看该作者
下面通过一个实例来告诉大家怎么使用该初始化函数,通过初始化结构体初始化 GPIO 的常用格式是:
GPIO_InitTypeDef  GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;  //LED0-->PB.4 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度 50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);//根据设定参数配置 GPIO

使用特权

评论回复
6
hanzhen654|  楼主 | 2019-1-30 20:39 | 只看该作者
以上设置了GPIOB的第5个端口为推挽输出模式,同时速度为50M。上面初始
化代码可以看出,结构体 GPIO_InitStructure 的第一个成员变量 GPIO_Pin 用来设置是要初始化哪个或者哪些 IO 口;第二个成员变量 GPIO_Mode 是用来设置对应 IO 端口的输出输入模式,这些模式共有 8 个,通过一个枚举来进行定义的。

使用特权

评论回复
7
hanzhen654|  楼主 | 2019-1-30 20:40 | 只看该作者
描述如下
typedef enum
{ GPIO_Mode_AIN = 0x0, //模拟输入
GPIO_Mode_IN_FLOATING = 0x04, //浮空输入
GPIO_Mode_IPD = 0x28, //下拉输入
GPIO_Mode_IPU = 0x48, //上拉输入
GPIO_Mode_Out_OD = 0x14, //开漏输出
GPIO_Mode_Out_PP = 0x10, //通用推挽输出
GPIO_Mode_AF_OD = 0x1C, //复用开漏输出
GPIO_Mode_AF_PP = 0x18 //复用推挽
}GPIOMode_TypeDef;

使用特权

评论回复
8
hanzhen654|  楼主 | 2019-1-30 20:41 | 只看该作者
第三个参数是 IO 口速度设置,有三个可选值,同样是通过枚举类型定义: 描述如下
typedef enum
{
GPIO_Speed_10MHz = 1,
GPIO_Speed_2MHz,
GPIO_Speed_50MHz
}GPIOSpeed_TypeDef;

使用特权

评论回复
9
hanzhen654|  楼主 | 2019-1-30 20:42 | 只看该作者
3.GPIO引脚状态的控制
如果我们需要控制某一个GPIO的状态,在多数情况下,我们都是采用这两个函数来设置 GPIO 端口的输入和输出状态。比如我们要设置 GPIOB.4 输出 1,那么方法为:GPIO_SetBits(GPIOB, GPIO_Pin_4);反之如果要设置 GPIOB.4 输出位 0,方法为:GPIO_ResetBits (GPIOB, GPIO_Pin_4);

使用特权

评论回复
10
hanzhen654|  楼主 | 2019-1-30 20:43 | 只看该作者
4.IO操作具体总结如下:
01.使能IO时钟,调用函数RCC_APB2PeriphClockCmd()。
02.初始化IO参数,调用函数 GPIO_Init()
03.操作IO ,调用GPIO_SetBits() 或者GPIO_ResetBits()函数

使用特权

评论回复
11
hanzhen654|  楼主 | 2019-1-30 20:44 | 只看该作者
01.硬件电路如下,LED1 LED2 分别接到了STM32PB6PB7引脚上。

使用特权

评论回复
12
hanzhen654|  楼主 | 2019-1-30 20:44 | 只看该作者

使用特权

评论回复
13
hanzhen654|  楼主 | 2019-1-30 20:45 | 只看该作者
02.软件设计,需要在app文件夹中新建led.cled.h两个文件作为驱动LED的底层文件,也是为了以后方便其它文件或者操作系统调度。

使用特权

评论回复
14
hanzhen654|  楼主 | 2019-1-30 20:54 | 只看该作者
03. led.c 添加到keil中的app目录下,同时在C++选项中包含app文件路径,使keil可以找到对应的头文件。

使用特权

评论回复
15
hanzhen654|  楼主 | 2019-1-30 20:54 | 只看该作者
04.led.c文件中编写代码如下:
#include "led.h"
//初始化 PB6 PB7 为输出口.并使能这两个口的时钟
//LED IO 初始化
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能 PB端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //LED1-->PB.6 端口配置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //LED2-->PB.7 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO 口速度为 50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化 GPIOB
}

使用特权

评论回复
16
hanzhen654|  楼主 | 2019-1-30 20:55 | 只看该作者
要注意的是:在配置 STM32 外设的时候,任何时候都要先使能该外设的时钟。 GPIO 是挂载在 APB2 总线上的外设,在固件库中对挂载在 APB2 总线上的外设时钟使能是通过函数 RCC_APB2PeriphClockCmd()来实现的。

使用特权

评论回复
17
hanzhen654|  楼主 | 2019-1-30 20:56 | 只看该作者
05.在led.h文件中编写代码如下:
#ifndef __LED_H
#define __LED_H
//LED 端口定义
void LED_Init(void);//初始化
#endif

使用特权

评论回复
18
hanzhen654|  楼主 | 2019-1-30 20:57 | 只看该作者
06. 从LED的硬件原理图可以看到如果要点亮LED需要让PB6、PB7处于低电平。在主函数中我们的代码如下:
#include "stm32f10x.h"
#include "led.h"
int main()
{
  LED_Init();
        while(1)
        {
         GPIO_ResetBits(GPIOB,GPIO_Pin_6);
         GPIO_ResetBits(GPIOB,GPIO_Pin_7);
        }

}

使用特权

评论回复
19
hanzhen654|  楼主 | 2019-1-30 20:58 | 只看该作者
下载到硬件开发板,观察两颗LED是否被点亮,通过该项操作,我们对GPIO的引脚有一个基本的了解和认识,下次我们再玩点花样的,本次实验就到这里。

使用特权

评论回复
20
晓伍| | 2019-3-1 17:28 | 只看该作者
楼主加油 我看好你

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

73

主题

1766

帖子

2

粉丝