STM32F407入门开发: GPIO口输出配置

举报
DS小龙哥 发表于 2022/02/27 12:41:16 2022/02/27
【摘要】 本章节作为入门章节: 学习如何新建工程、查看原理图、配置GPIO模式、完成蜂鸣器与LED灯控制。最开始的一步应该是安装keil软件,安装F407的包,然后再开始开发,后面再补上keil安装教程。

第一章 F407建工程所需依赖文件

image.png

image.png

image.png

image.png

image.png

image.png

第二章 新建工程

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

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

第三章 分析LED硬件原理图

image.png

image.png

image.png

第四章 编写LED驱动代码

查看数据手册:

image.png

image.png

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
}

第五章 编译代码 配置下载

image.png

image.png

image.png

第六章 编写无源蜂鸣器驱动代码

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

第七章 LED呼吸灯示例

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

int main(void)
{
		u32 i,k=1000;
		LED_Init();
		while(1)
		{
			 for(i=0;i<k;i++)
			 {
				 LED0(0);
				 LED1(0);
				// BEEP(0);
				 DelayUs(i); //亮的时间
				 LED0(1);
				 LED1(1);
				 //BEEP(1);
				 DelayUs(k-i); //灭的时间
			 }
			 
			 for(i=0;i<k;i++)
			 {
				 LED0(1);
				 LED1(1);
				 //BEEP(1);
				 DelayUs(i);   //灭的时间
				 LED0(0);
				 LED1(0);
				// BEEP(0);
				 DelayUs(k-i); //亮的时间
			 }
		}
}

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。