STM32F407 GPIO口输出配置配置步骤

发布时间:2024-09-02  

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

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

 }

 }


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>