Skip to content

Commit 4b5983c

Browse files
committed
Added functionality to pass custom parameter to HardwareTimer callback
Update example following implementation of stm32duino/Arduino_Core_STM32#892 And add a new example to show how to use parameter.
1 parent 683463d commit 4b5983c

File tree

6 files changed

+64
-16
lines changed

6 files changed

+64
-16
lines changed

examples/NonReg/HardwareTimer/HardwareTimer_OutputInput_test/HardwareTimer_OutputInput_test.ino

+8-8
Original file line numberDiff line numberDiff line change
@@ -102,23 +102,23 @@ uint32_t test_Status = PASSED;
102102
** Interrupt callback
103103
***************************************/
104104
/******** Output *****/
105-
void output_Update_IT_callback(HardwareTimer *)
105+
void output_Update_IT_callback(void)
106106
{
107107
Output_Update++;
108108
}
109109

110-
void Output_Compare1_IT_callback(HardwareTimer *)
110+
void Output_Compare1_IT_callback(void)
111111
{
112112
Output_Compare1++;
113113
}
114114

115-
void Output_Compare2_IT_callback(HardwareTimer *)
115+
void Output_Compare2_IT_callback(void)
116116
{
117117
Output_Compare2++;
118118
}
119119

120120
/******** Input 1 *****/
121-
void Input_Capture1_Rising_IT_callback(HardwareTimer *)
121+
void Input_Capture1_Rising_IT_callback(void)
122122
{
123123
Current1_Capture = MyTim_input->getCaptureCompare(Freq1_channelRising);
124124
/* frequency computation */
@@ -138,7 +138,7 @@ void Input_Capture1_Rising_IT_callback(HardwareTimer *)
138138
rolloverCompare1Count = 0;
139139
}
140140

141-
void Input_Capture1_Falling_IT_callback(HardwareTimer *)
141+
void Input_Capture1_Falling_IT_callback(void)
142142
{
143143
/* prepare DutyCycle computation */
144144
Current1_Capture = MyTim_input->getCaptureCompare(Freq1_channelFalling);
@@ -155,7 +155,7 @@ void Input_Capture1_Falling_IT_callback(HardwareTimer *)
155155
}
156156

157157
/******** Input 2 *****/
158-
void Input_Capture2_Rising_IT_callback(HardwareTimer *)
158+
void Input_Capture2_Rising_IT_callback(void)
159159
{
160160
Current2_Capture = MyTim_input->getCaptureCompare(Freq2_channelRising);
161161
/* frequency computation */
@@ -175,7 +175,7 @@ void Input_Capture2_Rising_IT_callback(HardwareTimer *)
175175
rolloverCompare2Count = 0;
176176
}
177177

