/**
******************************************************************************
* @file Project/STM32F10x_StdPeriph_Template/stm32f10x_it.c
* @author MCD Application Team
* @version V3.5.0
* @date 08-April-2011
* @brief Main Interrupt Service Routines.
* This file provides template for all exceptions handler and
* peripherals interrupt service routine.
******************************************************************************
* @attention
*
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*
*
© COPYRIGHT 2011 STMicroelectronics
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x_it.h"
#include "stm32f10x_exti.h"
#include "stm32f10x_tim.h"
#include "TypeDefine.h"
#include "Driver.h"
#include "USARTSetup.h"
#include "ControlSystem.h"
#include "SystemAlarm.h"
#include "DrawLCDGUI.h"
#include "lorawan.h"
#include "stm32f10x_dma.h"
#include
#include
#include "Bubble_ADCSetup.h"
#include "ControlSystem.h"
#include "sys.h"
uint16_t IC2Value;
uint16_t DutyCycle;
uint32_t Frequency;
uint8_t EXPCA_flag=0;
uint16_t Quiet_Timedata=0; //静音键延时时间
uint8_t Quiet_Timedata_flag=0; //静音键延时完成标志
extern uint8_t Sound_prepore_flag; //预报警标志
uint16_t lorawan_overtime=0; //lorawan网络超时判断
uint8_t lorawan_overtime_flag=0; //超时标志
uint8_t time_1sflag=0; //1s时间标志
uint8_t time_3sflag=0; //3秒时间标志
uint16_t time_3s=0; //3s时间
uint16_t lorawan_time_5s=0; //5s时间,发送数据后,收不到发送完成标志,延时3s进入睡眠模式
uint8_t lorawan_time_5sflag=0; //5秒时间标志
uint8_t test_flag=0;
uint8_t self_check_finish=0; //自检完成标志
uint32_t random_time=1750000; //随机发送时间
uint16_t random_cont=0; //随机数种子值
uint32_t random_data=0; //随机数
uint8_t lorawan_send_finish_flag=0; //数据发送完成标志
extern uint8_t lorawan_send_data_flag;////数据发送标志
extern uart_recv_t uart_recv; //串口接收缓存 add by wulianwei
/** @addtogroup STM32F10x_StdPeriph_Template
* @{
*/
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
/******************************************************************************/
/* Cortex-M3 Processor Exceptions Handlers */
/******************************************************************************/
/**
* @brief This function handles NMI exception.
* @param None
* @retval None
*/
void NMI_Handler(void)
{
}
/**
* @brief This function handles Hard Fault exception.
* @param None
* @retval None
*/
void HardFault_Handler(void)
{
/* Go to infinite loop when Hard Fault exception occurs */
while (1)
{
}
}
/**
* @brief This function handles Memory Manage exception.
* @param None
* @retval None
*/
void MemManage_Handler(void)
{
/* Go to infinite loop when Memory Manage exception occurs */
while (1)
{
}
}
/**
* @brief This function handles Bus Fault exception.
* @param None
* @retval None
*/
void BusFault_Handler(void)
{
/* Go to infinite loop when Bus Fault exception occurs */
while (1)
{
}
}
/**
* @brief This function handles Usage Fault exception.
* @param None
* @retval None
*/
void UsageFault_Handler(void)
{
/* Go to infinite loop when Usage Fault exception occurs */
while (1)
{
}
}
/**
* @brief This function handles SVCall exception.
* @param None
* @retval None
*/
void SVC_Handler(void)
{
}
/**
* @brief This function handles Debug Monitor exception.
* @param None
* @retval None
*/
void DebugMon_Handler(void)
{
}
/**
* @brief This function handles PendSVC exception.
* @param None
* @retval None
*/
void PendSV_Handler(void)
{
}
/**
* @brief This function handles SysTick Handler.
* @param None
* @retval None
*/
void SysTick_Handler(void)
{
if(( motorWorkState == MOTOR_WORK_OFF ) && (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13) == 0)) //在所有中断里面处理电机停止,防止中断导致电机关闭延时
{
GPIO_SetBits(GPIOB,GPIO_Pin_13);
}
if( TaskSchedulerTimer.delayTimer != 0x00 )//延时函数计时
{
TaskSchedulerTimer.delayTimer--;
}
if(emSysWorkStep == EnterSetParam)
{
if((KeyActionFlag.keyEnter == emKeyflagLongPress)&&(TaskSchedulerFlag.EnterDelayFlag == TASK_FLAG_CLEAR))
{
if(TaskSchedulerTimer.EnterDelayTimer != 0)
{
TaskSchedulerTimer.EnterDelayTimer --;
}
else
{
TaskSchedulerFlag.EnterDelayFlag = TASK_FLAG_SET;
}
}
else if(GPIO_ReadInputDataBit( KEY_GPIO_PORT,ENTER_GPIO_PIN ) != 0)//有问题,需要处理一下
{
TaskSchedulerTimer.EnterDelayTimer = EnterDelay_TIMER;
TaskSchedulerFlag.EnterDelayFlag = TASK_FLAG_CLEAR;
}
}
// else
// {
// TaskSchedulerTimer.EnterDelayTimer = THREE_MSEC_TIMER;
// }
if(lorawan_overtime-- < 2) //lorawan超时判断函数
{
lorawan_overtime_flag=1;
lorawan_overtime=2000;
}
if(time_3s++ > 5000) //5s定时
{
time_3s=0;
time_3sflag=1;
}
if(lorawan_send_data_flag ==1) //当发送数据后,开始计时5s
{
if(lorawan_time_5s++ > 5000) //5s定时 lorawan_time_3s
{
lorawan_time_5s=0;
lorawan_time_5sflag=1;
}
}
if(sysAlarmFlag.VoltLowest == ALARM_PREPARE) //低电量预报警计时器
{
if( Timer_VoltLowes != 0x00)
{
Timer_VoltLowes--;
}
else
{
Timer_VoltLowes = FORTY_MINUTE_TIMER;
VoltLowest_Alarm_Flag = TASK_FLAG_SET;// //计时到,置位欠压报警标志
}
}
if(lorawan_send_data_flag ==1)
{
if(GPIO_ReadInputDataBit(LORANODE_STAT_GPIO_PORT, LORANODE_STAT_PIN) == 1)
{
lorawan_send_finish_flag = 1; //当收到一个10ms脉冲的时候,说明数据发送完成
}
}
/* 系统上电初始化定时3s */
if( TaskSchedulerFlag.initFinishFlag == TASK_FLAG_WAIT )
{
if( TaskSchedulerTimer.initFinishTimer != 0x00 )
{
TaskSchedulerTimer.initFinishTimer--;
}
else
{
TaskSchedulerFlag.initFinishFlag = TASK_FLAG_SET;
TaskSchedulerTimer.initFinishTimer = TRI_SECOND_TIMER;
}
}
if( Quiet_Timedata > 0) //静音键延时
{
Quiet_Timedata--;
}
else
{
Quiet_Timedata = 1000;
Quiet_Timedata_flag=1;
time_1sflag=1;
}
/* 主芯片给从芯片发送数据时间 */ //目前改为喂狗时间用
if( TaskSchedulerTimer.hostXmitTimer != 0x00 )
{
TaskSchedulerTimer.hostXmitTimer--;
}
else
{
TaskSchedulerTimer.hostXmitTimer = THREE_MSEC_TIMER;
if(TaskSchedulerFlag.hostXmitFlag == TASK_FLAG_SET)
{
TaskSchedulerFlag.hostXmitFlag = TASK_FLAG_CLEAR;
GPIO_ResetBits(GPIOC,GPIO_Pin_0);
}
else
{
TaskSchedulerFlag.hostXmitFlag = TASK_FLAG_SET;
GPIO_SetBits(GPIOC,GPIO_Pin_0);
}
}
/* 时间读取计时 */
if( TaskSchedulerTimer.timeReadTimer != 0x00 )
{
TaskSchedulerTimer.timeReadTimer--;
}
else
{
TaskSchedulerFlag.timeReadFlag = TASK_FLAG_SET;
TaskSchedulerTimer.timeReadTimer = THIRTY_SECOND_TIMER;//ONE_SECOND_TIMER;
// if( TaskSchedulerFlag.testDispFlag == TASK_FLAG_SET )
// {
// testDispCounts++;
// }
// else
// {
// testDispCounts = 0;
// }
}
/* 自动关机计时 */
/*if( TaskSchedulerFlag.autoPowerOffFlag == TASK_FLAG_WAIT )
{
if( TaskSchedulerTimer.autoPowerOffTimer != 0 )
{
TaskSchedulerTimer.autoPowerOffTimer--;
}
else
{
TaskSchedulerFlag.autoPowerOffFlag = TASK_FLAG_SET;
TaskSchedulerTimer.autoPowerOffTimer = THIRTY_MINUTE_TIMER;
}
} */
/*设置参数界面30min未操作报警提示*/
if((TaskSchedulerFlag.NoActionHintFlag == TASK_FLAG_WAIT )&&(realTimeData.stateRun != Alarm))
{
if(TaskSchedulerTimer.NoActionHintTimer != 0)
{
TaskSchedulerTimer.NoActionHintTimer--;
}
else
{
TaskSchedulerFlag.NoActionHintFlag = TASK_FLAG_SET;
TaskSchedulerTimer.NoActionHintTimer = THIRTY_MINUTE_TIMER;
}
}
if( ( TaskSchedulerFlag.lcdBlackFlag == TASK_FLAG_SET ) || ( TaskSchedulerFlag.lcdBlackFlag == TASK_FLAG_WAIT ) )
{
if( TaskSchedulerTimer.lcdBlackCloseTimer != 0 )
{
TaskSchedulerTimer.lcdBlackCloseTimer--;
}
else
{
TaskSchedulerFlag.lcdBlackFlag = TASK_FLAG_CLEAR;//只要有按键按下背光就亮
TaskSchedulerTimer.lcdBlackCloseTimer = FIFTEEN_SECOND_TIMER;//TWO_SECOND_TIMER;//LCD背光关闭计时
}
}
/* 电机上电自检,只要是4s没有出现自检成功,则认为自检失败,自检完成后电机可进入正常工作状态 */
if(TaskSchedulerFlag.motorSelfTestFlag == TASK_FLAG_WAIT)
{
if( TaskSchedulerTimer.motorSelfTestTimer != 0x00 )
{
TaskSchedulerTimer.motorSelfTestTimer--;
}
else
{
TaskSchedulerFlag.motorSelfTestFlag = TASK_FLAG_OVERTIME;
TaskSchedulerTimer.motorSelfTestTimer = MOTOR_TESTSELF_TIMER;
}
}
else if( TaskSchedulerFlag.motorSelfTestFlag == TASK_FLAG_SET )
{
/* 电机开始工作后停止InfusionStopTimer时间后再启动 */
if( TaskSchedulerFlag.motorStopFlag == TASK_FLAG_WAIT )
{
if( TaskSchedulerTimer.motorStopTimer != 0x00 )
{
TaskSchedulerTimer.motorStopTimer--;
}
else
{
motorWorkState = MOTOR_WORK_ON;
TaskSchedulerTimer.motorStopTimer = InfusionStopTimer;
}
}
if(GPIO_ReadInputDataBit( GPIOB,GPIO_Pin_1 ) != 0) //绿色LED点亮时间处理
{
if( G_Led_Time != 0x00)
{
G_Led_Time--;
}
else
{
G_LED_OFF;//时间到关闭LED
}
}
if(TaskSchedulerFlag.NoActionHintFlag == TASK_FLAG_WSET)
{
if(GPIO_ReadInputDataBit( GPIOB,GPIO_Pin_9 ) != 0) //绿色LED点亮时间处理
{
if( Y_Led_Time != 0x00)
{
Y_Led_Time--;
TaskSchedulerFlag.lcdBlackFlag = TASK_FLAG_SET;
}
else
{
Y_LED_OFF;//时间到关闭LED
TaskSchedulerFlag.NoActionHintFlag = TASK_FLAG_WAIT;
TaskSchedulerFlag.lcdBlackFlag = TASK_FLAG_CLEAR;
}
}
}
//气泡检测传感器定时
if( motorWorkState == MOTOR_WORK_ON )//在电机运行的时候进行检测
{
if(BubbleCheckTime != 0x00)
{
BubbleCheckTime--;
}
else
{
BubbleCheckFlag=1;//定时到,置位该标志
BubbleCheckTime = TWO_MSEC_TIMER;
}
}
//电流检测定时
if( motorWorkState == MOTOR_WORK_ON )//在电机运行的时候进行检测
{
if(ElectricityCheckTime != 0x00)
{
ElectricityCheckTime--;
}
else
{
ElectricityCheckFlag=1;//定时到,置位该标志
ElectricityCheckTime = FIFTY_MSEC_TIMER; //50ms检测一下
}
}
//在电机关闭时,检测电流,防止电机失控
if( motorWorkState == MOTOR_WORK_OFF )//在电机运行的时候进行检测
{
if(ElectricityOffTime != 0x00)
{
ElectricityOffTime--;
}
else
{
ElectricityOFFflag=1;//定时到,置位该标志
ElectricityOffTime = ONE_SECOND_TIMER; //1s检测一下
}
}
/* 非自检模式下当电机开始工作后,如果4s时间内霍尔没有收到采集信号,则说明电机操作失败 */
if( TaskSchedulerFlag.motorRunFlag == TASK_FLAG_WAIT )
{
if( TaskSchedulerTimer.motorSignalCollectTimer != 0x00 )
{
TaskSchedulerTimer.motorSignalCollectTimer--;
}
else
{
TaskSchedulerFlag.motorRunFlag = TASK_FLAG_OVERTIME;
TaskSchedulerTimer.motorSignalCollectTimer = MOTOR_TESTSELF_TIMER;
}
}
/*else if( TaskSchedulerFlag.motorRunFlag == TASK_FLAG_SET )
{
TaskSchedulerTimer.motorSignalCollectTimer = MOTOR_TESTSELF_TIMER;
}*/
}
if( TaskSchedulerFlag.forceConvertFlag == TASK_FLAG_WAIT )//压力AD采集
{
if( TaskSchedulerTimer.pressureConvertTimer != 0x00 )
{
TaskSchedulerTimer.pressureConvertTimer--;
}
else
{
TaskSchedulerFlag.forceConvertFlag = TASK_FLAG_SET;
TaskSchedulerTimer.pressureConvertTimer = TASK_TIMER_PRES_CONV;
}
}
//if( ( emSysWorkStep != EnterRunFirstDose ) && ( emSysWorkStep != EnterRunMain ) )//在非运行界面时每20s采集一次电池电压
{
if( TaskSchedulerFlag.sensorPWBatteryFlag == TASK_FLAG_CLEAR )//每20s关闭一次主芯片节能
{
if( TaskSchedulerTimer.batteryVoltTimer != 0 )
{
TaskSchedulerTimer.batteryVoltTimer--;
}
else
{
TaskSchedulerFlag.batteryVoltHeaderFlag = TASK_FLAG_SET;
TaskSchedulerFlag.sensorPWBatteryFlag = TASK_FLAG_SET;//传感器电源-电压打开
TaskSchedulerTimer.batteryVoltTimer = TWENTY_SECOND_TIMER;
}
}
}
if( TaskSchedulerTimer.rtdXmitTimer != 0 ) //实时数据发送计时 30s/帧
{
TaskSchedulerTimer.rtdXmitTimer--;
}
else//当所实时数据发送完毕后,关闭zigbee电源
{
/*if( TaskSchedulerFlag.zigbeeETXmitFlag == TASK_FLAG_WAIT )
{
TaskSchedulerFlag.zigbeeETXmitFlag = TASK_FLAG_SET;
}
else*/
{
TaskSchedulerFlag.zigbeeXmitFlag = TASK_FLAG_SET;
RunToLorawawn_flag=1;
}
if(EngineeringModeValue.test == 0)
{
TaskSchedulerTimer.rtdXmitTimer = TWENTY_SECOND_TIMER;
}
else if(EngineeringModeValue.test == 1)
{
TaskSchedulerTimer.rtdXmitTimer = TWENTY_MINUTE_TIMER; //定时20分钟发送一次
}
srand(random_cont--);
//random_data=(uint32_t)(rand()%1200001+3000);//从X到Y,有Y-X+1个数,所以要产生从X到Y的数,只需要这样写:k=rand()%(Y-X+1)+X;
random_data=(uint32_t)(rand()%20001+3000);//从X到Y,有Y-X+1个数,所以要产生从X到Y的数,只需要这样写:k=rand()%(Y-X+1)+X;
random_time=random_data;
}
if( random_time != 0 ) //实时数据发送计时 30s/帧
{
random_time--;
}
else//当所实时数据发送完毕后,关闭zigbee电源
{
// TaskSchedulerFlag.zigbeeXmitFlag = TASK_FLAG_CLEAR;
random_time=TWO_MINUTE_TIMER;//随机时间发送完成,赋予默认的3分钟,等待下一个三分钟随机时间
// if( TaskSchedulerFlag.zigbeeETXmitFlag == TASK_FLAG_WAIT )
// {
// TaskSchedulerFlag.zigbeeETXmitFlag = TASK_FLAG_SET;
// }
// else
// {
// //TaskSchedulerFlag.zigbeeXmitFlag = TASK_FLAG_SET;
// //RunToLorawawn_flag=1;
// }
}
// ---- tcp 检测 add by wulianwei
if( TaskSchedulerTimer.ModuleInitTimer != 0 ) //TCP检查时间
{
TaskSchedulerTimer.ModuleInitTimer--;
}
else
{
TaskSchedulerFlag.ModuleInitFlag = TASK_FLAG_SET;
TaskSchedulerTimer.ModuleInitTimer = FIFTEEN_SECOND_TIMER;
}
if(TaskSchedulerTimer.MQTTSendTimer != 0)
{
TaskSchedulerTimer.MQTTSendTimer--;
}
else
{
TaskSchedulerFlag.MqttSendFlag = TASK_FLAG_SET; //add by wulianwei
TaskSchedulerTimer.MQTTSendTimer = TWENTY_MINUTE_TIMER;
if(EngineeringModeValue.test == 0)
{
TaskSchedulerTimer.MQTTSendTimer = TWENTY_SECOND_TIMER;
}
}
if(TaskSchedulerTimer.MQTTReSendTimer != 0)
{
TaskSchedulerTimer.MQTTReSendTimer--;
}
else
{
TaskSchedulerFlag.MqttReSendFlag = TASK_FLAG_SET;
TaskSchedulerTimer.MQTTReSendTimer = FIVE_SECOND_TIMER;
}
// ---- tcp 检测 add by wulianwei
if( speakerWorkStep != emSpeakerNoneWork )
{
if( TaskSchedulerTimer.speakerTimer != 0x00 )//蜂鸣器计时
{
TaskSchedulerTimer.speakerTimer--;
}
else
{
/*if(( sysPromptToneType == WarringTone ) || ( sysPromptToneType == InfusionTone ) || ( sysPromptToneType == Sound_prepore ))
{
switch( speakerWorkStep )
{
case emSpeakerWorkStart:
TaskSchedulerTimer.speakerTimer = ONE_MSEC_TIMER;//蜂鸣器计时 100ms
speakerWorkStep = emSpeakerWorkStep1;
SpeakerCtl( DRIVER_OFF );
break;
case emSpeakerWorkStep1:
TaskSchedulerTimer.speakerTimer = TWO_MSEC_TIMER;//蜂鸣器计时 200ms
speakerWorkStep = emSpeakerWorkStep2;
SpeakerCtl( DRIVER_ON );
break;
case emSpeakerWorkStep2:
TaskSchedulerTimer.speakerTimer = TWO_MSEC_TIMER;//蜂鸣器计时 200ms
speakerWorkStep = emSpeakerWorkStep3;
SpeakerCtl( DRIVER_OFF );
break;
case emSpeakerWorkStep3:
TaskSchedulerTimer.speakerTimer = TWO_MSEC_TIMER;//蜂鸣器计时 200ms
speakerWorkStep = emSpeakerWorkStep4;
SpeakerCtl( DRIVER_ON );
break;
case emSpeakerWorkStep4:
speakerWorkStep = emSpeakerWorkStep5;
SpeakerCtl( DRIVER_OFF );
break;
default:break;
}
}
else if(sysPromptToneType == RemindeTone)
{
switch( speakerWorkStep )
{
case emSpeakerWorkStart:
TaskSchedulerTimer.speakerTimer = TWO_MSEC_TIMER;//蜂鸣器计时 200ms
speakerWorkStep = emSpeakerWorkStep1;
break;
case emSpeakerWorkStep1:
TaskSchedulerTimer.speakerTimer = TWO_MSEC_TIMER;//蜂鸣器计时 200ms
speakerWorkStep = emSpeakerWorkStep2;
break;
case emSpeakerWorkStep2:
speakerWorkStep = emSpeakerWorkStep3;
break;
}
}*/
// else
if(( sysPromptToneType == StartupTone ) || ( sysPromptToneType == KeypadShortTone ) || ( sysPromptToneType == KeypadLongTone )
|| ( sysPromptToneType == VerificationTone )|| ( sysPromptToneType == SoundOff ))
{
speakerWorkStep = emSpeakerWorkDone;
}
}
}
if( sysAlarmFlag.VoltLowest == ALARM_PREPARE )
//if( Sound_prepore_flag == 2)
{
if( TaskSchedulerTimer.batLowPrepareDispTimer != 0x00 )
{
TaskSchedulerTimer.batLowPrepareDispTimer--;
}
else
{
if( TaskSchedulerFlag.batLowPrepareFlag == TASK_FLAG_WCLEAR )//电池低压预报标志
{
TaskSchedulerFlag.batLowPrepareFlag = TASK_FLAG_SET;
}
else if( TaskSchedulerFlag.batLowPrepareFlag == TASK_FLAG_WSET )//电池低压预报标志
{
TaskSchedulerFlag.batLowPrepareFlag = TASK_FLAG_CLEAR;
}
TaskSchedulerTimer.batLowPrepareDispTimer = ONE_SECOND_TIMER;
}
}
/* 整个控制系统的定时都在此处处理 */
CntlSystemWorkTimer();
if( LimitBeginsTime == 1 )
{
if( TaskSchedulerTimer.totalDoseOneHourTimer != 0 )
{
TaskSchedulerTimer.totalDoseOneHourTimer--;
}
else
{
TaskSchedulerTimer.totalDoseOneHourTimer = TWENTY_MINUTE_TIMER;
TaskSchedulerFlag.limitJudgeFlag = TASK_FLAG_CLEAR;
}
}
//为防止有同时按下的情况,所以没有将按键封装到一个程序里
if( KeyScanStatus.keyEnter == emKeyActionWait )//enter键消抖和时长判断
{
if( GPIO_ReadInputDataBit( KEY_GPIO_PORT,ENTER_GPIO_PIN ) == 0)
{
if( TaskSchedulerTimer.enterKeyScanTimer != 0 )
{
TaskSchedulerTimer.enterKeyScanTimer--;
}
else
{
KeyScanStatus.keyEnter = emKyeActionScanSet;
TaskSchedulerTimer.enterKeyScanTimer = KEY_TIMER_SCAN;
}
}
else//按键抬起,表示此次按键操作完成
{
KeyScanStatus.keyEnter = emKeyActionOn;
TaskSchedulerTimer.enterKeyScanTimer = KEY_TIMER_SCAN;
}
}
if( KeyScanStatus.keyRunPause == emKeyActionWait )//运行/暂停键消抖和时长判断
{
if( GPIO_ReadInputDataBit( KEY_GPIO_PORT,RUNPAUSE_GPIO_PIN ) == 0)
{
if( TaskSchedulerTimer.runPauseKeyScanTimer != 0 )
{
TaskSchedulerTimer.runPauseKeyScanTimer--;
}
else
{
KeyScanStatus.keyRunPause = emKyeActionScanSet;
TaskSchedulerTimer.runPauseKeyScanTimer = KEY_TIMER_SCAN;
}
}
else//按键抬起,表示此次按键操作完成
{
KeyScanStatus.keyRunPause = emKeyActionOn;
TaskSchedulerTimer.runPauseKeyScanTimer = KEY_TIMER_SCAN;
}
}
if( KeyScanStatus.keyPS == emKeyActionWait )//密码/静音键消抖和时长判断
{
if( GPIO_ReadInputDataBit( KEY_GPIO_PORT,PS_GPIO_PIN ) == 0)//还没有定义,引脚需要修改
{
if( TaskSchedulerTimer.psKeyScanTimer != 0 )
{
TaskSchedulerTimer.psKeyScanTimer--;
}
else
{
KeyScanStatus.keyPS = emKyeActionScanSet;
TaskSchedulerTimer.psKeyScanTimer = KEY_TIMER_SCAN;
}
}
else//按键抬起,表示此次按键操作完成
{
KeyScanStatus.keyPS = emKeyActionOn;
TaskSchedulerTimer.psKeyScanTimer = KEY_TIMER_SCAN;
}
}
if( KeyScanStatus.keyPower == emKeyActionWait )//电源键消抖和时长判断
{
if( GPIO_ReadInputDataBit( KEY_GPIO_PORT,PWR_GPIO_PIN ) == 0)
{
if( TaskSchedulerTimer.powerKeyScanTimer != 0 )
{
TaskSchedulerTimer.powerKeyScanTimer--;
}
else
{
KeyScanStatus.keyPower = emKyeActionScanSet;
TaskSchedulerTimer.powerKeyScanTimer = KEY_TIMER_SCAN;
}
}
else//按键抬起,表示此次按键操作完成
{
KeyScanStatus.keyPower = emKeyActionOn;
TaskSchedulerTimer.powerKeyScanTimer = KEY_TIMER_SCAN;
}
}
if( KeyScanStatus.keyPCA == emKeyActionWait )//PCA键消抖和时长判断
{
if( GPIO_ReadInputDataBit( KEY_GPIO_PORT,PAC_GPIO_PIN ) == 0 )
{
if( TaskSchedulerTimer.pcaKeyScanTimer != 0 )
{
TaskSchedulerTimer.pcaKeyScanTimer--;
}
else
{
KeyScanStatus.keyPCA = emKyeActionScanSet;
TaskSchedulerTimer.pcaKeyScanTimer = KEY_TIMER_SCAN;
}
}
else//按键抬起,表示此次按键操作完成
{
KeyScanStatus.keyPCA = emKeyActionOn;
TaskSchedulerTimer.pcaKeyScanTimer = KEY_TIMER_SCAN;
}
}
/*else//PCA扩展键消抖和时长判断
{
if( GPIO_ReadInputDataBit( GPIOB,EXPAC_GPIO_PIN ) == 0 )
{
if( TaskSchedulerTimer.pcaKeyScanTimer != 0 )
{
TaskSchedulerTimer.pcaKeyScanTimer--;
if( TaskSchedulerTimer.pcaKeyScanTimer < 10)//20170503修改
{
if( GPIO_ReadInputDataBit( GPIOB,EXPAC_GPIO_PIN ) == 0 )
{
EXPCA_flag=1;
}
}
}
}
else if(EXPCA_flag==1)
{
EXPCA_flag=0;
KeyScanStatus.keyPCA = emKyeActionScanSet;
TaskSchedulerTimer.pcaKeyScanTimer = KEY_TIMER_SCAN;
}
}*/
if( KeyScanStatus.keyPlus == emKeyActionWait )//Plus键消抖和时长判断
{
if( GPIO_ReadInputDataBit( KEY_GPIO_PORT,PLUS_GPIO_PIN ) == 0 )
{
if( TaskSchedulerTimer.plusKeyScanTimer != 0 )
{
TaskSchedulerTimer.plusKeyScanTimer--;
}
else
{
KeyScanQty.keyPlus++;
KeyScanStatus.keyPlus = emKyeActionScanSet;
TaskSchedulerTimer.plusKeyScanTimer = KEY_TIMER_SCAN;
}
}
else//按键抬起,表示此次按键操作完成
{
KeyScanStatus.keyPlus = emKeyActionOn;
TaskSchedulerTimer.plusKeyScanTimer = KEY_TIMER_SCAN;
}
}
else if( MoreKeyActionFlag.keyPlus == emKeyflagShortPress )
{
if( TaskSchedulerTimer.plusKeyScanTimer != 0 )
{
TaskSchedulerTimer.plusKeyScanTimer--;
}
else
{
MoreKeyActionFlag.keyPlus = emKeyflagNonePress;
TaskSchedulerTimer.plusKeyScanTimer = KEY_TIMER_SCAN;
}
}
if( KeyScanStatus.keyMinus == emKeyActionWait )//Minus键消抖和时长判断
{
if( GPIO_ReadInputDataBit( KEY_GPIO_PORT,MINUS_GPIO_PIN ) == 0 )
{
if( TaskSchedulerTimer.minusKeyScanTimer != 0 )
{
TaskSchedulerTimer.minusKeyScanTimer--;
}
else
{
KeyScanStatus.keyMinus = emKyeActionScanSet;
TaskSchedulerTimer.minusKeyScanTimer = KEY_TIMER_SCAN;
}
}
else//按键抬起,表示此次按键操作完成
{
KeyScanStatus.keyMinus = emKeyActionOn;
TaskSchedulerTimer.minusKeyScanTimer = KEY_TIMER_SCAN;
}
}
else if( MoreKeyActionFlag.keyMinus == emKeyflagShortPress )
{
if( TaskSchedulerTimer.minusKeyScanTimer != 0 )
{
TaskSchedulerTimer.minusKeyScanTimer--;
}
else
{
MoreKeyActionFlag.keyMinus = emKeyflagNonePress;
TaskSchedulerTimer.minusKeyScanTimer = KEY_TIMER_SCAN;
}
}
if( KeyScanStatus.keyAirout == emKeyActionWait )//Airout键消抖和时长判断
{
if( GPIO_ReadInputDataBit( KEY_GPIO_PORT,AIROUT_GPIO_PIN ) == 0 )
{
if( TaskSchedulerTimer.airoutKeyScanTimer != 0 )
{
TaskSchedulerTimer.airoutKeyScanTimer--;
}
else
{
KeyScanStatus.keyAirout = emKyeActionScanSet;
TaskSchedulerTimer.airoutKeyScanTimer = KEY_TIMER_SCAN;
}
}
else//按键抬起,表示此次按键操作完成
{
KeyScanStatus.keyAirout = emKeyActionOn;
TaskSchedulerTimer.airoutKeyScanTimer = KEY_TIMER_SCAN;
}
}
if( TaskSchedulerFlag.speakerFlag == TASK_FLAG_WAIT )
{
if( TaskSchedulerTimer.speakerWaitTimer != 0 )
{
TaskSchedulerTimer.speakerWaitTimer--;
}
else
{
if((SysHornToneType == RemindeTone )||(SysHornToneType == LowPriWarning)||(SysHornToneType == Sound_prepore))
{
SysHornToneType = SoundOff;
}
TaskSchedulerFlag.speakerFlag = TASK_FLAG_SET;
TaskSchedulerTimer.speakerWaitTimer = THIRTY_SECOND_TIMER;//为下次进入蜂鸣器计时做准备
}
}
/* if( TaskSchedulerFlag.sysStandbyFlag == TASK_FLAG_WAIT )
{
if( TaskSchedulerTimer.sysStandbyTimer != 0 )
{
TaskSchedulerTimer.sysStandbyTimer--;
}
else
{
TaskSchedulerFlag.sysStandbyFlag = TASK_FLAG_SET;//开启待机模式
TaskSchedulerFlag.sensorPWHallFlag = TASK_FLAG_CLEAR;//传感器电源-霍尔关闭
}
}*/
}
void EXTI1_IRQHandler(void)
{
/* if(EXTI_GetITStatus(HALL1_DETECT_EXTI) != RESET)//HALL1中断
{
if( ( TaskSchedulerFlag.sensorPWHallFlag == TASK_FLAG_SET ) && ( motorWorkState == MOTOR_WORK_ON ) )
{
if( TaskSchedulerFlag.motorSelfTestFlag == TASK_FLAG_WAIT )//上电电机自检
{
realTimeData.hall1Counter++;
}
else if( TaskSchedulerFlag.motorSelfTestFlag == TASK_FLAG_SET )
{
realTimeData.hall1Counter++;
}
}
//Clear EXTI Line Pending Bit
EXTI_ClearFlag(HALL1_DETECT_EXTI);
EXTI_ClearITPendingBit(HALL1_DETECT_EXTI);
}*/
}
/**
* @brief This function handles the PECAHead detection interrupt request.
* @param None
* @retval None
*/
void EXTI9_5_IRQHandler(void)
{
if(EXTI_GetITStatus(HALL2_DETECT_EXTI) != RESET)//HALL2中断
{
if( ( TaskSchedulerFlag.sensorPWHallFlag == TASK_FLAG_SET ) && ( motorWorkState == MOTOR_WORK_ON ) )
{
if( TaskSchedulerFlag.motorSelfTestFlag == TASK_FLAG_WAIT )//上电电机自检
{
realTimeData.hall2Counter++;
//电机自检成功,只让电机转到一圈并且归零起点,自检OK
if( realTimeData.hall2Counter >= 1 )
{
realTimeData.hall2Counter = 0;
GPIO_SetBits(GPIOB,GPIO_Pin_13);
motorWorkState = MOTOR_WORK_OFF;
TaskSchedulerFlag.motorSelfTestFlag = TASK_FLAG_SET;
self_check_finish=1;
ElectricityOffTime = ONE_SECOND_TIMER; //1s检测一下
ElectricityOFFflag=0;//定时到,置位该标志
TaskSchedulerTimer.dispAutoJumpTimer = TRI_SECOND_TIMER;
}
}
else if( TaskSchedulerFlag.motorSelfTestFlag == TASK_FLAG_SET )
{
realTimeData.hall2Counter++;
if( realTimeData.hall2Counter >= 2 )
{
realTimeData.hall2Counter = 0;
if((realTimeData.stateRun == Airout)&&(TaskSchedulerFlag.AirOutFlag == TASK_FLAG_SET))
{
motorWorkState = MOTOR_WORK_ON;
}
else
// if((realTimeData.stateRun == FirstRun)||(realTimeData.stateRun==MainRun)||(realTimeData.stateRun==PCARun))
{
motorWorkState = MOTOR_WORK_OFF;
GPIO_SetBits(GPIOB,GPIO_Pin_13);
}
TaskSchedulerTimer.motorSignalCollectTimer = MOTOR_TESTSELF_TIMER;//机械故障时间赋值
TaskSchedulerFlag.ipnutFlag = TASK_FLAG_SET;//这个标志位应该用在hall1采集到一次变化的时候
}
}
}
/* Clear EXTI Line Pending Bit */
EXTI_ClearFlag(HALL2_DETECT_EXTI);
EXTI_ClearITPendingBit(HALL2_DETECT_EXTI);
}
// if(EXTI_GetITStatus(EXPAC_DETECT_EXTI) != RESET)//PCA扩展控制中断
// {
// if( KeyScanStatus.keyPCA == emKeyActionOff )
// {
// KeyScanStatus.keyPCA = emKeyActionWait;
// }
// /* Clear EXTI Line Pending Bit */
// EXTI_ClearFlag(EXPAC_DETECT_EXTI);
// EXTI_ClearITPendingBit(EXPAC_DETECT_EXTI);
// }
// if(EXTI_GetITStatus(PAC_DETECT_EXTI) != RESET)//PCA控制中断
// {
// if( KeyScanStatus.keyPCA == emKeyActionOff )
// {
// KeyScanStatus.keyPCA = emKeyActionWait;
// }
// /* Clear EXTI Line Pending Bit */
// EXTI_ClearFlag(PAC_DETECT_EXTI);
// EXTI_ClearITPendingBit(PAC_DETECT_EXTI);
// }
// if(EXTI_GetITStatus(AIROUT_DETECT_EXTI) != RESET)//Airout控制中断
// {
// if( KeyScanStatus.keyAirout == emKeyActionOff )
// {
// KeyScanStatus.keyAirout = emKeyActionWait;
// }
// /* Clear EXTI Line Pending Bit */
// EXTI_ClearFlag(AIROUT_DETECT_EXTI);
// EXTI_ClearITPendingBit(AIROUT_DETECT_EXTI);
// }
if(EXTI_GetITStatus(PAC_DETECT_EXTI) != RESET)//PCA控制中断
{
if( KeyScanStatus.keyPCA == emKeyActionOff )
{
KeyScanStatus.keyPCA = emKeyActionWait;
}
/* Clear EXTI Line Pending Bit */
EXTI_ClearFlag(PAC_DETECT_EXTI);
EXTI_ClearITPendingBit(PAC_DETECT_EXTI);
}
if(EXTI_GetITStatus(RUNPAUSE_DETECT_EXTI) != RESET)//运行/停止控制中断
{
if( KeyScanStatus.keyRunPause == emKeyActionOff )
{
KeyScanStatus.keyRunPause = emKeyActionWait;
}
/* Clear EXTI Line Pending Bit */
EXTI_ClearFlag(RUNPAUSE_DETECT_EXTI);
EXTI_ClearITPendingBit(RUNPAUSE_DETECT_EXTI);
}
}
/**
* @brief This function handles the PECAHead detection interrupt request.
* @param None
* @retval None
*/
void EXTI15_10_IRQHandler(void)
{
if(( motorWorkState == MOTOR_WORK_OFF ) && (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13) == 0)) //在所有中断里面处理电机停止,防止中断导致电机关闭延时
{
GPIO_SetBits(GPIOB,GPIO_Pin_13);
}
// if(EXTI_GetITStatus(RUNPAUSE_DETECT_EXTI) != RESET)//运行/停止控制中断
// {
// if( KeyScanStatus.keyRunPause == emKeyActionOff )
// {
// KeyScanStatus.keyRunPause = emKeyActionWait;
// }
// /* Clear EXTI Line Pending Bit */
// EXTI_ClearFlag(RUNPAUSE_DETECT_EXTI);
// EXTI_ClearITPendingBit(RUNPAUSE_DETECT_EXTI);
// }
// if(EXTI_GetITStatus(MINUS_DETECT_EXTI) != RESET)//减控制中断
// {
// if( KeyScanStatus.keyMinus == emKeyActionOff )
// {
// KeyScanStatus.keyMinus = emKeyActionWait;
// }
// /* Clear EXTI Line Pending Bit */
// EXTI_ClearFlag(MINUS_DETECT_EXTI);
// EXTI_ClearITPendingBit(MINUS_DETECT_EXTI);
// }
// if(EXTI_GetITStatus(PLUS_DETECT_EXTI) != RESET)//加控制中断
// {
// if( KeyScanStatus.keyPlus == emKeyActionOff )
// {
// KeyScanStatus.keyPlus = emKeyActionWait;
// }
// /* Clear EXTI Line Pending Bit */
// EXTI_ClearFlag(PLUS_DETECT_EXTI);
// EXTI_ClearITPendingBit(PLUS_DETECT_EXTI);
// }
// if(EXTI_GetITStatus(PS_DETECT_EXTI) != RESET)//返回键控制中断
// {
// if( KeyScanStatus.keyPS == emKeyActionOff )
// {
// KeyScanStatus.keyPS = emKeyActionWait;
// }
// /* Clear EXTI Line Pending Bit */
// EXTI_ClearFlag(PS_DETECT_EXTI);
// EXTI_ClearITPendingBit(PS_DETECT_EXTI);
// }
// if(EXTI_GetITStatus(ENTER_DETECT_EXTI) != RESET)//ENTER控制中断
// {
// if( KeyScanStatus.keyEnter == emKeyActionOff )
// {
// KeyScanStatus.keyEnter = emKeyActionWait;
// }
// /* Clear EXTI Line Pending Bit */
// EXTI_ClearFlag(ENTER_DETECT_EXTI);
// EXTI_ClearITPendingBit(ENTER_DETECT_EXTI);
// }
// if(EXTI_GetITStatus(PWR_DETECT_EXTI) != RESET)//电源控制中断
// {
// if( KeyScanStatus.keyPower == emKeyActionOff )
// {
// KeyScanStatus.keyPower = emKeyActionWait;
// }
// /* Clear EXTI Line Pending Bit */
// EXTI_ClearFlag(PWR_DETECT_EXTI);
// EXTI_ClearITPendingBit(PWR_DETECT_EXTI);
// }
if(EXTI_GetITStatus(AIROUT_DETECT_EXTI) != RESET)//Airout控制中断
{
if( KeyScanStatus.keyAirout == emKeyActionOff )
{
KeyScanStatus.keyAirout = emKeyActionWait;
}
/* Clear EXTI Line Pending Bit */
EXTI_ClearFlag(AIROUT_DETECT_EXTI);
EXTI_ClearITPendingBit(AIROUT_DETECT_EXTI);
}
if(EXTI_GetITStatus(MINUS_DETECT_EXTI) != RESET)//减控制中断
{
if( KeyScanStatus.keyMinus == emKeyActionOff )
{
KeyScanStatus.keyMinus = emKeyActionWait;
}
/* Clear EXTI Line Pending Bit */
EXTI_ClearFlag(MINUS_DETECT_EXTI);
EXTI_ClearITPendingBit(MINUS_DETECT_EXTI);
}
if(EXTI_GetITStatus(PLUS_DETECT_EXTI) != RESET)//加控制中断
{
if( KeyScanStatus.keyPlus == emKeyActionOff )
{
KeyScanStatus.keyPlus = emKeyActionWait;
}
/* Clear EXTI Line Pending Bit */
EXTI_ClearFlag(PLUS_DETECT_EXTI);
EXTI_ClearITPendingBit(PLUS_DETECT_EXTI);
}
if(EXTI_GetITStatus(PS_DETECT_EXTI) != RESET)//密码/静音控制中断
{
if( KeyScanStatus.keyPS == emKeyActionOff )
{
KeyScanStatus.keyPS = emKeyActionWait;
}
/* Clear EXTI Line Pending Bit */
EXTI_ClearFlag(PS_DETECT_EXTI);
EXTI_ClearITPendingBit(PS_DETECT_EXTI);
}
if(EXTI_GetITStatus(ENTER_DETECT_EXTI) != RESET)//ENTER控制中断
{
if( KeyScanStatus.keyEnter == emKeyActionOff )
{
KeyScanStatus.keyEnter = emKeyActionWait;
}
/* Clear EXTI Line Pending Bit */
EXTI_ClearFlag(ENTER_DETECT_EXTI);
EXTI_ClearITPendingBit(ENTER_DETECT_EXTI);
}
if(EXTI_GetITStatus(PWR_DETECT_EXTI) != RESET)//电源控制中断
{
if( KeyScanStatus.keyPower == emKeyActionOff )
{
KeyScanStatus.keyPower = emKeyActionWait;
}
/* Clear EXTI Line Pending Bit */
EXTI_ClearFlag(PWR_DETECT_EXTI);
EXTI_ClearITPendingBit(PWR_DETECT_EXTI);
}
}
/**
* @brief This function handles RTC_IRQHandler.
* @param None
* @retval None
*/
// void RTC_IRQHandler(void)
// {
// if(RTC_GetITStatus(RTC_IT_ALR)!= RESET)//闹钟中断
// {
// RTC_ClearITPendingBit(RTC_IT_ALR); //清闹钟中断
// }
// }
/**
* @brief This function handles USART1_IRQHandler.
* @param None
* @retval None
*/
void USART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
{
//接收中断
usart1RecvBuffer[usart1RecvCnt] = (uint8_t)USART_ReceiveData(USART1); //保存一个字节
if( usart1RecvBuffer[0] == USART_PDU_START )
{
if( usart1RecvCnt < ( usart1RecvBuffer[1] + 2 ) )
{
usart1RecvCnt++;
}
else if( usart1RecvBuffer[usart1RecvCnt] == USART_PDU_END )
{
usart1RecvCnt = 0;
TaskSchedulerFlag.historyRequestFlag = TASK_FLAG_SET;
}
else
{
usart1RecvCnt = 0;
}
}
}
}
//==========================================================
// 函数名称: USART2_IRQHandler replace USART2_IRQHandler by wulianwei
//
// 函数功能: 串口2收发中断
//
// 入口参数: 无
//
// 返回参数: 无
//
// 说明:
void USART2_IRQHandler(void)
{
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收中断
{
if(uart_recv.len >= sizeof(uart_recv.buf)-1) uart_recv.len = 0; //防止串口被刷爆
uart_recv.buf[uart_recv.len++] = USART2->DR;
USART_ClearFlag(USART2, USART_FLAG_RXNE);
}
}
/**
* @brief This function handles USART2_IRQHandler.
* @param None
* @retval None
*/
void USART2_IRQHandler1(void) // rename USART2_IRQHandler by wulianwei
{
/*
if(USART_GetITStatus(USART2, USART_IT_IDLE) != RESET)
{
// uint8_t Dmabuff_lenght=0;
uint8_t i=0,data=0;
USART_ClearITPendingBit(USART2,USART_IT_IDLE ); //清除空闲中断
data = USART1->SR;
USART_ReceiveData(USART2); //读DR,只有读过一次,才能真正清除标志
USART_ClearFlag(USART2,USART_IT_IDLE); //清除空闲标志
//DMA_Cmd(DMA1_Channel6,DISABLE);
//USART1Send(usart2RecvBuffer,usart2RecvCnt);
//DMA_Cmd(DMA1_Channel6,ENABLE);
//usart2RecvCnt=0;
}
*/
if(( motorWorkState == MOTOR_WORK_OFF ) && (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13) == 0)) //在所有中断里面处理电机停止,防止中断导致电机关闭延时
{
GPIO_SetBits(GPIOB,GPIO_Pin_13);
}
if(USART_GetITStatus(USART2, USART_IT_RXNE) == SET)
{
//接收中断
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
usart2RecvBuffer[usart2RecvCnt++] = (uint8_t)USART_ReceiveData(USART2); //保存一个字节
if(usart2RecvBuffer[0] == 0xad)
{
if(usart2RecvCnt<2)
return;
if(usart2RecvBuffer[1] == 0xfc)
{
if( usart2RecvCnt >5)
{
USART1Send(usart2RecvBuffer,usart2RecvCnt);
usart2RecvCnt=0;
TaskSchedulerFlag.zigbeeRecvFlag = TASK_FLAG_SET;
//printf("OK \r\n");
}
}
else
{
usart2RecvCnt = 0;
printf("%x\r\n",usart2RecvBuffer[1]);
}
}
else
{
usart2RecvCnt = 0;
}
/*if( usart2RecvBuffer[1] == 0x7c )
{
//printf("a=%x\r\n",usart2RecvBuffer[1]);
if( usart2RecvCnt >= 3 )
{
usart2RecvCnt = 0;
//TaskSchedulerFlag.zigbeeRecvFlag = TASK_FLAG_SET;
//printf("%x\r\n",usart2RecvBuffer[0]);
//printf("%x\r\n",usart2RecvBuffer[1]);
//USART1Send(usart2RecvBuffer,3);
} */
}
}
/**
* @brief This function handles USART2_IRQHandler.
* @param None
* @retval None
*/
void USART3_IRQHandler(void)
{
if(USART_GetITStatus(USART3, USART_IT_RXNE) == SET)
{
//接收中断
usart3RecvBuffer[usart3RecvCnt++] = (uint8_t)USART_ReceiveData(USART3); //保存一个字节
if( ( usart3RecvBuffer[0] == USART_PDU_START ) && ( usart3RecvBuffer[1] == USART_PDU_END ) )
{
if( usart3RecvCnt >= ( usart3RecvBuffer[2] + 3 ) )
{
usart3RecvCnt = 0;
}
}
else
{
if( usart3RecvCnt >= 2)
{
usart3RecvCnt = 0;
}
}
}
}
/******************************************************************************/
/* STM32F10x Peripherals Interrupt Handlers */
/* Add here the Interrupt Handler for the used peripheral(s) (PPP), for the */
/* available peripheral interrupt handler's name please refer to the startup */
/* file (startup_stm32f10x_xx.s). */
/******************************************************************************/
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/