STM32F407ZGT6 是意法半導(dǎo)體(STMicroelectronics)公司推出的一款高性能ARM Cortex-M4核心的32位微控制器(MCU)。它是 STM32F4 系列的一員,具備強(qiáng)大的處理能力和豐富的外設(shè)功能,適用于各種應(yīng)用領(lǐng)域。
【1】F407建工程所需依賴文件
【2】 新建工程
說明:STM32F4 的主頻最高是 168Mhz,所以我們一般設(shè)置 PLLCLK 為 168Mhz(M=8,N=336,P=2),通過 SW 選擇 SYSCLK=PLLCLK即可得到 168Mhz 的系統(tǒng)運(yùn)行頻率。
【3】分析LED硬件原理圖
【4】編寫LED驅(qū)動(dòng)代碼
查看數(shù)據(jù)手冊:
Led.c文件代碼如下:
#include "led.h"
/*
函數(shù)功能:LED初始化
硬件連接:
PF8-->BEEP --高電平響
PF9-->LED0 --低電平亮
PF10->LED1 --低電平亮
*/
void LED_Init(void)
{
/*1. 開時(shí)鐘*/
RCC->AHB1ENR|=1<<5;//使能PORTF時(shí)鐘
/*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口輸出默認(rèn)電平*/
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】編寫無源蜂鳴器驅(qū)動(dòng)代碼
Delay.c延時(shí)函數(shù)代碼
#include "delay.h"
/*
功能 :毫秒級別的延時(shí)函數(shù)
參數(shù) :填入延時(shí)的時(shí)間
返回值:無
說 明:頻率在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++);
}
/*
功能 :微秒級別的延時(shí)函數(shù)
參數(shù) :填入延時(shí)的時(shí)間
返回值:無
說 明:頻率在168MHZ情況下使用
*/
void DelayUs(u32 time)
{
u32 k;
while(time--)
{
k=40;
while(k--);
}
}
Led.c代碼
#include "led.h"
/*
函數(shù)功能:LED初始化
硬件連接:
PF8-->BEEP --高電平響
PF9-->LED0 --低電平亮
PF10->LED1 --低電平亮
*/
void LED_Init(void)
{
/*1. 開時(shí)鐘*/
RCC->AHB1ENR|=1<<5;//使能PORTF時(shí)鐘
/*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口輸出默認(rèn)電平*/
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
控制蜂鳴器:產(chǎn)生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 //關(guān)閉蜂鳴器
{
BEEP(0);
for(i=0;i<time;i++)DelayUs(250);
}
}
Mian.c主函數(shù)代碼
#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);
}
}