IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32F4应用-GPIO -> 正文阅读

[嵌入式]STM32F4应用-GPIO

1.前言

学习开发板的第一个实验必定是点灯,这其实就是涉及到GPIO的应用。
以STM32F407ZGT6为例子。

2. 点灯的配置

灯能亮起来一般需要的步骤有初始化GPIO,操作IO。

2.1初始化GPIO

初始化GPIO包括使能GPIO时钟和配置IO属性,一般用下面代码。

GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能IO时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9//GPIOF9
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化 GPIO

2.1.1 使能GPIO时钟

首先一个问题是为什么需要使能IO时钟?
从《STM32F4的基础介绍》这篇文章可知,stm32F4有多个时钟源,不同的外设对应不同的时钟(省功耗),在用外设之前需要使能时钟,否则不能使用。

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能IO时钟

上面一句话表示通用的GPIO时钟挂在AHB总线上。

2.1.2 配置IO

配置IO包括

  • 选择第几个IO
  • 输入输出端口模式
  • 配置IO的速度
  • 配置端口模式下的类型,如输出模式下的推挽模式
  • 设置端口的上下拉
  • 初始化IO将其赋值到GPIOA-G的某个中

2.2 操作IO

对IO进行复位和设置的操作,使得灯亮灭。

GPIO_ResetBits(GPIOF,GPIO_Pin_9); //LED0 对应引脚 GPIOF.9 拉低
GPIO_SetBits(GPIOF,GPIO_Pin_10); //LED1 对应引脚 GPIOF.10 拉高
delay_ms(500); //延时 500ms
GPIO_SetBits(GPIOF,GPIO_Pin_9); //LED0对应引脚GPIOF.0拉高,灭 等同LED0=1;
GPIO_ResetBits(GPIOF,GPIO_Pin_10); //LED1 对应引脚 GPIOF.10 拉低,亮 等同 LED1=0;
delay_ms(500); //延时 500ms

3. GPIO特性

3.1 引脚特性

STM32F407ZGT6有114个IO引脚,分为7组,A-I.
大部分IO有复用功能,FT表示IO口可承受5V电压。

3.2 工作方式

根据2.1.2的介绍势必会产生几个问题:端口模式有几种,涉及哪些寄存器,IO的速度有几种等,下面进行介绍。

3.2.1 配置寄存器

有4个32位配置寄存器

  • GPIOx_MODER模式选择
  • GPIOx_OTYPER输出类型
  • GPIOx_OSPEEDR速度选择
  • GPIOx_PUPDR上下拉
    当然还有2个16位的数据寄存器GPIOx_IDR,GPIOx_ODR,还有一个32位置位复位寄存器BSRR.IDR和ODR可读可写.虽然都是对位操作,一般写的时候用BSRR,因为用ODR先得读再写,浪费时间。

3.2.2 工作模式

从模式寄存器的定义可知,有四种工作模式:

  • 输出
  • 输入
  • 复用,复用其他功能如uart等
  • 模拟,ADC/DAC
    在这里插入图片描述
    而在不同的模式下,引脚又有几种状态
    在这里插入图片描述

输入模式:

  • 输入浮空
  • 输入上拉
  • 输入下拉

输出模式:

  • 开漏输出(带上拉或者下拉)
  • 推挽式输出(带上拉或者下拉)

复用功能:

  • 推挽式复用功能(带上拉或者下拉)
  • 开漏式复用功能(带上拉或者下拉)

模拟功能
寄存器的配置可以总结如下表
在这里插入图片描述
在这里插入图片描述

3.2.3 工作速度

GPIO输出输出速度有以下几种,通过设置GPIOx_OSPEEDR:

  • 2MHZ
  • 25MHz
  • 50MHz
  • 100MHz(30pF)/80MHz(15pF)
    这里只对输出有用,这里的速度指的是GPIO输出电平翻转的速度。

3.2.4 重要函数

在这里插入图片描述

4.增加功能函数

4.1 在main里增加

要实现什么功能,可以直接在main里增加,在while1里增加功能语句。不过在此之前需要对函数进行声明。

void LED_Init(void);//声明

int main(void)
{
LED_Init(); //初始化 LED 端口
while (1)
  {
GPIO_ResetBits(GPIOF,GPIO_Pin_9); //LED0 对应引脚 	delay_ms(500); //延时 500ms
 }
}

//定义
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 设置高,灯灭
	GPIO_ResetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);
	}

4.2 新建函数

增加新函数,如LED.c,以及对应得头文件,放在之前建立的文件夹里,如app。
在这里插入图片描述
.c文件一般放的是函数定义,.h文件是声明。
.c参考内容如下,先包含头文件名,再定义函数。

#include"LED.h"
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 设置高,灯灭
	GPIO_ResetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);
	}

.h参考内容如下,先定义头文件名,再声明函数。

#ifndef __LED_H
#define __LED_H 			   
#include "stm32f4xx.h"  

void LED_Init(void);

#endif

然后再在main函数中使用,只用加入对头文件的引用,加入#include"LED.h"就行。

参考文献

《STM32F4开发指南-库函数版本-V1.2》
《STM32F4xx中文参考手册》

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-12-14 16:07:28  更:2021-12-14 16:09:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 14:53:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码