178-
void Input_Capture2_Falling_IT_callback(HardwareTimer *)
178+
void Input_Capture2_Falling_IT_callback(void)
179179
{
180180
/* prepare DutyCycle computation */
181181
Current2_Capture = MyTim_input->getCaptureCompare(Freq2_channelFalling);
@@ -194,7 +194,7 @@ void Input_Capture2_Falling_IT_callback(HardwareTimer *)
194194
/******** Input rollover *****/
195195
/* In case of timer rollover, frequency is to low to be measured set values to 0
196196
To reduce minimum frequency, it is possible to increase prescaler. But this is at a cost of precision. */
197-
void Rollover_IT_callback(HardwareTimer *)
197+
void Rollover_IT_callback(void)
198198
{
199199
rolloverCompare1Count++;
200200
rolloverCompare2Count++;

examples/Peripherals/HardwareTimer/Frequency_Dutycycle_measurement/Frequency_Dutycycle_measurement.ino

+3-3
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ HardwareTimer *MyTim;
2525
@brief Input capture interrupt callback : Compute frequency and dutycycle of input signal
2626
2727
*/
28-
void TIMINPUT_Capture_Rising_IT_callback(HardwareTimer*)
28+
void TIMINPUT_Capture_Rising_IT_callback(void)
2929
{
3030
CurrentCapture = MyTim->getCaptureCompare(channelRising);
3131
/* frequency computation */
@@ -47,7 +47,7 @@ void TIMINPUT_Capture_Rising_IT_callback(HardwareTimer*)
4747

4848
/* In case of timer rollover, frequency is to low to be measured set values to 0
4949
To reduce minimum frequency, it is possible to increase prescaler. But this is at a cost of precision. */
50-
void Rollover_IT_callback(HardwareTimer*)
50+
void Rollover_IT_callback(void)
5151
{
5252
rolloverCompareCount++;
5353

@@ -62,7 +62,7 @@ void Rollover_IT_callback(HardwareTimer*)
6262
@brief Input capture interrupt callback : Compute frequency and dutycycle of input signal
6363
6464
*/
65-
void TIMINPUT_Capture_Falling_IT_callback(HardwareTimer*)
65+
void TIMINPUT_Capture_Falling_IT_callback(void)
6666
{
6767
/* prepare DutyCycle computation */
6868
CurrentCapture = MyTim->getCaptureCompare(channelFalling);

examples/Peripherals/HardwareTimer/InputCapture/InputCapture.ino

+2-2
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ uint32_t input_freq = 0;
1919
volatile uint32_t rolloverCompareCount = 0;
2020
HardwareTimer *MyTim;
2121

22-
void InputCapture_IT_callback(HardwareTimer*)
22+
void InputCapture_IT_callback(void)
2323
{
2424
CurrentCapture = MyTim->getCaptureCompare(channel);
2525
/* frequency computation */
@@ -36,7 +36,7 @@ void InputCapture_IT_callback(HardwareTimer*)
3636

3737
/* In case of timer rollover, frequency is to low to be measured set value to 0
3838
To reduce minimum frequency, it is possible to increase prescaler. But this is at a cost of precision. */
39-
void Rollover_IT_callback(HardwareTimer*)
39+
void Rollover_IT_callback(void)
4040
{
4141
rolloverCompareCount++;
4242

examples/Peripherals/HardwareTimer/PWM_FullConfiguration/PWM_FullConfiguration.ino

+2-2
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,12 @@
2828
#define pin2 D3
2929
#endif
3030

31-
void Update_IT_callback(HardwareTimer*)
31+
void Update_IT_callback(void)
3232
{ // Update event correspond to Rising edge of PWM when configured in PWM1 mode
3333
digitalWrite(pin2, LOW); // pin2 will be complementary to pin
3434
}
3535

36-
void Compare_IT_callback(HardwareTimer*)
36+
void Compare_IT_callback(void)
3737
{ // Compare match event correspond to falling edge of PWM when configured in PWM1 mode
3838
digitalWrite(pin2, HIGH);
3939
}

examples/Peripherals/HardwareTimer/Timebase_callback/Timebase_callback.ino

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
#define pin D2
1212
#endif
1313

14-
void Update_IT_callback(HardwareTimer*)
14+
void Update_IT_callback(void)
1515
{ // Toggle pin. 10hz toogle --> 5Hz PWM
1616
digitalWrite(pin, !digitalRead(pin));
1717
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/*
2+
Timebase callback
3+
This example shows how to configure HardwareTimer to execute a callback with some parameter at regular interval.
4+
Callback toggles pin.
5+
Once configured, there is only CPU load for callbacks executions.
6+
*/
7+
8+
#if defined(LED_BUILTIN)
9+
#define pin LED_BUILTIN
10+
#else
11+
#define pin D2
12+
#endif
13+
14+
15+
uint32_t MyData = 1; // Parameter used for callback is arbitrarily a pointer to uint32_t, it could be of other type.
16+
17+
// Every second, print on serial MyData. And increment it.
18+
void Update_IT_callback(uint32_t* data)
19+
{
20+
Serial.println(*data);
21+
*data = *data + 1;
22+
}
23+
24+
void setup()
25+
{
26+
Serial.begin(9600);
27+
#if defined(TIM1)
28+
TIM_TypeDef *Instance = TIM1;
29+
#else
30+
TIM_TypeDef *Instance = TIM2;
31+
#endif
32+
33+
// Instantiate HardwareTimer object. Thanks to 'new' instanciation, HardwareTimer is not destructed when setup() function is finished.
34+
HardwareTimer *MyTim = new HardwareTimer(Instance);
35+
36+
// configure pin in output mode
37+
pinMode(pin, OUTPUT);
38+
39+
MyTim->setOverflow(1, HERTZ_FORMAT); // 1 Hz
40+
MyTim->attachInterrupt(std::bind(Update_IT_callback, &MyData)); // bind argument to callback: When Update_IT_callback is called MyData will be given as argument
41+
MyTim->resume();
42+
}
43+
44+
45+
void loop()
46+
{
47+
/* Nothing to do all is done by hardware. Even no interrupt required. */
48+
}

0 commit comments

Comments
 (0)