小华芯片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; } } } }仿真时称功率也不高。不仿真直接上电工作遥控器控制还是可以的。

相关新闻

正规高压接地线制造厂:这3家通过国家检测,工程人必看

正规高压接地线制造厂:这3家通过国家检测,工程人必看

在电力工程中,高压接地线是保障施工人员生命安全的最后一道防线。据国家电网2023年发布的电力安全事故统计显示,因接地线质量问题引发的触电事故占比高达17%,直接经济损失超过2.3亿元。这意味着,选对一家正规、通过国家检测的接地…

2026/7/18 3:16:02阅读更多 →
Codex插件开发实战:从Annotations到OpenAI协议对接

Codex插件开发实战:从Annotations到OpenAI协议对接

1. 项目概述:Codex 插件生态不是“装个插件就完事”,而是重构工作流的起点 Codex 插件生态实操指南——这个标题里藏着一个被严重低估的事实:它根本不是教你怎么在 IDE 里点几下鼠标安装一个“AI 辅助写代码”的小工具。如果你还停留在“Cod…

2026/7/18 3:16:02阅读更多 →
PHP开发全栈指南:从基础到高级实战资源

PHP开发全栈指南:从基础到高级实战资源

1. PHP资源大全:从入门到精通的完整指南作为一名使用PHP开发超过8年的全栈工程师,我深知学习过程中优质资源的重要性。今天要分享的这份"国外程序员整理的PHP资源大全"堪称PHP开发者必备的宝典,它系统性地整理了从基础语法到高级架…

2026/7/18 3:16:02阅读更多 →
机器学习模型上线后如何保障生产稳定性与业务韧性

机器学习模型上线后如何保障生产稳定性与业务韧性

1. 为什么“模型上线”才是ML项目真正的起点,而不是终点你有没有经历过这样的场景:凌晨两点,手机突然震动,钉钉消息疯狂弹出——“风控模型响应超时,支付链路卡在决策环节”;“信贷评分服务P99延迟突破800m…

2026/7/18 4:16:05阅读更多 →
【无标题】图像纹理分析方法-----灰度共生矩阵

【无标题】图像纹理分析方法-----灰度共生矩阵

图像纹理:有重复性结构的图像(布料纹路,树木裂纹)灰度共生矩阵定义:从灰度为i的像素点出发,距离为(dx,dy)的另一个像素点灰度值为j的概率;P(i,j|d,角度)#{(x,…

2026/7/18 4:16:05阅读更多 →
AI初创融资的工程化逻辑:技术可行性、市场信号与估值折现

AI初创融资的工程化逻辑:技术可行性、市场信号与估值折现

1. 项目概述:当AI创业公司账上突然多出七位数美元,钱到底从哪儿来?“How Are These AI Startups Gathering $Millions in Funding?”——这个标题不是在问“怎么融资”,而是在追问一个更锋利的问题:为什么是现在&…

2026/7/18 4:16:05阅读更多 →
Power BI | 聊聊信息层级和报表设计

Power BI | 聊聊信息层级和报表设计

周五下午五点,小李第三次把月度经营仪表板投到大屏上。11个页面、47个视觉对象、从订单明细到退货率到客单价同比环比,应有尽有。 老板看了不到两分钟,问了三个问题:「上个月收入多少?」「跟目标差多少?」「…

2026/7/18 4:16:05阅读更多 →
嵌入式校招面试指南:从STM32开发到项目实战的完整攻略

嵌入式校招面试指南:从STM32开发到项目实战的完整攻略

1. 先搞清楚嵌入式校招到底在面什么很多人觉得嵌入式校招就是考你会不会写单片机代码,但实际上面试官最看重的不是你会多少种芯片,而是你能不能把一个完整的产品需求拆解成可执行的开发任务。从最近几年的校招情况来看,公司更希望招到能直接上…

2026/7/18 4:16:05阅读更多 →
C++ STL stack完全指南:从容器适配器原理到实战应用

C++ STL stack完全指南:从容器适配器原理到实战应用

1. 项目概述:为什么你需要深入理解STL stack?如果你正在学习C,尤其是接触到数据结构与算法,那么STL(Standard Template Library)是你绕不开的一座大山。而stack(栈),作为…

2026/7/18 4:11:05阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/17 10:42:55阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/17 8:31:03阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/17 13:22:23阅读更多 →
从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则

从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则

更多请点击: https://kaifayun.com 第一章:从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则 在Claude驱动的产品需求文档(PRD)生成实践中,原始业务意图往往以自然语言片…

2026/7/18 0:00:14阅读更多 →
Cursor配置生成失效?3大隐藏陷阱+4行修复代码,资深工程师连夜整理的紧急补救清单

Cursor配置生成失效?3大隐藏陷阱+4行修复代码,资深工程师连夜整理的紧急补救清单

更多请点击: https://codechina.net 第一章:Cursor配置生成失效?3大隐藏陷阱4行修复代码,资深工程师连夜整理的紧急补救清单 Cursor 配置生成突然失效,是近期高频报障场景。表面看是 cursor.config.json 未更新或 LSP…

2026/7/18 0:00:14阅读更多 →
某智驾大牛创业

某智驾大牛创业

作者:钟声编辑:Mark出品:红色星际头图:智能驾驶图片据悉,国内某头部智驾公司端到端模型技术大牛Z投身创业,并且已经拿到融资。Z不仅是该头部公司内部最年轻的对标阿里P10级别技术负责⼈,更是业内…

2026/7/18 0:00:14阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/17 22:48:46阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/17 13:22:38阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/17 17:26:50阅读更多 →