Quellcode durchsuchen

update:支持指定脉冲数PWM输出

alienwalker vor 3 Jahren
Ursprung
Commit
b50d752372
2 geänderte Dateien mit 48 neuen und 5 gelöschten Zeilen
  1. 46 3
      bsp/air105/hal/core_hwtimer.c
  2. 2 2
      bsp/air105/include/core_hwtimer.h

+ 46 - 3
bsp/air105/hal/core_hwtimer.c

@@ -457,7 +457,35 @@ START_HWTIMER:
 	return ;
 }
 
+static void __FUNC_IN_RAM__ prvHWTimer_IrqHandlerPWM( int32_t Line, void *pData)
+{
+	uint32_t HWTimerID = (uint32_t)pData;
+	volatile uint32_t clr;
 
+	clr = TIMM0->TIM[HWTimerID].EOI;
+	if (prvHWTimer[HWTimerID].ContinueDelay)
+	{
+		if ((++prvHWTimer[HWTimerID].CurCount) >= prvHWTimer[HWTimerID].TotalCount)
+		{
+			TIMM0->TIM[HWTimerID].ControlReg = 0;
+			ISR_OnOff(prvHWTimer[HWTimerID].IrqLine, 0);
+			ISR_Clear(prvHWTimer[HWTimerID].IrqLine);
+			prvHWTimer[HWTimerID].IsQueueRunning = 0;
+			prvHWTimer[HWTimerID].TotalCount = 0;
+			PM_SetHardwareRunFlag(PM_HW_TIMER_0 + HWTimerID, 0);
+		}
+		else
+		{
+			prvHWTimer[HWTimerID].ContinueDelay = 0;
+		}
+	}
+	else
+	{
+		prvHWTimer[HWTimerID].ContinueDelay = 1;
+	}
+
+
+}
 
 static void __FUNC_IN_RAM__ prvHWTimer_IrqHandlerOperationQueue( int32_t Line, void *pData)
 {
@@ -484,12 +512,24 @@ void HWTimer_StartPWM(uint8_t HWTimerID, uint32_t HighCnt, uint32_t LowCnt, uint
 	}
 	else
 	{
-		TIMM0->TIM[HWTimerID].ControlReg = TIMER_CONTROL_REG_TIMER_PWM|TIMER_CONTROL_REG_TIMER_MODE|TIMER_CONTROL_REG_TIMER_ENABLE|TIMER_CONTROL_REG_TIMER_INTERRUPT;
+		if (prvHWTimer[HWTimerID].TotalCount)
+		{
+//			DBG("start %u,%u,%u",TIMM0->TIM[HWTimerID].LoadCount, TIMM0->TIM_ReloadCount[HWTimerID], prvHWTimer[HWTimerID].TotalCount);
+			ISR_SetHandler(prvHWTimer[HWTimerID].IrqLine, prvHWTimer_IrqHandlerPWM, HWTimerID);
+			ISR_SetPriority(prvHWTimer[HWTimerID].IrqLine, HWTIMER_IRQ_LEVEL);
+			ISR_OnOff(prvHWTimer[HWTimerID].IrqLine, 1);
+			TIMM0->TIM[HWTimerID].ControlReg = TIMER_CONTROL_REG_TIMER_PWM|TIMER_CONTROL_REG_TIMER_MODE|TIMER_CONTROL_REG_TIMER_ENABLE;
+		}
+		else
+		{
+			TIMM0->TIM[HWTimerID].ControlReg = TIMER_CONTROL_REG_TIMER_PWM|TIMER_CONTROL_REG_TIMER_MODE|TIMER_CONTROL_REG_TIMER_ENABLE|TIMER_CONTROL_REG_TIMER_INTERRUPT;
+		}
+
 	}
 	PM_SetHardwareRunFlag(PM_HW_TIMER_0 + HWTimerID, 1);
 }
 
-void HWTimer_SetPWM(uint8_t HWTimerID, uint32_t Period, uint16_t Duty, uint8_t IsOnePulse)
+void HWTimer_SetPWM(uint8_t HWTimerID, uint32_t Period, uint16_t Duty, uint32_t PulseNum)
 {
 	uint32_t TotalCnt;
 	uint32_t LowCnt, HighCnt;
@@ -523,7 +563,10 @@ void HWTimer_SetPWM(uint8_t HWTimerID, uint32_t Period, uint16_t Duty, uint8_t I
 		}
 		break;
 	}
-	HWTimer_StartPWM(HWTimerID, HighCnt, LowCnt, IsOnePulse);
+	prvHWTimer[HWTimerID].TotalCount = PulseNum;
+	prvHWTimer[HWTimerID].CurCount = 0;
+	prvHWTimer[HWTimerID].ContinueDelay = 0;
+	HWTimer_StartPWM(HWTimerID, HighCnt, LowCnt, 0);
 //	DBG("L %u, H %u", LowCnt, HighCnt);
 //	TIMM0->TIM[HWTimerID].LoadCount = LowCnt - 1;
 //	TIMM0->TIM_ReloadCount[HWTimerID] = HighCnt - 1;

+ 2 - 2
bsp/air105/include/core_hwtimer.h

@@ -29,9 +29,9 @@
  * @param HWTimerID 硬件定时器ID
  * @param Period 周期,最大24M,
  * @param Duty 占空比,0.1%,只有50KHz以下才能达到这个精度,500KHz到1%
- * @param IsOnePulse 只触发一次脉冲
+ * @param PulseNum 总共需要的脉冲,0表示一直运行
  */
-void HWTimer_SetPWM(uint8_t HWTimerID, uint32_t Period, uint16_t Duty, uint8_t IsOnePulse);
+void HWTimer_SetPWM(uint8_t HWTimerID, uint32_t Period, uint16_t Duty, uint32_t PulseNum);
 
 /**
  * @brief 硬件定时器按照高低电平分辨率设置成PWM并启动,时钟48M