SY/USER/Key/Key.c
ecol 1da6dcb89c 综合实验完成
添加系统状态显示LED

将pwm控制放到了定时器中断里

改变开关为控制系统开关

在按键中断里加入了整个系统的开关控制

修改并优化了电路图
2020-05-26 09:29:43 +08:00

116 lines
3.2 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "Key.h"
#include "Delay.h"
#include "Tim.h"
#include "Led.h"
#include "bsp_adc.h"
#include "bsp_usart.h"
u8 flag = 0;
/**-------------------------------------------------------
* @函数名 KEY_INIT
* @功能 按键初始化
* @返回值 无
***------------------------------------------------------*/
void KEY_INIT()
{
KEY_GPIO_INIT();
KEY_NVIC_INIT();
}
/**-------------------------------------------------------
* @函数名 KEY_GPIO_INIT
* @功能 按键GPIO初始化
* @返回值 无
***------------------------------------------------------*/
void KEY_GPIO_INIT(){
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(KEY_CLOCK, ENABLE); //使能对应端口时钟
GPIO_InitStructure.GPIO_Pin = KEY_Pin;//KEY_Pin
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
GPIO_Init(KEY_PORT, &GPIO_InitStructure);//初始化key_GPIO
}
/**-------------------------------------------------------
* @函数名 KEY_NVIC_INIT
* @功能 按键按下时为低电平0
* @返回值 无
***------------------------------------------------------*/
void KEY_NVIC_INIT()
{
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/* 初始化KEY按键为中断模式 */
/* Connect Button EXTI Line to Button GPIO Pin */
/* 将KEY按键对应的管脚连接到内部中断线 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能复用功能时钟
//GPIOE.2 中断线以及中断初始化配置 下降沿触发
GPIO_EXTILineConfig(KEY_PORT_SOURCE,KEY_PIN_SOURCE);
EXTI_InitStructure.EXTI_Line=KEY_EXIT_LINE; //KEY2
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
/* Enable and set Button EXTI Interrupt to the lowest priority */
NVIC_InitStructure.NVIC_IRQChannel = KEY_NVIC_IRQChannel; //使能按键WK_UP所在的外部中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2,
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; //子优先级0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
NVIC_Init(&NVIC_InitStructure);
}
/**-------------------------------------------------------
* @函数名 EXTI3_IRQHandler
* @功能 处理外部中断线3的中断,按键1中断处理函数
* @参数 无
* @返回值 无
***------------------------------------------------------*/
void KEY_NVIC_Handler(void) /* Key 1 */
{
if(EXTI_GetITStatus(KEY_EXIT_LINE) != RESET)
{
/* 延迟去抖 */
delay(150);
if(KEY == 0)
{
/*改变系统工作标志*/
flag = !flag;
printf("\r\n开关状态改变为:%d\r\n",!flag);
/* 改变指示灯状态 */
if(!flag){
LED_SYS_ON();
ADC_Cmd(ADC_x, ENABLE);
TIM_Cmd(TIM2, ENABLE); //使能TIM2
TIM_Cmd(TIM3, ENABLE); //使能TIM3
}else {
LED_SYS_OFF();
ADC_Cmd(ADC_x, DISABLE);
TIM_Cmd(TIM2, DISABLE); //使能TIM2
TIM_Cmd(TIM3, DISABLE); //使能TIM3
}
}
/* 等待按键释放 */
while(KEY == 0);
/* 延迟去抖 */
delay(150);
/* Clear the EXTI Line 4 */
/* 清除中断挂起标志位,否则会被认为中断没有被处理而循环再次进入中断 */
EXTI_ClearITPendingBit(KEY_EXIT_LINE);
}
}