您当前的位置:首页 > 电子 > 电气软件

STM32F407 GPIO口输出配置配置步骤

时间:11-09来源:作者:点击数:

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

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