STM32F407 GPIO口输出配置配置步骤

描述

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

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

mcu

mcu

mcu

mcu

mcu

mcu

【2】 新建工程

mcu

mcu

mcu

mcu

mcu

mcu

mcu

mcu

mcu

mcu

mcu

mcu

mcu

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

【3】分析LED硬件原理图

mcu

mcu

mcu

【4】编写LED驱动代码

查看数据手册:

mcu

mcu

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】编译代码 配置下载

mcu

mcu

mcu

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

  审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分