IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 基于STM32F407ZE粤嵌GEC-M4开发板的呼吸灯、外部中断、定时器延时、PWM及按键密码系统 -> 正文阅读

[嵌入式]基于STM32F407ZE粤嵌GEC-M4开发板的呼吸灯、外部中断、定时器延时、PWM及按键密码系统

基于STM32F407ZE粤嵌GEC-M4开发板的呼吸灯、外部中断、定时器延时、PWM及按键密码系统
沿用https://blog.csdn.net/weixin_53403301/article/details/121531067?spm=1001.2014.3001.5502
的改进
直接上代码:

# include "stm32f4xx.h"
# include  "GPIO.h"
# include  "DELAY.h"

//外部中断0初始化 PA0
void init_EXTI0(void)
{
	//定义GPIO结构体
	GPIO_InitTypeDef GPIO_KEEY_InitStruct;
	//使能GPIOF时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
	//初始化结构体
	GPIO_KEEY_InitStruct.GPIO_Pin  = GPIO_Pin_0; //定义引脚
	GPIO_KEEY_InitStruct.GPIO_Mode = GPIO_Mode_IN;  //定义输出模式
	GPIO_KEEY_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;	//定义速度
	GPIO_KEEY_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;		//定义是否有上下拉电阻 普通
	//将结构体给GPIOF组
	GPIO_Init(GPIOA,&GPIO_KEEY_InitStruct);
	//选择中断线 中断0 PA组
	SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource0); 
	//使能中断时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); 
	//配置中断
	EXTI_InitTypeDef EXTI_InitStruct;
	EXTI_InitStruct.EXTI_Line = EXTI_Line0;
	EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
	EXTI_InitStruct.EXTI_LineCmd = ENABLE;
	EXTI_Init(&EXTI_InitStruct);
	//嵌套向量中断控制器 
	NVIC_InitTypeDef NVIC_InitStruct;
	NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x0; //中断抢占优先级
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x0; //响应优先级
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStruct);
}
//外部中断4初始化 PE4
void init_EXTI4(void)
{
	//定义GPIO结构体
	GPIO_InitTypeDef GPIO_KEEY_InitStruct;
	//使能GPIOF时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
	//初始化结构体
	GPIO_KEEY_InitStruct.GPIO_Pin  = GPIO_Pin_4; //定义引脚
	GPIO_KEEY_InitStruct.GPIO_Mode = GPIO_Mode_IN;  //定义输出模式
	GPIO_KEEY_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;	//定义速度
	GPIO_KEEY_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;		//定义是否有上下拉电阻 普通
	//将结构体给GPIOF组
	GPIO_Init(GPIOE,&GPIO_KEEY_InitStruct);
	//选择中断线 中断0 PA组
	SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource4); 
	//使能中断时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); 
	//配置中断
	EXTI_InitTypeDef EXTI_InitStruct;
	EXTI_InitStruct.EXTI_Line = EXTI_Line4;
	EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
	EXTI_InitStruct.EXTI_LineCmd = ENABLE;
	
	//嵌套向量中断控制器 
	NVIC_InitTypeDef NVIC_InitStruct;
	NVIC_InitStruct.NVIC_IRQChannel = EXTI4_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x0; //中断抢占优先级
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x0; //响应优先级
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStruct);
	EXTI_Init(&EXTI_InitStruct);
}
//外部中断0初始化 PA0
void close_EXTI0(void)
{
	//定义GPIO结构体
	GPIO_InitTypeDef GPIO_KEEY_InitStruct;
	//使能GPIOF时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
	//初始化结构体
	GPIO_KEEY_InitStruct.GPIO_Pin  = GPIO_Pin_0; //定义引脚
	GPIO_KEEY_InitStruct.GPIO_Mode = GPIO_Mode_IN;  //定义输出模式
	GPIO_KEEY_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;	//定义速度
	GPIO_KEEY_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;		//定义是否有上下拉电阻 普通
	//将结构体给GPIOF组
	GPIO_Init(GPIOA,&GPIO_KEEY_InitStruct);
	//选择中断线 中断0 PA组
	SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource0); 
	//使能中断时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); 
	//配置中断
	EXTI_InitTypeDef EXTI_InitStruct;
	EXTI_InitStruct.EXTI_Line = EXTI_Line0;
	EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
	EXTI_InitStruct.EXTI_LineCmd = DISABLE;  //关闭外部中断
	EXTI_Init(&EXTI_InitStruct);
	//嵌套向量中断控制器 
	NVIC_InitTypeDef NVIC_InitStruct;
	NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x0; //中断抢占优先级
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x0; //响应优先级
	NVIC_InitStruct.NVIC_IRQChannelCmd = DISABLE;  //这一项关闭的话 定时器也会关闭
	NVIC_Init(&NVIC_InitStruct);
}
//外部中断4初始化 PE4
void close_EXTI4(void)
{
	//定义GPIO结构体
	GPIO_InitTypeDef GPIO_KEEY_InitStruct;
	//使能GPIOF时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
	//初始化结构体
	GPIO_KEEY_InitStruct.GPIO_Pin  = GPIO_Pin_4; //定义引脚
	GPIO_KEEY_InitStruct.GPIO_Mode = GPIO_Mode_IN;  //定义输出模式
	GPIO_KEEY_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;	//定义速度
	GPIO_KEEY_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;		//定义是否有上下拉电阻 普通
	//将结构体给GPIOF组
	GPIO_Init(GPIOE,&GPIO_KEEY_InitStruct);
	//选择中断线 中断0 PA组
	SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource4); 
	//使能中断时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); 
	//配置中断
	EXTI_InitTypeDef EXTI_InitStruct;
	EXTI_InitStruct.EXTI_Line = EXTI_Line4;
	EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
	EXTI_InitStruct.EXTI_LineCmd = DISABLE;  //关闭外部中断
	EXTI_Init(&EXTI_InitStruct);
	//嵌套向量中断控制器 
	NVIC_InitTypeDef NVIC_InitStruct;
	NVIC_InitStruct.NVIC_IRQChannel = EXTI4_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x1; //中断抢占优先级
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x1; //响应优先级
	NVIC_InitStruct.NVIC_IRQChannelCmd = DISABLE;  //这一项关闭的话 定时器也会关闭
	NVIC_Init(&NVIC_InitStruct);
}
//GPIOF_9_10初始化使能 低电平
void init_GPIOF_9_10_OUT()
{
	//定义GPIO结构体
	GPIO_InitTypeDef GPIOF_InitStruct;
	//使能GPIOF时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
	//初始化结构体
	GPIOF_InitStruct.GPIO_Pin  = GPIO_Pin_9 | GPIO_Pin_10; //定义引脚
	GPIOF_InitStruct.GPIO_Mode = GPIO_Mode_OUT;  //定义输出模式
	GPIOF_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;	//定义速度
	GPIOF_InitStruct.GPIO_OType = GPIO_OType_PP;		//定义推免输出
	GPIOF_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;		//定义是否有上下拉电阻 普通
	//将结构体给GPIOF组
	GPIO_Init(GPIOF,&GPIOF_InitStruct);
}

