2025年4月5日 星期六 乙巳(蛇)年 正月初六 设为首页 加入收藏
rss
您当前的位置:首页 > 电子 > 电气软件

STM32F407 GPIO口输出配置配置步骤

时间:11-09来源:作者:点击数: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);
  • }
  • }
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