STM32F407 GPIO口输出配置配置步骤

news2024/11/25 18:49:28

STM32F407ZGT6 是意法半导体(STMicroelectronics)公司推出的一款高性能ARM Cortex-M4核心的32位微控制器(MCU)。它是 STM32F4 系列的一员,具备强大的处理能力和丰富的外设功能,适用于各种应用领域。

【1】F407建工程所需依赖文件

img

img

img

img

img

img

【2】 新建工程

img

img

img

img

img

img

img

img

img

img

img

img

img

说明:STM32F4 的主频最高是 168Mhz,所以我们一般设置 PLLCLK 为 168Mhz(M=8,N=336,P=2),通过 SW 选择 SYSCLK=PLLCLK即可得到 168Mhz 的系统运行频率。

【3】分析LED硬件原理图

img

img

img

【4】编写LED驱动代码

查看数据手册:

img

img

Led.c文件代码如下:

#include "led.h"
/*
函数功能:LED初始化
硬件连接:
PF8-->BEEP  --高电平响
PF9-->LED0  --低电平亮
PF10->LED1  --低电平亮
*/
void LED_Init(void)
{
		/*1. 开时钟*/
	  RCC->AHB1ENR|=1<<5;//使能PORTF时钟
		
	  /*2. 配置GPIO口模式*/
	  GPIOF->MODER&=~(0x3<<8*2); //清除模式
		GPIOF->MODER|=0x1<<8*2;    //配置输出模式
		
		GPIOF->MODER&=~(0x3<<9*2); //清除模式
		GPIOF->MODER|=0x1<<9*2;    //配置输出模式
	
		GPIOF->MODER&=~(0x3<<10*2); //清除模式
		GPIOF->MODER|=0x1<<10*2;    //配置输出模式
	
	  /*3. 配置GPIO口输出类型*/
		GPIOF->OTYPER&=~(0x1<<8);  //0表示推挽输出
		GPIOF->OTYPER&=~(0x1<<9);  //0表示推挽输出
		GPIOF->OTYPER&=~(0x1<<10); //0表示推挽输出
	
		/*4. 配置GPIO口输出速度*/
		GPIOF->OSPEEDR&=~(0x3<<8*2); //清除之前配置
		GPIOF->OSPEEDR|=0x2<<8*2;    //50MHZ输出速度
		
		GPIOF->OSPEEDR&=~(0x3<<9*2); //清除之前配置
		GPIOF->OSPEEDR|=0x2<<9*2;    //50MHZ输出速度
		
		GPIOF->OSPEEDR&=~(0x3<<8*2); //清除之前配置
		GPIOF->OSPEEDR|=0x2<<10*2;   //50MHZ输出速度
		
		/*5. 配置GPIO口输出默认电平*/
		GPIOF->ODR|=1<<10;   	//输出1
		GPIOF->ODR|=1<<9;   	//输出1
		GPIOF->ODR&=~(1<<8);  //输出0
}



Led.h代码如下

#ifndef _LED_H
#define _LED_H
#include "stm32f4xx.h"
void LED_Init(void);
#define LED0(x) if(x){GPIOF->ODR|=1<<9;}else{GPIOF->ODR&=~(1<<9);}
#define LED1(x) if(x){GPIOF->ODR|=1<<10;}else{GPIOF->ODR&=~(1<<10);}
#define BEEP(x) if(x){GPIOF->ODR|=1<<8;}else{GPIOF->ODR&=~(1<<8);}
#endif

Main.c代码如下

#include "stm32f4xx.h" // Device header
#include "led.h"

void DelayMs(u32 time)
{
		u32 a,b,c;
		for(a=0;a<time;a++)
			for(b=0;b<100;b++)
				for(c=0;c<450;c++);
}

int main(void)
{
		LED_Init();
		while(1)
		{
			LED0(0);
			LED1(0);
		//	BEEP(0);
			DelayMs(1000);
			LED0(1);
			LED1(1);
			//BEEP(1);
			DelayMs(1000);	
		}
}

【5】编译代码 配置下载

img

img

img

【6】编写无源蜂鸣器驱动代码

Delay.c延时函数代码

#include "delay.h"
/*
功能  :毫秒级别的延时函数
参数  :填入延时的时间
返回值:无
说  明:频率在168MHZ情况下使用
*/
void DelayMs(u32 time)
{
	u32 a,b,c;
	for(a=0;a<time;a++)
		for(b=0;b<100;b++)
			for(c=0;c<450;c++);
}


/*
功能  :微秒级别的延时函数
参数  :填入延时的时间
返回值:无
说  明:频率在168MHZ情况下使用
*/
void DelayUs(u32 time)
{
	u32 k;
	while(time--)
	{
		k=40;
		while(k--);
	}
}


Led.c代码