void init_GPIOE_13_14_OUT()
{
	//定义GPIO结构体
	GPIO_InitTypeDef GPIOE_InitStruct;
	//使能GPIOF时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
	//初始化结构体
	GPIOE_InitStruct.GPIO_Pin  = GPIO_Pin_13 | GPIO_Pin_14; //定义引脚
	GPIOE_InitStruct.GPIO_Mode = GPIO_Mode_OUT;  //定义输出模式
	GPIOE_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;	//定义速度
	GPIOE_InitStruct.GPIO_OType = GPIO_OType_PP;		//定义推挽输出
	GPIOE_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;		//定义是否有上下拉电阻 普通
	//将结构体给GPIOF组
	GPIO_Init(GPIOE,&GPIOE_InitStruct);
}

//两个引脚整体初始化函数
void init_GPIO_EF_OUT()
{
	//定义GPIO结构体
	GPIO_InitTypeDef GPIO_InitStruct;
	//使能GPIOF时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
	//初始化结构体
	GPIO_InitStruct.GPIO_Pin  = GPIO_Pin_9 | GPIO_Pin_10; //定义引脚
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;  //定义输出模式
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;	//定义速度
	GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;		//定义推挽输出
	GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;		//定义是否有上下拉电阻 普通
	//将结构体给GPIOF组
	GPIO_Init(GPIOF,&GPIO_InitStruct);
	
	GPIO_InitStruct.GPIO_Pin  = GPIO_Pin_13 | GPIO_Pin_14; //定义引脚
	//将结构体给GPIOE组
	GPIO_Init(GPIOE,&GPIO_InitStruct);
}

//蜂鸣器初始化
void init_BEEP(void)
{
	//定义GPIO结构体
	GPIO_InitTypeDef GPIOF_BEEP_InitStruct;
	//使能GPIOF时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
	//初始化结构体
	GPIOF_BEEP_InitStruct.GPIO_Pin  = GPIO_Pin_8; //定义引脚
	GPIOF_BEEP_InitStruct.GPIO_Mode = GPIO_Mode_OUT;  //定义输出模式
	GPIOF_BEEP_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;	//定义速度
	GPIOF_BEEP_InitStruct.GPIO_OType = GPIO_OType_PP;		//定义推挽输出
	GPIOF_BEEP_InitStruct.GPIO_PuPd = GPIO_PuPd_DOWN;		//定义是否有上下拉电阻 普通
	//将结构体给GPIOF组
	GPIO_Init(GPIOF,&GPIOF_BEEP_InitStruct);
}


