Arduino_STM32/STM32F1/libraries/A_STM32_Examples/examples/Sensors/HardwareTimerOnePulseMode/HardwareTimerOnePulseMode.ino

68 lines
1.9 KiB
C++

/*
* Example of the Timer Input Capture mode combined with one pulse mode
*
* This example uses:
* - Timer2 channel 1 as capture input
* - Timer2 channel 2 to generate the pulses,
* - Timer 3 to generate a PWM trigger signal for capture input
*/
#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);
// stop the timers before configuring them
Timer2.pause();
Timer2.setPrescaleFactor(72); // 1 µs resolution
Timer2.setCompare(TIMER_CH2, pulseDelay);
Timer2.setOverflow(pulseWidth + pulseDelay-1);
// counter setup in one pulse mode, as slave triggered 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 rising edge
Timer2.setMode(TIMER_CH1, TIMER_INPUT_CAPTURE);
//Timer2.setPolarity(TIMER_CH1, 1); // trigger on falling edge
// 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 generate 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();
}
}