#include "led.h"
/*
函数功能:LED初始化
硬件连接:
PF8-->BEEP  --高电平响
PF9-->LED0  --低电平亮
PF10->LED1  --低电平亮
*/
void LED_Init(void)
{
		/*1. 开时钟*/
	  RCC->AHB1ENR|=1<<5;//使能PORTF时钟
		
	  /*2. 配置GPIO口模式*/
	  GPIOF->MODER&=~(0x3<<8*2); //清除模式
		GPIOF->MODER|=0x1<<8*2;    //配置输出模式
		
		GPIOF->MODER&=~(0x3<<9*2); //清除模式
		GPIOF->MODER|=0x1<<9*2;    //配置输出模式
	
		GPIOF->MODER&=~(0x3<<10*2); //清除模式
		GPIOF->MODER|=0x1<<10*2;    //配置输出模式
	
	  /*3. 配置GPIO口输出类型*/
		GPIOF->OTYPER&=~(0x1<<8);  //0表示推挽输出
		GPIOF->OTYPER&=~(0x1<<9);  //0表示推挽输出
		GPIOF->OTYPER&=~(0x1<<10); //0表示推挽输出
	
		/*4. 配置GPIO口输出速度*/
		GPIOF->OSPEEDR&=~(0x3<<8*2); //清除之前配置
		GPIOF->OSPEEDR|=0x2<<8*2;    //50MHZ输出速度
		
		GPIOF->OSPEEDR&=~(0x3<<9*2); //清除之前配置
		GPIOF->OSPEEDR|=0x2<<9*2;    //50MHZ输出速度
		
		GPIOF->OSPEEDR&=~(0x3<<8*2); //清除之前配置
		GPIOF->OSPEEDR|=0x2<<10*2;   //50MHZ输出速度
		
		/*5. 配置GPIO口输出默认电平*/
		GPIOF->ODR|=1<<10;   	//输出1
		GPIOF->ODR|=1<<9;   	//输出1
		GPIOF->ODR&=~(1<<8);  //输出0
}

/*
1/2000HZ=0.0005s=0.5ms=500us
1/4000HZ=0.25ms
控制蜂鸣器:产生2KHZ~5KHZ的方波即可
*/
void BEEP_Ctlrl(u8 cmd,u32 time)
{
		u8 i;
		if(cmd) //打开蜂鸣器
		{
				for(i=0;i<time;i++)
				{
						BEEP(0);
						DelayUs(250);
						BEEP(1);
						DelayUs(250);
				}
		}
		else   //关闭蜂鸣器
		{
				BEEP(0);
				for(i=0;i<time;i++)DelayUs(250);
		}
}

Mian.c主函数代码

#include "stm32f4xx.h" // Device header
#include "led.h"
#include "delay.h"