void init_KEEY(void)
{
	//定义GPIO结构体
	GPIO_InitTypeDef GPIO_KEEY_InitStruct;
	//使能GPIOF时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
	//初始化结构体
	GPIO_KEEY_InitStruct.GPIO_Pin  = GPIO_Pin_0; //定义引脚
	GPIO_KEEY_InitStruct.GPIO_Mode = GPIO_Mode_IN;  //定义输出模式
	GPIO_KEEY_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;	//定义速度
	GPIO_KEEY_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;		//定义是否有上下拉电阻 普通
	//将结构体给GPIOF组
	GPIO_Init(GPIOA,&GPIO_KEEY_InitStruct);
	
	GPIO_KEEY_InitStruct.GPIO_Pin  = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
	GPIO_Init(GPIOE,&GPIO_KEEY_InitStruct);
}
//定时器3初始化
void init_TIM3(void)
{
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	//TIM_OCInitTypeDef  TIM_OCInitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	/* TIM3 clock enable */ //使能定时器3时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
	//重转载寄存器 定义计数值 决定了计数多少次就进行一次中断 不得大于分频以后的计数值 若改为5000为0.5秒
	TIM_TimeBaseStructure.TIM_Period = 10000-1;  
	TIM_TimeBaseStructure.TIM_Prescaler = 8400-1;  //定时器预分频 168000000/2/8400=10000 其值系统默认+1 每10000次计数为1秒
	TIM_TimeBaseStructure.TIM_ClockDivision = 0;  //选择计数模式 向上计数
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
	//设置中断触发方式 计数更新
	TIM_ITConfig(TIM3,TIM_IT_Update, ENABLE);
	
	/* Enable the TIM3 gloabal Interrupt *///使能定时器3的中断通道
	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	//使能定时器3
	TIM_Cmd(TIM3, ENABLE);
}
//定时器2初始化
void init_TIM2(void)
{
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	//TIM_OCInitTypeDef  TIM_OCInitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	/* TIM2 clock enable */ //使能定时器2时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	//重转载寄存器 定义计数值 决定了计数多少次就进行一次中断 不得大于分频以后的计数值 若改为5000为0.5秒
	TIM_TimeBaseStructure.TIM_Period = 5000-1;  
	TIM_TimeBaseStructure.TIM_Prescaler = 8400-1;  //定时器预分频 168000000/2/8400=10000 其值系统默认+1 每10000次计数为1秒
	TIM_TimeBaseStructure.TIM_ClockDivision = 0;  //选择计数模式 向上计数
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
	//设置中断触发方式 计数更新
	TIM_ITConfig(TIM2,TIM_IT_Update, ENABLE);
	
	/* Enable the TIM2 gloabal Interrupt *///使能定时器2的中断通道
	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	//使能定时器2
	TIM_Cmd(TIM2, ENABLE);
}
//定时器14及PF9复用PWM初始化
void init_TIM14_PF9(void)
{
	//定义GPIO结构体
	GPIO_InitTypeDef GPIOF_InitStruct;
	//使能GPIOF时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
	//初始化结构体
	GPIOF_InitStruct.GPIO_Pin  = GPIO_Pin_9; //定义引脚
	GPIOF_InitStruct.GPIO_Mode = GPIO_Mode_AF;  //定义输出模式
	GPIOF_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;	//定义速度
	GPIOF_InitStruct.GPIO_OType = GPIO_OType_PP;		//定义推免输出
	GPIOF_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;		//定义是否有上下拉电阻 普通
	//复用功能 定时器14
	GPIO_PinAFConfig(GPIOF, GPIO_PinSource9, GPIO_AF_TIM14);
	//将结构体给GPIOF组
	GPIO_Init(GPIOF,&GPIOF_InitStruct);
	
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;  //定时器复用功能结构体
	//NVIC_InitTypeDef NVIC_InitStructure;
	/* TIM3 clock enable */ //使能定时器3时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14, ENABLE);
	//重转载寄存器 定义计数值 决定了计数多少次就进行一次中断 不得大于分频以后的计数值 若改为5000为0.5秒
	TIM_TimeBaseStructure.TIM_Period = 100-1;  //10ms周期
	TIM_TimeBaseStructure.TIM_Prescaler = 8400-1;  //定时器预分频 168000000/2/8400=10000 其值系统默认+1 每10000次计数为1秒
	TIM_TimeBaseStructure.TIM_ClockDivision = 0;  //选择计数模式 向上计数
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数
	TIM_TimeBaseInit(TIM14, &TIM_TimeBaseStructure);
	//设置中断触发方式 计数更新
	TIM_ITConfig(TIM14,TIM_IT_Update, ENABLE);
	
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;  //PWM模式1  有效状态为小于计数的比较值时
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  //输出使能
	TIM_OCInitStructure.TIM_Pulse = 0;  //设置比较值 小于x时为有效 总计数值为100 周期为10ms
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  //有效状态为高电平
	//输出化OC
	TIM_OC1Init(TIM14, &TIM_OCInitStructure);
	//使能OC
	TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable);
	
