/*
* 計時器輸入捕獲模式 聯合 脈衝模式
* - Timer2 channel 1 捕獲輸入
* - Timer2 channel 2 生成脈衝
* - Timer 3為捕獲輸入生成一個PWM觸發信號
*/
#include <Streaming.h>
const uint16_t pulseDelay = 200;
const uint16_t pulseWidth = 200;
//--------
void toggle_led()
{
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
}
//---------
void setup()
{
// setup PA1 (Timer2 channel 2) to PWM (one pulse mode)
pinMode(PA1, PWM);
// setup PA0 (Timer 2 channel 1) as input (capture input mode)
pinMode(PA0, INPUT);
//設置以前停止計時器
Timer2.pause();
Timer2.setPrescaleFactor(72); // 1 µs分辨率
Timer2.setCompare(TIMER_CH2, pulseDelay);
Timer2.setOverflow(pulseWidth + pulseDelay-1);
// counter setup in one pulse mode, as從屬觸發by TI1
TIMER2_BASE->CR1 = ( TIMER_CR1_OPM ); // one pulse mode
Timer2.setSlaveFlags( TIMER_SMCR_TS_TI1FP1 | TIMER_SMCR_SMS_TRIGGER );
// channel 1: capture input on 上升沿
Timer2.setMode(TIMER_CH1, TIMER_INPUT_CAPTURE);
//Timer2.setPolarity(TIMER_CH1, 1); //下降沿觸發
// channel 2: invert polarity(轉換極性) (we want low for CNT<CCR2)
Timer2.setPolarity(TIMER_CH2, 1);
// start timer 2
Timer2.refresh();
Timer2.resume(); // let timer 2 run
// setup PA6 (Timer3 channel 1) to 產生 1 ms period PWM with 10% DC
pinMode(PA6, PWM);
Timer3.pause();
Timer3.setPrescaleFactor(72); // 1 µs resolution
Timer3.setCompare(TIMER_CH1, 100);
Timer3.setOverflow(1000);
Timer3.refresh();
Timer3.resume(); // let timer 3 run
}
uint32_t t;
//-----------------------------------------------------------------------------
void loop()
{
if ( (millis()-t)>=1000 )
{
t = millis();
toggle_led();
}
}