int main(void)
{
		u8 i;
		LED_Init();
		while(1)
		{
				 i=!i;
				 BEEP_Ctlrl(i,200);
		}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/701486.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3.6.6.异步SIGIO : fcntl(F_GETFL、F_SETFL、O_ASYNC、F_SETOWN) 3.6.7.存储映射IO

3.6.6.异步IO &#xff1a;SIGIO 3.6.6.1、何为异步IO (1)几乎可以认为&#xff1a;异步IO就是操作系统用软件实现的一套中断响应系统。 (2)异步IO的工作方法是&#xff1a;我们当前进程注册一个异步IO事件&#xff08;使用signal注册一个信号SIGIO的处理函数&#xff09;&…

【Django学习】(十)模型序列化器_关联字段序列化

这篇文章是针对模型类序列化器以及如何关联字段序列化 进行深入讲解的&#xff1b; class ProjectModelSerializer(serializers.ModelSerializer):email serializers.EmailField(write_onlyTrue)interfaces InterfaceModelSerializer(label所属接口的信息, help_text所属接口…

git常见操作汇总

存档&#xff0c;方便本人查询~ 除了add、commit、push、pull外有些操作也是需要掌握的~在复习之前先准备一下需要的项目&#xff1a; mkdir git-demo1 cd git-demo1 git init基础操作 # 在工作区新增一个README.md文件&#xff0c;并写入 # Hello World# 查看哪些原件做了修…

Java安全——安全管理器

Java安全 安全管理器 Java安全管理器是一个Java安全模型中的一个组件&#xff0c;主要的作用是提高Java应用程序的安全性。Java应用程序中的每个线程都会对安全管理器进行检查&#xff0c;在执行代码之前&#xff0c;会先经过安全管理器的核验&#xff0c;安全管理器根据代码来…

Flink SQL之Temporal Joins

1.Temporal Joins&#xff08;时态JOIN&#xff09; 时态表是一个随时间演变的表&#xff0c;在Flink中也称为动态表。 时态表中的行与一个或多个时态周期相关联&#xff0c;并且所有Flink表都是时态的&#xff08;动态的&#xff09;。时态表包含一个或多个版本化的表快照&a…

Oracle数据库中的包的介绍及示例

Oracle的包是一种封装存储过程&#xff0c;函数&#xff0c;变量和游标等代码对象的方法。包可以视为一组相关的程序单元&#xff0c;它们共享相同的命名空间和存储空间。包可以被看做是一个数据库程序库&#xff0c;它包含一个或多个程序单元&#xff0c;这些单元可以被视为一…

图片加载失败捕获上报及处理

图片加载失败捕获上报及处理 前端页面中加载最多的静态资源之一就是图片了&#xff0c;当出现图片加载失败时&#xff0c;非常影响用户体验。这时候我们就需要对图片是否成功加载进行判断&#xff0c;并对图片加载失败进行处理。 图片加载监听 单个捕获 HTML中的img标签可以…

vue 组件简单实例及传参交互

前言:vue 可以比较灵活的使用 html的片段&#xff0c;并将html的片段进行数据隔离&#xff0c;参数也可以互相传递&#xff0c;组件与组件之间也可以进行数据的交互 合理的使用组件可以避免重复代码或者很方便的调用第三方组件库 vue组件 简单实例组件传参实际应用父子组件交互…

SpringBoot2+Vue2实战(四)进行组件内容拆分及路由实现

一、拆分 新建包&#xff1a; Aside和Header都是组件 User为视图 Aside.vue&#xff1a; <template><el-menu :default-openeds"[1, 3]" style"min-height: 100%; overflow-x: hidden"background-color"rgb(48, 65, 86)"text-color…

I2C总线协议详解

I2C总线物理拓扑结构 I2C总线物理拓扑图 I2C 总线在物理连接上非常简单&#xff0c;分别由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻组成。通信原理是通过对SCL和SDA线高低电平时序的控制&#xff0c;来 产生I2C总线协议所需要的信号进行数据的传递。在总线空闲状态时&#…

linux下使用pyqt5的QMediaPlayer制作简易播放器(存在进度条、前进、后退、暂停、打开、播放等操作)

目录 1. 问题2. 解决3. 效果 1. 问题 关于pyqt5的qmediaplayer模块制作简易播放器&#xff0c;网上很多博客都是win下的&#xff0c;放在linux系统会出问题&#xff1b;另外&#xff0c;部分博客缺少文件&#xff0c;无法直接使用。 参考博客《基于pyqt5的QMediaPlayer实现视…

android studio git使用

pull代码 我们从远程仓库拉取代码时&#xff0c;一般有下面的两个选项 当使用Android Studio拉取代码时&#xff0c;有两种常见的选项&#xff1a;合并&#xff08;merge&#xff09;传入的更改到当前分支和变基&#xff08;rebase&#xff09;。 合并&#xff08;Merge&…

【Django学习】(九)自定义校验器_单字段_多字段校验_模型序列化器类

之前学习了视图集里运用序列化器进行序列化和反序列化操作&#xff0c;定义序列化器类&#xff0c;需要继承Serializer基类或者Serializer的子类&#xff1b; 这次我们将学习如何自定义校验器、如何进行单字段或者多字段校验&#xff0c;最后初步使用模型序列化器 一、自定义…

OPPO手机无网络可支持3km通信,对讲机将被淘汰?

OPPO在2019世界移动通信大会即MWC上海发布了一项新技术&#xff0c;被称为“无网络通信技术”&#xff08;MeshTalk&#xff09;。这是OPPO自主研发的一项去中心化通讯技术&#xff0c;能够在没有蜂窝网络、Wi-Fi、蓝牙的情况下&#xff0c;实现3km内通讯。 无网通信技术 不过…

Java教程-Java异常抛出

在Java中&#xff0c;异常允许我们编写高质量的代码&#xff0c;可以在编译时检查错误而不是在运行时&#xff0c;并且我们可以创建自定义异常&#xff0c;使代码的恢复和调试更加容易。 Java的throw关键字 Java的throw关键字用于显式地抛出异常。 我们指定要抛出的异常对象。异…

华为breeze ideploy部署流程示例

https://www.cnblogs.com/withfeel/p/11640877.html 华为breeze ideploy部署流程示例

Canal对MySQL进行数据迁移

Canal简单介绍 贴个官方网址&#xff1a;阿里巴巴MySQL binlog 增量订阅&消费组件 架构图&#xff1a; 基于日志增量订阅和消费的业务包括 数据库镜像数据库实时备份索引构建和实时维护(拆分异构索引、倒排索引等)业务 cache 刷新带业务逻辑的增量数据处理 当前的 cana…

CSS知识点汇总(十一)--回流重绘

文章目录 怎么理解回流跟重绘&#xff1f;什么场景下会触发&#xff1f;1、回流和重绘是什么&#xff1f;2、如何触发回流和重绘3、如何避免回流和重绘的发生 怎么理解回流跟重绘&#xff1f;什么场景下会触发&#xff1f; 1、回流和重绘是什么&#xff1f; 在HTML中&#xf…

二十、socket套接字编程(二)——TCP

文章目录 一、TCP套接字接口&#xff08;一&#xff09;inet_aton &#xff08;和inet_addr一样&#xff0c;换一种方式而已&#xff09;&#xff08;二&#xff09;socket()&#xff08;三&#xff09;bind()&#xff08;四&#xff09;listen()&#xff08;五&#xff09;acc…

ASP.NET Core MVC -- 入门

先决条件&#xff08;开发配置二选一&#xff09;&#xff1a; 带有 ASP.NET 和 Web 开发工作负载的Visual Studio Visual Studio Code Visual Studio Code用于 Visual Studio Code 的 C#&#xff08;最新版本&#xff09;.NET 7.0 SDK 创建Web应用 visual studio ctrl F5 …