//	NVIC_InitTypeDef NVIC_InitStruct;
//	NVIC_InitStruct.NVIC_IRQChannel = TIM8_TRG_COM_TIM14_IRQn;
//	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0; //中断抢占优先级
//	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1; //响应优先级
//	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;  //这一项关闭的话 定时器也会关闭
//	NVIC_Init(&NVIC_InitStruct);
	
	TIM_Cmd(TIM14, ENABLE);
}
//定时器13及PF8复用PWM初始化
void init_TIM13_PF8(void)
{
	//定义GPIO结构体
	GPIO_InitTypeDef GPIOF_InitStruct;
	//使能GPIOF时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
	//初始化结构体
	GPIOF_InitStruct.GPIO_Pin  = GPIO_Pin_8; //定义引脚
	GPIOF_InitStruct.GPIO_Mode = GPIO_Mode_AF;  //定义输出模式
	GPIOF_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;	//定义速度
	GPIOF_InitStruct.GPIO_OType = GPIO_OType_PP;		//定义推免输出
	GPIOF_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;		//定义是否有上下拉电阻 普通
	//复用功能 定时器14
	GPIO_PinAFConfig(GPIOF, GPIO_PinSource8, GPIO_AF_TIM13);
	//将结构体给GPIOF组
	GPIO_Init(GPIOF,&GPIOF_InitStruct);
	
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;  //定时器复用功能结构体
	//NVIC_InitTypeDef NVIC_InitStructure;
	/* TIM3 clock enable */ //使能定时器3时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM13, ENABLE);
	//重转载寄存器 定义计数值 决定了计数多少次就进行一次中断 不得大于分频以后的计数值 若改为5000为0.5秒
	TIM_TimeBaseStructure.TIM_Period = 100-1;  //10ms周期
	TIM_TimeBaseStructure.TIM_Prescaler = 8400-1;  //定时器预分频 168000000/2/8400=10000 其值系统默认+1 每10000次计数为1秒
	TIM_TimeBaseStructure.TIM_ClockDivision = 0;  //选择计数模式 向上计数
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数
	TIM_TimeBaseInit(TIM13, &TIM_TimeBaseStructure);
	//设置中断触发方式 计数更新
	TIM_ITConfig(TIM13,TIM_IT_Update, ENABLE);
	
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;  //PWM模式1  有效状态为小于计数的比较值时
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  //输出使能
	TIM_OCInitStructure.TIM_Pulse = 0;  //设置比较值 小于x时为有效 总计数值为100 周期为10ms
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  //有效状态为高电平
	//输出化OC
	TIM_OC1Init(TIM13, &TIM_OCInitStructure);
	//使能OC
	TIM_OC1PreloadConfig(TIM13, TIM_OCPreload_Enable);

//	NVIC_InitTypeDef NVIC_InitStruct;
//	NVIC_InitStruct.NVIC_IRQChannel = TIM8_UP_TIM13_IRQn;
//	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0; //中断抢占优先级
//	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2; //响应优先级
//	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;  //这一项关闭的话 定时器也会关闭
//	NVIC_Init(&NVIC_InitStruct);
	
	TIM_Cmd(TIM13, ENABLE);
}
//按键密码锁循环函数
void mainloop(void)
{
	init_GPIOF_9_10_OUT();
	init_GPIOE_13_14_OUT();
	init_BEEP();
	init_KEEY();
	
	int x;
	int y;
	int flag=0;
	delay_ms(500);
	
	while(1)
	{
		if(PA_I(0)==0)
		{
			PF_O(9)=0;
		}
		if(PE_I(2)==0)
		{
			PF_O(10)=0;
		}
		if(PE_I(3)==0)
		{
			PE_O(13)=0;
		}
		if(PE_I(4)==0)
		{
			PE_O(14)=0;
			PE_O(13)=0;
			PF_O(9)=0;
			PF_O(10)=0;
			delay_ms(500);
			break;
		}
		else
		{
			PF_O(9)=1;
			PF_O(10)=1;
			PE_O(13)=1;
			PE_O(14)=1;
		}
	}
	
	while(1)//按键锁循环
	{
		int buf[4];
		uint8_t key0 = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0);
		uint8_t key1 = GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2);
		uint8_t key2 = GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3);
		uint8_t key3 = GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4);
		GPIO_SetBits(GPIOF,GPIO_Pin_9);
		GPIO_SetBits(GPIOF,GPIO_Pin_10);
		GPIO_SetBits(GPIOE,GPIO_Pin_13);
		GPIO_SetBits(GPIOE,GPIO_Pin_14);
		
		if( key0 == Bit_RESET)
		{
			y=0;
			flag++;
			while(1){GPIO_ResetBits(GPIOF,GPIO_Pin_9);
				uint8_t key0 = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0);
				if(key0 == Bit_SET)GPIO_SetBits(GPIOF,GPIO_Pin_9);break;}
			delay_ms(500);
		}
		if( key1 == Bit_RESET)
		{
			y=1;
			flag++;
			while(1){GPIO_ResetBits(GPIOF,GPIO_Pin_10);
				uint8_t key1 = GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2);
				if(key1 == Bit_SET)GPIO_SetBits(GPIOF,GPIO_Pin_10);break;}
			delay_ms(500);
		}
		if( key2 == Bit_RESET)
		{
			y=2;
			flag++;
			while(1){GPIO_ResetBits(GPIOE,GPIO_Pin_13);
				uint8_t key2 = GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3);
				if(key2 == Bit_SET)GPIO_SetBits(GPIOE,GPIO_Pin_13);break;}
			delay_ms(500);
		}
		if( key3 == Bit_RESET)
		{
			y=3;
			flag++;
			while(1){GPIO_ResetBits(GPIOE,GPIO_Pin_14);
				uint8_t key3 = GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4);
				if(key3 == Bit_SET)GPIO_SetBits(GPIOE,GPIO_Pin_14);break;}
			delay_ms(500);
		}
		if (flag >= 1){buf[flag-1]=y;}
		if (flag >= 4){
			buf[flag-1]=y;flag=0;
			if (buf[0]!=3 | buf[1]!=2 | buf[2]!=1 | buf[3]==0){
				GPIO_ResetBits(GPIOF,GPIO_Pin_9);
				GPIO_ResetBits(GPIOF,GPIO_Pin_10);
				GPIO_ResetBits(GPIOE,GPIO_Pin_13);
				GPIO_ResetBits(GPIOE,GPIO_Pin_14);
				delay_ms(500);
				GPIO_SetBits(GPIOF,GPIO_Pin_9);
				GPIO_SetBits(GPIOF,GPIO_Pin_10);
				GPIO_SetBits(GPIOE,GPIO_Pin_13);
				GPIO_SetBits(GPIOE,GPIO_Pin_14);
			}
			if (buf[0]==3 && buf[1]==2 && buf[2]==1 && buf[3]==0)
			{
				GPIO_SetBits(GPIOF,GPIO_Pin_9);GPIO_SetBits(GPIOF,GPIO_Pin_8);
				delay_us(10000);
				GPIO_SetBits(GPIOF,GPIO_Pin_10);GPIO_ResetBits(GPIOF,GPIO_Pin_8);
				delay_us(10000);
				GPIO_SetBits(GPIOE,GPIO_Pin_13);GPIO_SetBits(GPIOF,GPIO_Pin_8);
				delay_us(10000);
				GPIO_SetBits(GPIOE,GPIO_Pin_14);GPIO_ResetBits(GPIOF,GPIO_Pin_8);
				delay_us(10000);
				GPIO_ResetBits(GPIOF,GPIO_Pin_9);GPIO_SetBits(GPIOF,GPIO_Pin_8);
				delay_us(10000);
				GPIO_ResetBits(GPIOF,GPIO_Pin_10);GPIO_ResetBits(GPIOF,GPIO_Pin_8);
				delay_us(10000);
				GPIO_ResetBits(GPIOE,GPIO_Pin_13);GPIO_SetBits(GPIOF,GPIO_Pin_8);
				delay_us(10000);
				GPIO_ResetBits(GPIOE,GPIO_Pin_14);GPIO_ResetBits(GPIOF,GPIO_Pin_8);
				delay_us(10000);
				GPIO_ResetBits(GPIOE,GPIO_Pin_14);GPIO_SetBits(GPIOF,GPIO_Pin_8);
				delay_us(10000);
				GPIO_ResetBits(GPIOE,GPIO_Pin_13);GPIO_ResetBits(GPIOF,GPIO_Pin_8);
				delay_us(10000);
				GPIO_ResetBits(GPIOF,GPIO_Pin_10);GPIO_SetBits(GPIOF,GPIO_Pin_8);
				delay_us(10000);
				GPIO_ResetBits(GPIOF,GPIO_Pin_9);GPIO_ResetBits(GPIOF,GPIO_Pin_8);
				delay_us(10000);
				GPIO_SetBits(GPIOE,GPIO_Pin_14);GPIO_SetBits(GPIOF,GPIO_Pin_8);
				delay_us(10000);
				GPIO_SetBits(GPIOE,GPIO_Pin_13);GPIO_ResetBits(GPIOF,GPIO_Pin_8);
				delay_us(10000);
				GPIO_SetBits(GPIOF,GPIO_Pin_10);GPIO_SetBits(GPIOF,GPIO_Pin_8);
				delay_us(10000);
				GPIO_SetBits(GPIOF,GPIO_Pin_9);GPIO_ResetBits(GPIOF,GPIO_Pin_8);
				delay_us(10000);	
				break;
			}
		}	
	}
	
	while(1)//主循环
	{
		uint8_t key0 = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0);
		uint8_t key1 = GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2);
		uint8_t key2 = GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3);
		uint8_t key3 = GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4);
		GPIO_SetBits(GPIOF,GPIO_Pin_9);
		GPIO_SetBits(GPIOF,GPIO_Pin_10);
		GPIO_SetBits(GPIOE,GPIO_Pin_13);
		GPIO_SetBits(GPIOE,GPIO_Pin_14);
		if( key0 == Bit_RESET) //低电平
		{
			GPIO_ResetBits(GPIOF,GPIO_Pin_10);
			GPIO_ResetBits(GPIOF,GPIO_Pin_9);
			GPIO_ResetBits(GPIOE,GPIO_Pin_13);
			GPIO_ResetBits(GPIOE,GPIO_Pin_14);
			GPIO_SetBits(GPIOF,GPIO_Pin_8);
		}
		if( key1 == Bit_RESET) //低电平
		{
			GPIO_SetBits(GPIOF,GPIO_Pin_10);
			GPIO_SetBits(GPIOF,GPIO_Pin_9);
			GPIO_SetBits(GPIOE,GPIO_Pin_14);
			GPIO_SetBits(GPIOE,GPIO_Pin_13);
			GPIO_ResetBits(GPIOF,GPIO_Pin_8);
		}
		if( key2 == Bit_RESET) //低电平
		{
			x=1;
			while(x--)
			{
				GPIO_SetBits(GPIOF,GPIO_Pin_9);//GPIO_SetBits(GPIOF,GPIO_Pin_8);
				delay_us(10000);
				GPIO_SetBits(GPIOF,GPIO_Pin_10);//GPIO_ResetBits(GPIOF,GPIO_Pin_8);
				delay_us(10000);
				GPIO_SetBits(GPIOE,GPIO_Pin_13);//GPIO_SetBits(GPIOF,GPIO_Pin_8);
				delay_us(10000);
				GPIO_SetBits(GPIOE,GPIO_Pin_14);//GPIO_ResetBits(GPIOF,GPIO_Pin_8);
				delay_us(10000);
				GPIO_ResetBits(GPIOF,GPIO_Pin_9);//GPIO_SetBits(GPIOF,GPIO_Pin_8);
				delay_us(10000);
				GPIO_ResetBits(GPIOF,GPIO_Pin_10);//GPIO_ResetBits(GPIOF,GPIO_Pin_8);
				delay_us(10000);
				GPIO_ResetBits(GPIOE,GPIO_Pin_13);//GPIO_SetBits(GPIOF,GPIO_Pin_8);
				delay_us(10000);
				GPIO_ResetBits(GPIOE,GPIO_Pin_14);//GPIO_ResetBits(GPIOF,GPIO_Pin_8);
				delay_us(10000);
			}
		}
			if( key3 == Bit_RESET) //低电平
		{
			x=1;
			while(x--)
			{
				GPIO_ResetBits(GPIOE,GPIO_Pin_14);//GPIO_SetBits(GPIOF,GPIO_Pin_8);
				delay_us(10000);
				GPIO_ResetBits(GPIOE,GPIO_Pin_13);//GPIO_ResetBits(GPIOF,GPIO_Pin_8);
				delay_us(10000);
				GPIO_ResetBits(GPIOF,GPIO_Pin_10);//GPIO_SetBits(GPIOF,GPIO_Pin_8);
				delay_us(10000);
				GPIO_ResetBits(GPIOF,GPIO_Pin_9);//GPIO_ResetBits(GPIOF,GPIO_Pin_8);
				delay_us(10000);
				GPIO_SetBits(GPIOE,GPIO_Pin_14);//GPIO_SetBits(GPIOF,GPIO_Pin_8);
				delay_us(10000);
				GPIO_SetBits(GPIOE,GPIO_Pin_13);//GPIO_ResetBits(GPIOF,GPIO_Pin_8);
				delay_us(10000);
				GPIO_SetBits(GPIOF,GPIO_Pin_10);//GPIO_SetBits(GPIOF,GPIO_Pin_8);
				delay_us(10000);
				GPIO_SetBits(GPIOF,GPIO_Pin_9);//GPIO_ResetBits(GPIOF,GPIO_Pin_8);
				delay_us(10000);				
			}
		}
	}
}
void breath_LED(void)
{
	TIM_SetCompare1(TIM14,100);  //设置比较值
	TIM_SetCompare1(TIM13,0);
	int PWM;
	while(PE_I(2)==0)
	{
		for(PWM=100;PWM>0;PWM--)
		{
			TIM_SetCompare1(TIM14,100-PWM);  //设置比较值
			TIM_SetCompare1(TIM13,100-PWM);
			delay_ms(10);
			if(PE_I(2)==1)
			{
				TIM_SetCompare1(TIM14,100);  //设置比较值
				TIM_SetCompare1(TIM13,0);
				break;
			}
		}
		for(PWM=0;PWM<100;PWM++)
		{
			TIM_SetCompare1(TIM14,100-PWM);  //设置比较值
			TIM_SetCompare1(TIM13,100-PWM);
			delay_ms(10);
			if(PE_I(2)==1)
			{
				TIM_SetCompare1(TIM14,100);  //设置比较值
				TIM_SetCompare1(TIM13,0);
				break;
			}
		}
		if(PE_I(2)==1)
		{
			TIM_SetCompare1(TIM14,100);  //设置比较值
			TIM_SetCompare1(TIM13,0);
			break;
		}
	}
}
//主函数
int main(void)
{
//	init_GPIOF_9_10_OUT();
//	init_GPIOE_13_14_OUT();
	init_GPIO_EF_OUT();
	init_BEEP();
	init_KEEY();
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);  //设置中断组 分配优先级
	init_EXTI0();
	init_EXTI4();

	init_TIM14_PF9();
	init_TIM13_PF8();
	
	delay_ms(500);
	PF_O(9)=1;
	PF_O(10)=1;
	PE_O(13)=1;
	PE_O(14)=1;
	
	TIM_SetCompare1(TIM14,100);  //设置比较值
	TIM_SetCompare1(TIM13,0);
	while(1)
	{
		breath_LED();
	}
}


