小华芯片HC32F030之Timer3 平台keil V5.31通过PA8捕获输入信号/****************************************************************************** * Include files ******************************************************************************/ #include ddl.h #include timer3.h #include gpio.h #include flash.h /****************************************************************************** * Local pre-processor symbols/macros (#define) ******************************************************************************/ /****************************************************************************** * Global variable definitions (declared in header file with extern) ******************************************************************************/ uint32_t Tim3_Capture_Value1,Tim3_Capure_Value2; volatile int32_t Tim3_Capture_Value; volatile uint16_t Tim3_Uev_Cnt; /******************************************************************************* * Local variable definitions (static) ******************************************************************************/ /******************************************************************************* * Local function prototypes (static) ******************************************************************************/ /******************************************************************************* * Function implementation - global (extern) and local (static) ******************************************************************************/ /******************************************************************************* * TIM3中断服务函数 ******************************************************************************/ void Tim3_IRQHandler(void) { static uint8_t i; //Timer3 捕获中断A if(TRUE Tim3_GetIntFlag(Tim3CA0Irq)) { if(0 i) { Tim3_Capture_Value1 M0P_TIM3_MODE23-CCR0A_f.CCR0A; //第一次读取捕获值 Tim3_Uev_Cnt 0; i; } else { Tim3_Capure_Value2 M0P_TIM3_MODE23-CCR0A_f.CCR0A; //第二次读取捕获值 Tim3_Capture_Value Tim3_Uev_Cnt * 0xFFFF Tim3_Capure_Value2 - Tim3_Capture_Value1; //两次捕获之间的差值 Tim3_Uev_Cnt 0; i 0; } Tim3_ClearIntFlag(Tim3CA0Irq); //清中断标志 } //timer3计数溢出中断 if(TRUE Tim3_GetIntFlag(Tim3UevIrq)) { Tim3_Uev_Cnt; Tim3_ClearIntFlag(Tim3UevIrq); } } //时钟初始化 void App_ClockCfg(void) { en_flash_waitcycle_t enFlashWait; stc_sysctrl_pll_cfg_t stcPLLCfg; //结构体初始化清零 DDL_ZERO_STRUCT(stcPLLCfg); enFlashWait FlashWaitCycle1; //读等待周期设置为1当HCLK大于24MHz时必须至少为1 Flash_WaitCycle(enFlashWait); // Flash 等待1个周期 stcPLLCfg.enInFreq SysctrlPllInFreq4_6MHz; //RCH 4MHz stcPLLCfg.enOutFreq SysctrlPllOutFreq36_48MHz; //PLL 输出48MHz stcPLLCfg.enPllClkSrc SysctrlPllRch; //输入时钟源选择RCH stcPLLCfg.enPllMul SysctrlPllMul12; //4MHz x 12 48MHz Sysctrl_SetPLLFreq(stcPLLCfg); Sysctrl_SetPLLStableTime(SysctrlPllStableCycle16384); Sysctrl_ClkSourceEnable(SysctrlClkPLL, TRUE); Sysctrl_SysClkSwitch(SysctrlClkPLL);/// 时钟切换 } //Timer3 Port端口配置 void App_Timer3PortCfg(void) { stc_gpio_cfg_t stcTIM3Port; //结构体初始化清零 DDL_ZERO_STRUCT(stcTIM3Port); Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE); //端口外设时钟使能 stcTIM3Port.enDir GpioDirIn; Gpio_Init(GpioPortA, GpioPin8, stcTIM3Port); Gpio_SetAfMode(GpioPortA,GpioPin8,GpioAf2); //PA08设置为TIM3_CH0A #if 0 Gpio_Init(GpioPortA, GpioPin7, stcTIM3Port); Gpio_SetAfMode(GpioPortA,GpioPin7,GpioAf4); //PA07设置为TIM3_CH0B Gpio_Init(GpioPortB, GpioPin10, stcTIM3Port); Gpio_SetAfMode(GpioPortB,GpioPin10,GpioAf5); //PB10设置为TIM3_CH1A Gpio_Init(GpioPortB, GpioPin0, stcTIM3Port); Gpio_SetAfMode(GpioPortB,GpioPin0,GpioAf2); //PB00设置为TIM3_CH1B Gpio_Init(GpioPortB, GpioPin8, stcTIM3Port); Gpio_SetAfMode(GpioPortB,GpioPin8,GpioAf6); //PB08设置为TIM3_CH2A Gpio_Init(GpioPortB, GpioPin15, stcTIM3Port); Gpio_SetAfMode(GpioPortB,GpioPin15,GpioAf2); //PB15设置为TIM3_CH2B #endif } //Timer3 配置 void App_Timer3Cfg(void) { uint16_t u16ArrValue; uint16_t u16CntValue; stc_tim3_mode23_cfg_t stcTim3BaseCfg; stc_tim3_m23_input_cfg_t stcTim3PortCapCfg; //结构体初始化清零 DDL_ZERO_STRUCT(stcTim3BaseCfg); DDL_ZERO_STRUCT(stcTim3PortCapCfg); Sysctrl_SetPeripheralGate(SysctrlPeripheralTim3, TRUE); //Timer3外设时钟使能 stcTim3BaseCfg.enWorkMode Tim3WorkMode2; //锯齿波模式 stcTim3BaseCfg.enCT Tim3Timer; //定时器功能计数时钟为内部PCLK stcTim3BaseCfg.enPRS Tim3PCLKDiv64; //PCLK/64 stcTim3BaseCfg.enCntDir Tim3CntUp; //向上计数在三角波模式时只读 Tim3_Mode23_Init(stcTim3BaseCfg); //TIM3 的模式23功能初始化 stcTim3PortCapCfg.enCHxACmpCap Tim3CHxCapMode; //CHA通道设置为捕获模式 stcTim3PortCapCfg.enCHxACapSel Tim3CHxCapFallRise; //CHA通道上升沿下降沿捕获都使能 stcTim3PortCapCfg.enCHxAInFlt Tim3FltPCLKDiv16Cnt3; //PCLK/16 3个连续有效 stcTim3PortCapCfg.enCHxAPolarity Tim3PortPositive; //正常输入输出 Tim3_M23_PortInput_Cfg(Tim3CH0, stcTim3PortCapCfg); //端口输入初始化配置 //Tim3_M23_PortInput_Cfg(Tim3CH1, stcTim3PortCapCfg); //端口输入初始化配置 //Tim3_M23_PortInput_Cfg(Tim3CH2, stcTim3PortCapCfg); //端口输入初始化配置 u16ArrValue 0xFFFF; Tim3_M23_ARRSet(u16ArrValue, TRUE); //设置重载值,并使能缓存 u16CntValue 0; Tim3_M23_Cnt16Set(u16CntValue); //设置计数初值 Tim3_ClearAllIntFlag(); //清中断标志 Tim3_Mode23_EnableIrq(Tim3CA0Irq); //使能TIM3 CA0比较/捕获中断 Tim3_Mode23_EnableIrq(Tim3UevIrq); //使能TIM3 Uev更新中断 EnableNvic(TIM3_IRQn, IrqLevel1, TRUE); //TIM3中断使能 } /** ****************************************************************************** ** \brief Main function of project ** ** \return uint32_t return value, if needed ** ** This sample ** ******************************************************************************/ int32_t main(void) { App_ClockCfg(); //时钟初始化 App_Timer3PortCfg(); //Timer3 Port端口配置 App_Timer3Cfg(); //Timer3 配置 Tim3_M23_Run(); //运行。 while (1) { } } /****************************************************************************** * EOF (not truncated) ******************************************************************************/成功触发中断。从PB13捕获输入信号/****************************************************************************** * Include files ******************************************************************************/ #include ddl.h #include timer3.h #include gpio.h #include flash.h /****************************************************************************** * Local pre-processor symbols/macros (#define) ******************************************************************************/ /****************************************************************************** * Global variable definitions (declared in header file with extern) ******************************************************************************/ uint32_t Tim3_Capture_Value1,Tim3_Capure_Value2; volatile int32_t Tim3_Capture_Value; volatile uint16_t Tim3_Uev_Cnt; /******************************************************************************* * Local variable definitions (static) ******************************************************************************/ /******************************************************************************* * Local function prototypes (static) ******************************************************************************/ /******************************************************************************* * Function implementation - global (extern) and local (static) ******************************************************************************/ /******************************************************************************* * TIM3中断服务函数 ******************************************************************************/ uint32_t WatchTemp0; void Tim3_IRQHandler(void) { static uint8_t i; //Timer3 捕获中断A if(TRUE Tim3_GetIntFlag(Tim3CB1Irq)) { if(0 i) { Tim3_Capture_Value1 M0P_TIM3_MODE23-CCR1B_f.CCR1B;//.CCR0A; //第一次读取捕获值 Tim3_Uev_Cnt 0; i; } else { Tim3_Capure_Value2 M0P_TIM3_MODE23-CCR1B_f.CCR1B;//CCR0A_f.CCR0A; //第二次读取捕获值 Tim3_Capture_Value Tim3_Uev_Cnt * 0xFFFF Tim3_Capure_Value2 - Tim3_Capture_Value1; //两次捕获之间的差值 Tim3_Uev_Cnt 0; i 0; } Tim3_ClearIntFlag(Tim3CB1Irq); //清中断标志 } //timer3计数溢出中断 if(TRUE Tim3_GetIntFlag(Tim3UevIrq)) { Tim3_Uev_Cnt; WatchTemp; Tim3_ClearIntFlag(Tim3UevIrq); } } //时钟初始化 void App_ClockCfg(void) { en_flash_waitcycle_t enFlashWait; stc_sysctrl_pll_cfg_t stcPLLCfg; //结构体初始化清零 DDL_ZERO_STRUCT(stcPLLCfg); enFlashWait FlashWaitCycle1; //读等待周期设置为1当HCLK大于24MHz时必须至少为1 Flash_WaitCycle(enFlashWait); // Flash 等待1个周期 stcPLLCfg.enInFreq SysctrlPllInFreq4_6MHz; //RCH 4MHz stcPLLCfg.enOutFreq SysctrlPllOutFreq36_48MHz; //PLL 输出48MHz stcPLLCfg.enPllClkSrc SysctrlPllRch; //输入时钟源选择RCH stcPLLCfg.enPllMul SysctrlPllMul12; //4MHz x 12 48MHz Sysctrl_SetPLLFreq(stcPLLCfg); Sysctrl_SetPLLStableTime(SysctrlPllStableCycle16384); Sysctrl_ClkSourceEnable(SysctrlClkPLL, TRUE); Sysctrl_SysClkSwitch(SysctrlClkPLL);/// 时钟切换 } //Timer3 Port端口配置 void App_Timer3PortCfg(void) { stc_gpio_cfg_t stcTIM3Port; //结构体初始化清零 DDL_ZERO_STRUCT(stcTIM3Port); Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE); //端口外设时钟使能 stcTIM3Port.enDir GpioDirIn; Gpio_Init(GpioPortC, GpioPin13, stcTIM3Port); Gpio_SetAfMode(GpioPortC,GpioPin13,GpioAf3); //PA08设置为TIM3_CH0A #if 0 Gpio_Init(GpioPortA, GpioPin7, stcTIM3Port); Gpio_SetAfMode(GpioPortA,GpioPin7,GpioAf4); //PA07设置为TIM3_CH0B Gpio_Init(GpioPortB, GpioPin10, stcTIM3Port); Gpio_SetAfMode(GpioPortB,GpioPin10,GpioAf5); //PB10设置为TIM3_CH1A Gpio_Init(GpioPortB, GpioPin0, stcTIM3Port); Gpio_SetAfMode(GpioPortB,GpioPin0,GpioAf2); //PB00设置为TIM3_CH1B Gpio_Init(GpioPortB, GpioPin8, stcTIM3Port); Gpio_SetAfMode(GpioPortB,GpioPin8,GpioAf6); //PB08设置为TIM3_CH2A Gpio_Init(GpioPortB, GpioPin15, stcTIM3Port); Gpio_SetAfMode(GpioPortB,GpioPin15,GpioAf2); //PB15设置为TIM3_CH2B #endif } //Timer3 配置 void App_Timer3Cfg(void) { uint16_t u16ArrValue; uint16_t u16CntValue; stc_tim3_mode23_cfg_t stcTim3BaseCfg; stc_tim3_m23_input_cfg_t stcTim3PortCapCfg; //结构体初始化清零 DDL_ZERO_STRUCT(stcTim3BaseCfg); DDL_ZERO_STRUCT(stcTim3PortCapCfg); Sysctrl_SetPeripheralGate(SysctrlPeripheralTim3, TRUE); //Timer3外设时钟使能 stcTim3BaseCfg.enWorkMode Tim3WorkMode2; //锯齿波模式 stcTim3BaseCfg.enCT Tim3Timer; //定时器功能计数时钟为内部PCLK stcTim3BaseCfg.enPRS Tim3PCLKDiv64; //PCLK/64 stcTim3BaseCfg.enCntDir Tim3CntUp; //向上计数在三角波模式时只读 Tim3_Mode23_Init(stcTim3BaseCfg); //TIM3 的模式23功能初始化 stcTim3PortCapCfg.enCHxBCmpCap Tim3CHxCapMode; //CHA通道设置为捕获模式 stcTim3PortCapCfg.enCHxBCapSel Tim3CHxCapFallRise; //CHA通道上升沿下降沿捕获都使能 stcTim3PortCapCfg.enCHxBInFlt Tim3FltPCLKDiv16Cnt3; //PCLK/16 3个连续有效 stcTim3PortCapCfg.enCHxBPolarity Tim3PortPositive; //正常输入输出 Tim3_M23_PortInput_Cfg(Tim3CH1, stcTim3PortCapCfg); //端口输入初始化配置 //Tim3_M23_PortInput_Cfg(Tim3CH1, stcTim3PortCapCfg); //端口输入初始化配置 //Tim3_M23_PortInput_Cfg(Tim3CH2, stcTim3PortCapCfg); //端口输入初始化配置 u16ArrValue 0xFFFF; Tim3_M23_ARRSet(u16ArrValue, TRUE); //设置重载值,并使能缓存 u16CntValue 0; Tim3_M23_Cnt16Set(u16CntValue); //设置计数初值 Tim3_ClearAllIntFlag(); //清中断标志 Tim3_Mode23_EnableIrq(Tim3CB1Irq); //使能TIM3 CA0比较/捕获中断 Tim3_Mode23_EnableIrq(Tim3UevIrq); //使能TIM3 Uev更新中断 EnableNvic(TIM3_IRQn, IrqLevel1, TRUE); //TIM3中断使能 } /** ****************************************************************************** ** \brief Main function of project ** ** \return uint32_t return value, if needed ** ** This sample ** ******************************************************************************/ int temp0; int32_t main(void) { App_ClockCfg(); //时钟初始化 App_Timer3PortCfg(); //Timer3 Port端口配置 App_Timer3Cfg(); //Timer3 配置 Tim3_M23_Run(); //运行。 while (1) { temp; } } /****************************************************************************** * EOF (not truncated) ******************************************************************************/成功触发中断。通过捕获中断来处理433信号测量的是下降沿到上升沿之间的低电平时间通过对时间的判断来解码。/****************************************************************************** * Include files ******************************************************************************/ #include ddl.h #include timer3.h #include gpio.h #include flash.h /****************************************************************************** * Local pre-processor symbols/macros (#define) ******************************************************************************/ /****************************************************************************** * Global variable definitions (declared in header file with extern) ******************************************************************************/ uint32_t Tim3_Capture_Value1,Tim3_Capure_Value2; volatile int32_t Tim3_Capture_Value; volatile uint16_t Tim3_Uev_Cnt; /******************************************************************************* * Local variable definitions (static) ******************************************************************************/ /******************************************************************************* * Local function prototypes (static) ******************************************************************************/ /******************************************************************************* * Function implementation - global (extern) and local (static) ******************************************************************************/ /******************************************************************************* * TIM3中断服务函数 ******************************************************************************/ uint32_t WatchTemp0; uint8_t savestartflag0; uint32_t SaveTemp[32]; uint32_t RFValue0; uint8_t MachineUPFalg0; uint8_t MachineDOWNFalg0; uint8_t MachineSTOPFalg0; void Tim3_IRQHandler(void) { static uint8_t i0,j0; //Timer3 捕获中断A if(TRUE Tim3_GetIntFlag(Tim3CB1Irq)) { if(0 i) { Tim3_Capture_Value1 M0P_TIM3_MODE23-CCR1B_f.CCR1B;//.CCR0A; //第一次读取捕获值 Tim3_Uev_Cnt 0; i; } else { Tim3_Capure_Value2 M0P_TIM3_MODE23-CCR1B_f.CCR1B;//CCR0A_f.CCR0A; //第二次读取捕获值 Tim3_Capture_Value Tim3_Uev_Cnt * 0xFFFF Tim3_Capure_Value2 - Tim3_Capture_Value1; //两次捕获之间的差值 Tim3_Uev_Cnt 0; if(savestartflag1) { if(j32) { SaveTemp[j]Tim3_Capture_Value; if(Tim3_Capture_Value300 Tim3_Capture_Value150) { RFValue RFValue1 | 1; } else if(Tim3_Capture_Value700 Tim3_Capture_Value450) { RFValue RFValue1 | 0; } else { savestartflag0; RFValue0; j0; } j; } else { savestartflag0; if(RFValue0x4E91D874) { MachineUPFalg1; } if(RFValue0x4E91D878) { MachineDOWNFalg1; } if(RFValue0x4E91D872) { MachineSTOPFalg1; } RFValue0; j0; } } if(Tim3_Capture_Value4000 Tim3_Capture_Value7000) { savestartflag1; } i 0; } Tim3_ClearIntFlag(Tim3CB1Irq); //清中断标志 } //timer3计数溢出中断 if(TRUE Tim3_GetIntFlag(Tim3UevIrq)) { Tim3_Uev_Cnt; WatchTemp; Tim3_ClearIntFlag(Tim3UevIrq); } } //时钟初始化 void App_ClockCfg(void) { en_flash_waitcycle_t enFlashWait; stc_sysctrl_pll_cfg_t stcPLLCfg; //结构体初始化清零 DDL_ZERO_STRUCT(stcPLLCfg); enFlashWait FlashWaitCycle1; //读等待周期设置为1当HCLK大于24MHz时必须至少为1 Flash_WaitCycle(enFlashWait); // Flash 等待1个周期 stcPLLCfg.enInFreq SysctrlPllInFreq4_6MHz; //RCH 4MHz stcPLLCfg.enOutFreq SysctrlPllOutFreq36_48MHz; //PLL 输出48MHz stcPLLCfg.enPllClkSrc SysctrlPllRch; //输入时钟源选择RCH stcPLLCfg.enPllMul SysctrlPllMul12; //4MHz x 12 48MHz Sysctrl_SetPLLFreq(stcPLLCfg); Sysctrl_SetPLLStableTime(SysctrlPllStableCycle16384); Sysctrl_ClkSourceEnable(SysctrlClkPLL, TRUE); Sysctrl_SysClkSwitch(SysctrlClkPLL);/// 时钟切换 } //Timer3 Port端口配置 void App_Timer3PortCfg(void) { stc_gpio_cfg_t stcTIM3Port; //结构体初始化清零 DDL_ZERO_STRUCT(stcTIM3Port); Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE); //端口外设时钟使能 stcTIM3Port.enDir GpioDirIn; Gpio_Init(GpioPortC, GpioPin13, stcTIM3Port); Gpio_SetAfMode(GpioPortC,GpioPin13,GpioAf3); //PA08设置为TIM3_CH0A #if 0 Gpio_Init(GpioPortA, GpioPin7, stcTIM3Port); Gpio_SetAfMode(GpioPortA,GpioPin7,GpioAf4); //PA07设置为TIM3_CH0B Gpio_Init(GpioPortB, GpioPin10, stcTIM3Port); Gpio_SetAfMode(GpioPortB,GpioPin10,GpioAf5); //PB10设置为TIM3_CH1A Gpio_Init(GpioPortB, GpioPin0, stcTIM3Port); Gpio_SetAfMode(GpioPortB,GpioPin0,GpioAf2); //PB00设置为TIM3_CH1B Gpio_Init(GpioPortB, GpioPin8, stcTIM3Port); Gpio_SetAfMode(GpioPortB,GpioPin8,GpioAf6); //PB08设置为TIM3_CH2A Gpio_Init(GpioPortB, GpioPin15, stcTIM3Port); Gpio_SetAfMode(GpioPortB,GpioPin15,GpioAf2); //PB15设置为TIM3_CH2B #endif } //Timer3 配置 void App_Timer3Cfg(void) { uint16_t u16ArrValue; uint16_t u16CntValue; stc_tim3_mode23_cfg_t stcTim3BaseCfg; stc_tim3_m23_input_cfg_t stcTim3PortCapCfg; //结构体初始化清零 DDL_ZERO_STRUCT(stcTim3BaseCfg); DDL_ZERO_STRUCT(stcTim3PortCapCfg); Sysctrl_SetPeripheralGate(SysctrlPeripheralTim3, TRUE); //Timer3外设时钟使能 stcTim3BaseCfg.enWorkMode Tim3WorkMode2; //锯齿波模式 stcTim3BaseCfg.enCT Tim3Timer; //定时器功能计数时钟为内部PCLK stcTim3BaseCfg.enPRS Tim3PCLKDiv64; //PCLK/64 stcTim3BaseCfg.enCntDir Tim3CntUp; //向上计数在三角波模式时只读 Tim3_Mode23_Init(stcTim3BaseCfg); //TIM3 的模式23功能初始化 stcTim3PortCapCfg.enCHxBCmpCap Tim3CHxCapMode; //CHA通道设置为捕获模式 stcTim3PortCapCfg.enCHxBCapSel Tim3CHxCapFallRise; //CHA通道上升沿下降沿捕获都使能 stcTim3PortCapCfg.enCHxBInFlt Tim3FltPCLKDiv16Cnt3; //PCLK/16 3个连续有效 stcTim3PortCapCfg.enCHxBPolarity Tim3PortPositive; //正常输入输出 Tim3_M23_PortInput_Cfg(Tim3CH1, stcTim3PortCapCfg); //端口输入初始化配置 //Tim3_M23_PortInput_Cfg(Tim3CH1, stcTim3PortCapCfg); //端口输入初始化配置 //Tim3_M23_PortInput_Cfg(Tim3CH2, stcTim3PortCapCfg); //端口输入初始化配置 u16ArrValue 0xFFFF; Tim3_M23_ARRSet(u16ArrValue, TRUE); //设置重载值,并使能缓存 u16CntValue 0; Tim3_M23_Cnt16Set(u16CntValue); //设置计数初值 Tim3_ClearAllIntFlag(); //清中断标志 Tim3_Mode23_EnableIrq(Tim3CB1Irq); //使能TIM3 CA0比较/捕获中断 Tim3_Mode23_EnableIrq(Tim3UevIrq); //使能TIM3 Uev更新中断 EnableNvic(TIM3_IRQn, IrqLevel1, TRUE); //TIM3中断使能 } /** ****************************************************************************** ** \brief Main function of project ** ** \return uint32_t return value, if needed ** ** This sample ** ******************************************************************************/ int temp0; int32_t main(void) { App_ClockCfg(); //时钟初始化 App_Timer3PortCfg(); //Timer3 Port端口配置 App_Timer3Cfg(); //Timer3 配置 Tim3_M23_Run(); //运行。 while (1) { temp; } } /****************************************************************************** * EOF (not truncated) ******************************************************************************/可以捕获并解码成功率不是百分百尤其是仿真时。优化后/****************************************************************************** * Include files ******************************************************************************/ #include ddl.h #include timer3.h #include gpio.h #include flash.h /****************************************************************************** * 宏定义 ******************************************************************************/ #define RF_SYNC_MIN 4000 // 同步头最小值 #define RF_SYNC_MAX 7000 // 同步头最大值 #define RF_BIT1_MIN 150 // bit1 最小脉宽 #define RF_BIT1_MAX 300 // bit1 最大脉宽 #define RF_BIT0_MIN 450 // bit0 最小脉宽 #define RF_BIT0_MAX 700 // bit0 最大脉宽 #define RF_BIT_COUNT 32 // 数据位数 #define RF_TIMEOUT_CNT 50000 // 超时计数约66ms 750KHz /****************************************************************************** * Global variables ******************************************************************************/ volatile int32_t Tim3_Capture_Value; volatile uint16_t Tim3_Uev_Cnt; // RF解码相关 volatile uint8_t RF_DecodeState 0; // 0:空闲 1:同步头等待 2:数据接收 volatile uint32_t RF_Value 0; volatile uint8_t RF_BitCount 0; volatile uint8_t RF_UP_Flag 0; volatile uint8_t RF_DOWN_Flag 0; volatile uint8_t RF_STOP_Flag 0; volatile uint16_t RF_TimeoutCnt 0; // 调试用 uint32_t WatchTemp 0; /******************************************************************************* * TIM3中断服务函数 - 优化版 ******************************************************************************/ void Tim3_IRQHandler(void) { static uint16_t u16CapValue1 0; static uint8_t u8CapState 0; uint16_t u16CapValue2; int32_t s32PulseWidth; // 捕获中断 if(TRUE Tim3_GetIntFlag(Tim3CB1Irq)) { // 读取当前捕获值 u16CapValue2 M0P_TIM3_MODE23-CCR1B_f.CCR1B; if(0 u8CapState) { // 第一次捕获记录起始值 u16CapValue1 u16CapValue2; Tim3_Uev_Cnt 0; u8CapState 1; } else { // 第二次捕获计算脉宽 s32PulseWidth Tim3_Uev_Cnt * 0xFFFF u16CapValue2 - u16CapValue1; Tim3_Uev_Cnt 0; u8CapState 0; // 处理脉宽数据 RF_TimeoutCnt 0; // 复位超时计数 if(0 RF_DecodeState) { // ----- 空闲状态检测同步头 ----- if(s32PulseWidth RF_SYNC_MIN s32PulseWidth RF_SYNC_MAX) { RF_DecodeState 1; // 进入数据接收状态 RF_BitCount 0; RF_Value 0; } } else if(1 RF_DecodeState) { // ----- 数据接收状态 ----- if(RF_BitCount RF_BIT_COUNT) { // 判断bit值 if(s32PulseWidth RF_BIT1_MIN s32PulseWidth RF_BIT1_MAX) { RF_Value (RF_Value 1) | 1; RF_BitCount; } else if(s32PulseWidth RF_BIT0_MIN s32PulseWidth RF_BIT0_MAX) { RF_Value (RF_Value 1) | 0; RF_BitCount; } else { // 无效脉宽重新同步 RF_DecodeState 0; RF_BitCount 0; RF_Value 0; } // 检查是否接收完成 if(RF_BitCount RF_BIT_COUNT) { // 解码完成验证数据 if(RF_Value 0x4E91D874) { RF_UP_Flag 1; } else if(RF_Value 0x4E91D878) { RF_DOWN_Flag 1; } else if(RF_Value 0x4E91D872) { RF_STOP_Flag 1; } // 复位状态 RF_DecodeState 0; RF_BitCount 0; RF_Value 0; } } } } Tim3_ClearIntFlag(Tim3CB1Irq); } // 溢出中断 if(TRUE Tim3_GetIntFlag(Tim3UevIrq)) { Tim3_Uev_Cnt; WatchTemp; // 超时检测如果长时间没有收到有效信号复位状态 if(RF_DecodeState ! 0) { RF_TimeoutCnt; if(RF_TimeoutCnt RF_TIMEOUT_CNT) { RF_DecodeState 0; RF_BitCount 0; RF_Value 0; RF_TimeoutCnt 0; } } Tim3_ClearIntFlag(Tim3UevIrq); } } /******************************************************************************* * RF解码状态复位函数 ******************************************************************************/ void RF_ResetDecoder(void) { RF_DecodeState 0; RF_BitCount 0; RF_Value 0; RF_TimeoutCnt 0; } /******************************************************************************* * 获取解码结果在主循环中调用 * 返回值1-UP, 2-DOWN, 3-STOP, 0-无 ******************************************************************************/ uint8_t RF_GetResult(void) { uint8_t u8Result 0; if(RF_UP_Flag) { RF_UP_Flag 0; u8Result 1; } else if(RF_DOWN_Flag) { RF_DOWN_Flag 0; u8Result 2; } else if(RF_STOP_Flag) { RF_STOP_Flag 0; u8Result 3; } return u8Result; } // 时钟初始化保持不变 void App_ClockCfg(void) { en_flash_waitcycle_t enFlashWait; stc_sysctrl_pll_cfg_t stcPLLCfg; DDL_ZERO_STRUCT(stcPLLCfg); enFlashWait FlashWaitCycle1; Flash_WaitCycle(enFlashWait); stcPLLCfg.enInFreq SysctrlPllInFreq4_6MHz; stcPLLCfg.enOutFreq SysctrlPllOutFreq36_48MHz; stcPLLCfg.enPllClkSrc SysctrlPllRch; stcPLLCfg.enPllMul SysctrlPllMul12; Sysctrl_SetPLLFreq(stcPLLCfg); Sysctrl_SetPLLStableTime(SysctrlPllStableCycle16384); Sysctrl_ClkSourceEnable(SysctrlClkPLL, TRUE); Sysctrl_SysClkSwitch(SysctrlClkPLL); } // Timer3端口配置 void App_Timer3PortCfg(void) { stc_gpio_cfg_t stcTIM3Port; DDL_ZERO_STRUCT(stcTIM3Port); Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE); stcTIM3Port.enDir GpioDirIn; Gpio_Init(GpioPortC, GpioPin13, stcTIM3Port); Gpio_SetAfMode(GpioPortC, GpioPin13, GpioAf3); } // Timer3配置保持不变 void App_Timer3Cfg(void) { uint16_t u16ArrValue; uint16_t u16CntValue; stc_tim3_mode23_cfg_t stcTim3BaseCfg; stc_tim3_m23_input_cfg_t stcTim3PortCapCfg; DDL_ZERO_STRUCT(stcTim3BaseCfg); DDL_ZERO_STRUCT(stcTim3PortCapCfg); Sysctrl_SetPeripheralGate(SysctrlPeripheralTim3, TRUE); stcTim3BaseCfg.enWorkMode Tim3WorkMode2; stcTim3BaseCfg.enCT Tim3Timer; stcTim3BaseCfg.enPRS Tim3PCLKDiv64; stcTim3BaseCfg.enCntDir Tim3CntUp; Tim3_Mode23_Init(stcTim3BaseCfg); stcTim3PortCapCfg.enCHxBCmpCap Tim3CHxCapMode; stcTim3PortCapCfg.enCHxBCapSel Tim3CHxCapFallRise; stcTim3PortCapCfg.enCHxBInFlt Tim3FltPCLKDiv16Cnt3; stcTim3PortCapCfg.enCHxBPolarity Tim3PortPositive; Tim3_M23_PortInput_Cfg(Tim3CH1, stcTim3PortCapCfg); u16ArrValue 0xFFFF; Tim3_M23_ARRSet(u16ArrValue, TRUE); u16CntValue 0; Tim3_M23_Cnt16Set(u16CntValue); Tim3_ClearAllIntFlag(); Tim3_Mode23_EnableIrq(Tim3CB1Irq); Tim3_Mode23_EnableIrq(Tim3UevIrq); EnableNvic(TIM3_IRQn, IrqLevel1, TRUE); } /// Relay #define Open_Door_PORT GpioPortD #define Open_Door_PIN GpioPin6 #define Close_Door_PORT GpioPortD #define Close_Door_PIN GpioPin7 #define Brake_PORT GpioPortA #define Brake_PIN GpioPin12 static void App_RelayInit(void) { stc_gpio_cfg_t stcGpioCfg; /// 打开GPIO外设时钟门控 Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE); /// 端口方向配置-输出(其它参数与以上输入配置参数一致) stcGpioCfg.enDir GpioDirOut; /// 端口上下拉配置-下拉 stcGpioCfg.enPu GpioPuEnable;//GpioPuDisable; stcGpioCfg.enPd GpioPdDisable;//GpioPdEnable; /// LED关闭 Gpio_ClrIO(Open_Door_PORT, Open_Door_PIN); Gpio_ClrIO(Close_Door_PORT, Close_Door_PIN); Gpio_ClrIO(Brake_PORT, Brake_PIN); /// GPIO IO LED端口初始化 Gpio_Init(Open_Door_PORT, Open_Door_PIN, stcGpioCfg); Gpio_Init(Close_Door_PORT, Close_Door_PIN, stcGpioCfg); Gpio_Init(Brake_PORT, Brake_PIN, stcGpioCfg); } int temp 0; unsigned int RF_OP_cnt0; int32_t main(void) { App_ClockCfg(); App_RelayInit(); App_Timer3PortCfg(); App_Timer3Cfg(); Tim3_M23_Run(); while (1) { temp; // 处理解码结果 // uint8_t u8Result RF_GetResult(); if(RF_UP_Flag 1) { // UP按键处理 Gpio_SetIO(Close_Door_PORT, Close_Door_PIN); if(RF_OP_cnt1000000) { RF_OP_cnt; } else { RF_OP_cnt0; Gpio_ClrIO(Close_Door_PORT, Close_Door_PIN); RF_UP_Flag0; } } if(RF_DOWN_Flag 1) { // UP按键处理 Gpio_SetIO(Open_Door_PORT, Open_Door_PIN); if(RF_OP_cnt1000000) { RF_OP_cnt; } else { RF_OP_cnt0; Gpio_ClrIO(Open_Door_PORT, Open_Door_PIN); RF_DOWN_Flag0; } } if(RF_STOP_Flag 1) { // UP按键处理 Gpio_SetIO(Brake_PORT, Brake_PIN); if(RF_OP_cnt1000000) { RF_OP_cnt; } else { RF_OP_cnt0; Gpio_ClrIO(Brake_PORT, Brake_PIN); RF_STOP_Flag0; } } } }仿真时称功率也不高。不仿真直接上电工作遥控器控制还是可以的。

本周精选

本月热点