网站首页 全球最实用的IT互联网站!

人工智能P2P分享Wind搜索发布信息网站地图标签大全

当前位置:诺佳网 > 电子/半导体 > 控制/MCU >

STM32F407 GPIO口输出配置配置步骤

时间:2023-07-06 14:27

人气:

作者:admin

标签:

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

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);
 }
 }
 ​

审核编辑:汤梓红

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信