//中断0
void EXTI0_IRQHandler(void)
{
	delay_us(100000);
	if(EXTI_GetFlagStatus(EXTI_Line0) == SET) //中断产生
	{
		TIM_SetCompare1(TIM14,100);  //设置比较值
		TIM_SetCompare1(TIM13,0);
		init_TIM3();
		init_TIM2();
		PE_O(14)=0;
		delay_us(100000);
		PE_O(14)=1;
	}
	//结束后清空标志位
	EXTI_ClearITPendingBit(EXTI_Line0);
}
//中断4
void EXTI4_IRQHandler(void)
{
	delay_us(100000);
	if(EXTI_GetFlagStatus(EXTI_Line4) == SET) //中断产生
	{
		int z = 5;
		while(z--)
		{
			PE_O(14)=0;
			delay_us(50000);
			PE_O(14)=1;
			delay_us(50000);
		}
	}
	//结束后清空标志位
	EXTI_ClearITPendingBit(EXTI_Line4);
	close_EXTI0();
	close_EXTI4();
	mainloop();
}
//定时器3中断服务函数
void TIM3_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM3,TIM_IT_Update) == SET)
	{
		PE_O(13)^=1;
	}
	TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
}
//定时器2中断服务函数
void TIM2_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM2,TIM_IT_Update) == SET)
	{
		PF_O(10)^=1;
	}
	TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
}

