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

相关新闻

Document 切割:RAG 知识库数据预处理实战

Document 切割:RAG 知识库数据预处理实战

文章目录一、知识从哪来?二、Document:知识的最小标准单元三、Loader:知识接入的第一步四、爬虫实战:从零实现网页内容抓取爬虫手写版的局限五、LangChain 方案:CheerioWebBaseLoader六、文本切割:让知识可…

2026/7/23 6:35:55 阅读更多 →
Linux常用命令总计

Linux常用命令总计

ls [-a -l -h] [Linux路径] ls 查看当前文件下或路径下有什么内容 -l 表示以列表的形式展示路径下文件 -a 表示查看路径下所以文件,把隐藏文件也展示出来 -h 表示显示路径下文件大小单位,一般-ah和-lh使用方式cp [Linux路径] 切换工作目录…

2026/7/23 8:09:56 阅读更多 →
SolidWorks_钣金设计14_钣金切割清单

SolidWorks_钣金设计14_钣金切割清单

钣金切割清单:从原理到自动化生成的完整指南 📋 摘要 在钣金加工领域,切割清单(Cutting List)是连接设计图纸与生产制造的关键桥梁。一份高质量的切割清单不仅包含零件的下料尺寸、数量和材料信息,还能显著…

2026/7/23 14:07:47 阅读更多 →

最新新闻

Claude Code中Agent Teams协作开发实战指南

Claude Code中Agent Teams协作开发实战指南

1. Agent Teams 核心概念解析Agent Teams 是 Claude Code 中一项强大的实验性功能,它允许开发者创建多个协作的 AI 代理实例,共同完成复杂任务。与传统的单代理工作模式相比,这种团队协作方式特别适合需要多角度并行处理的项目场景。1.1 基础…

2026/7/23 15:07:11 阅读更多 →
AI视觉生成技术解析与应用实践

AI视觉生成技术解析与应用实践

1. 从影像捕捉到内容生成:AI技术边界的探索最近在测试各类生成式AI工具时,有个现象特别值得玩味:只要是人类能拍摄记录的视觉内容,AI系统似乎都能学习并重新生成;而任何能在电子屏幕上显示的信息,理论上都存…

2026/7/23 15:07:11 阅读更多 →
RAG技术解析:大模型与知识检索的完美结合

RAG技术解析:大模型与知识检索的完美结合

1. RAG技术概述:当大模型遇上知识检索检索增强生成(Retrieval-Augmented Generation)正在重塑我们使用大语言模型的方式。想象一下,当你向ChatGPT询问公司内部财务政策时,它突然能准确引用你上传的员工手册条款——这就…

2026/7/23 15:07:11 阅读更多 →
Superset开源BI工具架构解析与二次开发指南

Superset开源BI工具架构解析与二次开发指南

1. Superset 开源 BI 工具概述 Apache Superset 是一款由 Airbnb 开源的企业级商业智能(BI)工具,它允许用户通过直观的界面创建丰富的数据可视化和仪表板。作为一个 Python 编写的项目,Superset 基于 Flask 应用框架,使…

2026/7/23 15:07:11 阅读更多 →
Agent Skills技术解析:模块化AI能力封装方案

Agent Skills技术解析:模块化AI能力封装方案

1. Agent Skills技术方案概述Agent Skills是当前AI领域最前沿的智能体能力封装方案,它通过模块化设计将复杂任务拆解为可组合的标准化技能单元。在Claude平台的实际应用中,一个完整的Skill通常包含以下核心组件:技能描述元数据:定…

2026/7/23 15:07:11 阅读更多 →
PlantUML+EA描述《分析模式》第6章存货和会计(6)

PlantUML+EA描述《分析模式》第6章存货和会计(6)

《GJJ-004 分析模式及实现》,umlchina.com/url/video.html 原图6.21 EA绘制 图6.21 使用账户查找方法。 使用单独的方法来查找输出账户以及计算会计事项的值。 PlantUML startuml skinparam nodesep 100 skinparam ranksep 100 class 过账规则 class 方法 过账…

2026/7/23 15:06:11 阅读更多 →

日新闻

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击: https://codechina.net 第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:01:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 19:43:43 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/22 12:54:44 阅读更多 →

月新闻