目录
一、LED灯
1.原理图
2.添加库文件
3.代码部分
led.h
#ifndef __LED_H__
#define __LED_H__
#include "stm32f4xx.h" // Device header
void LED_init(void); //初始化
void LED1_on(void); //打开LED1
void LED1_off(void); //关闭LED1
void LED2_on(void); //打开LED2
void LED2_off(void); //关闭LED2
void LED3_on(void); //关闭LED3
void LED3_off(void); //关闭LED3
#endif
led.c
#include "led.h"
/*********************************************
*功能:初始化LED灯
*参数:无
*返回值:无
*其他:
*根据原理图
* LED1 ---- PE8
* LED1 ---- PE9
* LED1 ---- PE10
* 高电平灭,低电平亮
***********************************************/
void LED_init(void)
{
/*********1.开启时钟******************************/
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);
/*********2.初始化GPIO相关引脚*********************/
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; //模式:输出模式
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; //输出:推挽
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10; //引脚:8、9、10
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; //上下拉:上拉
GPIO_Init(GPIOE,&GPIO_InitStruct);
/*********3.初始化引脚状态*********************/
GPIO_SetBits(GPIOE,GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10); //引脚给高电平,默认灭灯
}
/*********************************************
*功能:开LED1灯
*参数:无
*返回值:无
*其他:
*根据原理图
* LED1 ---- PE8
* LED1 ---- PE9
* LED1 ---- PE10
* 高电平灭,低电平亮
***********************************************/
void LED1_on(void)
{
GPIO_ResetBits(GPIOE,GPIO_Pin_8); //引脚给低电平,亮灯
}
/*********************************************
*功能:关LED1灯
*参数:无
*返回值:无
*其他:
*根据原理图
* LED1 ---- PE8
* LED1 ---- PE9
* LED1 ---- PE10
* 高电平灭,低电平亮
***********************************************/
void LED1_off(void)
{
GPIO_SetBits(GPIOE,GPIO_Pin_8); //引脚给高电平,灭灯
}
/*********************************************
*功能:开LED2灯
*参数:无
*返回值:无
*其他:
*根据原理图
* LED1 ---- PE8
* LED1 ---- PE9
* LED1 ---- PE10
* 高电平灭,低电平亮
***********************************************/
void LED2_on(void)
{
GPIO_ResetBits(GPIOE,GPIO_Pin_9); //引脚给低电平,亮灯
}
/*********************************************
*功能:关LED2灯
*参数:无
*返回值:无
*其他:
*根据原理图
* LED1 ---- PE8
* LED1 ---- PE9
* LED1 ---- PE10
* 高电平灭,低电平亮
***********************************************/
void LED2_off(void)
{
GPIO_SetBits(GPIOE,GPIO_Pin_9); //引脚给低电平,亮灯
}
/*********************************************
*功能:开LED3灯
*参数:无
*返回值:无
*其他:
*根据原理图
* LED1 ---- PE8
* LED1 ---- PE9
* LED1 ---- PE10
* 高电平灭,低电平亮
***********************************************/
void LED3_on(void)
{
GPIO_ResetBits(GPIOE,GPIO_Pin_10); //引脚给低电平,亮灯
}
/*********************************************
*功能:关LED3灯
*参数:无
*返回值:无
*其他:
*根据原理图
* LED1 ---- PE8
* LED1 ---- PE9
* LED1 ---- PE10
* 高电平灭,低电平亮
***********************************************/
void LED3_off(void)
{
GPIO_SetBits(GPIOE,GPIO_Pin_10); //引脚给低电平,亮灯
}
二、蜂鸣器
1.基本概述
蜂鸣器:分为有源和无源,有源给电就能用,无源需要自己配置信号源。
三极管:分为基极(Base)、发射极(Emitter)和集电极(Collecor) ,作用是小电流控制大电流,放大信号。
2.原理图
3.代码部分
beep.h
#ifndef __BEEP_H__
#define __BEEP_H__
#include "stm32f4xx.h" // Device header
void BEEP_init(void); //初始化蜂鸣器
void BEEP_on(void); //开启蜂鸣器
void BEEP_off(void); //关闭蜂鸣器
#endif
beep.c
#include "beep.h"
/*********************************************
*功能:初始化BEEP蜂鸣器
*参数:无
*返回值:无
*其他:
* 根据原理图
* BEEP ---- PB10
* 高电平响,低电平不响
***********************************************/
void BEEP_init(void)
{
/**********1.使能GPIOB 外设时钟 ********************/
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
/**********2.初始化GPIO相关引脚**********************/
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; //模式:输出
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; //输出:推挽
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10; //引脚:10
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; //上下拉:上拉
GPIO_Init(GPIOB,&GPIO_InitStruct);
/************************END*************************/
/***************3.设置默认电平(不响)***************/
GPIO_ResetBits(GPIOB,GPIO_Pin_10);
}
/*********************************************
*功能:打开BEEP蜂鸣器
*参数:无
*返回值:无
*其他:
* 根据原理图
* BEEP ---- PB10
* 高电平响,低电平不响
***********************************************/
void BEEP_on(void)
{
GPIO_SetBits(GPIOB,GPIO_Pin_10); //高电平响
}
/*********************************************
*功能:关闭BEEP蜂鸣器
*参数:无
*返回值:无
*其他:
* 根据原理图
* BEEP ---- PB10
* 高电平响,低电平不响
***********************************************/
void BEEP_off(void)
{
GPIO_ResetBits(GPIOB,GPIO_Pin_10); //低电平不响
}
三、按键
1.原理图
2.代码部分
key.h
#ifndef __KEY_H__
#define __KEY_H__
#include "stm32f4xx.h" // Device header
void KEY_Init(void); //初始化KEY按键
u8 KEY_Scan(void); //扫描按键获取键值
#endif
key.c
#include "key.h"
/*********************************************
*功能:初始化KEY按键
*参数:无
*返回值:无
*其他:
* 原理图
* KEY1 ---- PE4
* KEY2 ---- PE5
* KEY3 ---- PE6
* KEY4 ---- PC13
***********************************************/
void KEY_Init(void)
{
/*******1.使能外设时钟***************/
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOE,ENABLE);
/*******2.初始化GPIO引脚*************/
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN; //模式:输入
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13; //引脚: 13
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; //上下拉: 上拉
GPIO_Init(GPIOC, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6; //引脚: 4、5、6
GPIO_Init(GPIOE, &GPIO_InitStruct);
}
/*********************************************
*功能:扫描按键
*参数:无
*返回值:KEY1返回1,KEY2返回2,KEY3返回3,KEY4返回4,无按键返回0
*其他:
* 原理图
* KEY1 ---- PE4
* KEY2 ---- PE5
* KEY3 ---- PE6
* KEY4 ---- PC13
***********************************************/
#define KEY1 GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_4)
#define KEY2 GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_5)
#define KEY3 GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_6)
#define KEY4 GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13)
extern void delay_ms();
u8 KEY_Scan(void)
{
static u8 flag = 1; //无键按下标志位为1
if( (!KEY1 || !KEY2 || !KEY3 || !KEY4) && (flag == 1))
{
flag = 0;
delay_ms(5); //消抖
if(!KEY1) return 1;
if(!KEY2) return 2;
if(!KEY3) return 3;
if(!KEY4) return 4;
}
if( KEY1 && KEY2 && KEY3 && KEY4)
{
flag = 1;
}
return 0;
}
main.c
#include "stm32f4xx.h" // Device header
#include "key.h"
#include "led.h"
#include "beep.h"
/*********************************************
*功能:粗略毫秒定时
*参数:
* ms:毫秒()
*返回值:无
*其他:无
***********************************************/
void delay_ms(uint32_t ms)
{
for(uint32_t i=0 ; i < (ms * 10000) ;i++)
{
__NOP();
}
}
int main()
{
/*************1.调用初始化函数*******************/
KEY_Init();
LED_init();
BEEP_init();
/**************2.定义相关变量********************/
u8 key;
/**************3.进入操作************************/
while(1)
{
key = KEY_Scan(); //获取键值
switch(key)
{
case 1 :
GPIO_ToggleBits(GPIOE, GPIO_Pin_8); //LED1位反转
break;
case 2 :
GPIO_ToggleBits(GPIOE, GPIO_Pin_9); //LED2位反转
break;
case 3 :
GPIO_ToggleBits(GPIOE, GPIO_Pin_10); //LED3位反转
break;
case 4 :
GPIO_ToggleBits(GPIOC, GPIO_Pin_13); //LED4位反转
break;
}
}
}
四、系统时钟
1.时钟源和锁相环
LSI: 低速内部时钟
LSE:低速外部时钟
HSI: 高速内部时钟
HSE:高速外部时钟
PLL: 锁相环
2.原理图
3.滴答定时器(SysTick)
3.1原理图
3.2代码部分(ms与us定时器)
systick.h
#ifndef __SYSTICK_H__
#define __SYSTICK_H__
#include "stm32f4xx.h" // Device header
void systick_Init(u8 SYSTICK); //初始化滴答定时器
void delay_us(u32 us); //微秒定时器
void delay_ms(u32 ms); //毫秒定时器
#endif
systick.c
#include "systick.h"
u32 _us;
/**************************************
功能:初始化滴答定时器
参数:
@SYSTICK:时钟频率
返回值:无
其他:
****************************************/
void systick_Init(u8 SYSTICK)
{
//配置时钟为八分频
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
//一微秒跳动次数
_us = SYSTICK / 8; // 168/8 = 21
}
/**************************************
功能:微秒定时器
参数:
@us:微秒
返回值:无
其他:
****************************************/
void delay_us(u32 us)
{
SysTick->VAL = 0; //初始化当前计数值
SysTick->LOAD = us * _us; //装载计数
SysTick->CTRL |= 0x1; //使能嘀嗒时钟
while( !((SysTick->CTRL >> 16) & 0x1) )
{
}
SysTick->VAL = 0; //重置计数值
SysTick->CTRL &= ~(0x1); //关闭嘀嗒时钟
}
/**************************************
功能:毫秒定时器
参数:
@ms:毫秒
返回值:无
其他:
****************************************/
void delay_ms(u32 ms)
{
while(ms--)
{
delay_us(1000);
}
}