DELAY.c:

# include "stm32f4xx.h"

void delay_ms(unsigned int ms)
{
	while(ms--)
	{
		SysTick->CTRL = 0; // Disable SysTick  关闭系统定时器
		SysTick->LOAD = 168000000/1000-1; // Count from 255 to 0 (256 cycles)  载入计数值 定时器从这个值开始计数
		SysTick->VAL = 0; // Clear current value as well as count flag  清空计数值到达0后的标记
		SysTick->CTRL = 5; // Enable SysTick timer with processor clock  使能168MHz的系统定时器
		while ((SysTick->CTRL & 0x00010000)==0);// Wait until count flag is set  等待
	}
	SysTick->CTRL = 0; // Disable SysTick  关闭系统定时器
}
void delay_us(unsigned int us)
{
	while(us--)
	{
		SysTick->CTRL = 0; // Disable SysTick  关闭系统定时器
		SysTick->LOAD = 168000000/1000/1000-1; // Count from 255 to 0 (256 cycles)  载入计数值 定时器从这个值开始计数
		SysTick->VAL = 0; // Clear current value as well as count flag  清空计数值到达0后的标记
		SysTick->CTRL = 5; // Enable SysTick timer with processor clock  使能168MHz的系统定时器
		while ((SysTick->CTRL & 0x00010000)==0);// Wait until count flag is set  等待
	}
	SysTick->CTRL = 0; // Disable SysTick  关闭系统定时器
}

