(相关资料图)
STM32F407ZGT6 是意法半导体(STMicroelectronics)公司推出的一款高性能ARMCortex-M4核心的32位微控制器(MCU)。它是 STM32F4 系列的一员,具备强大的处理能力和丰富的外设功能,适用于各种应用领域。
【1】F407建工程所需依赖文件【2】 新建工程**说明:STM32F4 的主频最高是 168Mhz,所以我们一般设置 PLLCLK 为 168Mhz(M=8,N=336,P=2),通过 SW 选择 SYSCLK=PLLCLK即可得到 168Mhz 的系统运行频率。**
【3】分析LED硬件原理图【4】编写LED驱动代码查看数据手册:
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】编译代码 配置下载【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); } }
审核编辑:汤梓红
Copyright © 2015-2022 热讯创投网版权所有 备案号:豫ICP备20005723号-6 联系邮箱:29 59 11 57 8@qq.com