GPIO.H

#ifndef __GPIO_H__
#define __GPIO_H__

#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) 
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr)) 
#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum)) 

#define GPIOA_ODR_Addr    (GPIOA_BASE+20) //0x40020014
#define GPIOB_ODR_Addr    (GPIOB_BASE+20) //0x40020414 
#define GPIOC_ODR_Addr    (GPIOC_BASE+20) //0x40020814 
#define GPIOD_ODR_Addr    (GPIOD_BASE+20) //0x40020C14 
#define GPIOE_ODR_Addr    (GPIOE_BASE+20) //0x40021014 
#define GPIOF_ODR_Addr    (GPIOF_BASE+20) //0x40021414    
#define GPIOG_ODR_Addr    (GPIOG_BASE+20) //0x40021814   
#define GPIOH_ODR_Addr    (GPIOH_BASE+20) //0x40021C14    
#define GPIOI_ODR_Addr    (GPIOI_BASE+20) //0x40022014     

#define GPIOA_IDR_Addr    (GPIOA_BASE+16) //0x40020010 
#define GPIOB_IDR_Addr    (GPIOB_BASE+16) //0x40020410 
#define GPIOC_IDR_Addr    (GPIOC_BASE+16) //0x40020810 
#define GPIOD_IDR_Addr    (GPIOD_BASE+16) //0x40020C10 
#define GPIOE_IDR_Addr    (GPIOE_BASE+16) //0x40021010 
#define GPIOF_IDR_Addr    (GPIOF_BASE+16) //0x40021410 
#define GPIOG_IDR_Addr    (GPIOG_BASE+16) //0x40021810 
#define GPIOH_IDR_Addr    (GPIOH_BASE+16) //0x40021C10 
#define GPIOI_IDR_Addr    (GPIOI_BASE+16) //0x40022010 
 
#define PA_O(n)   	BIT_ADDR(GPIOA_ODR_Addr,n)  //输出 
#define PA_I(n)    	BIT_ADDR(GPIOA_IDR_Addr,n)  //输入 

#define PB_O(n)   	BIT_ADDR(GPIOB_ODR_Addr,n)  //输出 
#define PB_I(n)    	BIT_ADDR(GPIOB_IDR_Addr,n)  //输入 

#define PC_O(n)   	BIT_ADDR(GPIOC_ODR_Addr,n)  //输出 
#define PC_I(n)    	BIT_ADDR(GPIOC_IDR_Addr,n)  //输入 

#define PD_O(n)   	BIT_ADDR(GPIOD_ODR_Addr,n)  //输出 
#define PD_I(n)    	BIT_ADDR(GPIOD_IDR_Addr,n)  //输入 

#define PE_O(n)   	BIT_ADDR(GPIOE_ODR_Addr,n)  //输出 
#define PE_I(n)    	BIT_ADDR(GPIOE_IDR_Addr,n)  //输入

#define PF_O(n)   	BIT_ADDR(GPIOF_ODR_Addr,n)  //输出 
#define PF_I(n)    	BIT_ADDR(GPIOF_IDR_Addr,n)  //输入

#define PG_O(n)   	BIT_ADDR(GPIOG_ODR_Addr,n)  //输出 
#define PG_I(n)    	BIT_ADDR(GPIOG_IDR_Addr,n)  //输入

#define PH_O(n)   	BIT_ADDR(GPIOH_ODR_Addr,n)  //输出 
#define PH_I(n)    	BIT_ADDR(GPIOH_IDR_Addr,n)  //输入

#define PI_O(n)  	 	BIT_ADDR(GPIOI_ODR_Addr,n)  //输出 
#define PI_I(n)   	BIT_ADDR(GPIOI_IDR_Addr,n)  //输入

#endif

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-11-28 11:27:35  更:2021-11-28 11:29:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/8 5:04:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码