Skip to content

Commit e3b3aba

Browse files
ABOSTMfpistm
authored andcommitted
Rework PWM_RESOLUTION
There is no more distinction between pwm resolution at arduino API level and at HardwareTimer level. PWM_RESOLUTION is default resolution (Arduinio API and HardwareTimer) It is set to 8bit like default arduino pwm resolution. HardwareTimer resolution can now take any value from 1bit to 16bit (like Arduino API). Remove variant PWM_RESOLUTION configuration when it is set to 8, as it is already the default value. Fixes stm32duino#790
1 parent f812aa3 commit e3b3aba

File tree

10 files changed

+71
-21
lines changed

10 files changed

+71
-21
lines changed

cores/arduino/HardwareTimer.cpp

+30-6
Original file line numberDiff line numberDiff line change
@@ -694,11 +694,23 @@ void HardwareTimer::setCaptureCompare(uint32_t channel, uint32_t compare, TimerC
694694
case PERCENT_COMPARE_FORMAT:
695695
CCR_RegisterValue = ((__HAL_TIM_GET_AUTORELOAD(&(_timerObj.handle)) + 1) * compare) / 100;
696696
break;
697+
case RESOLUTION_1B_COMPARE_FORMAT:
698+
case RESOLUTION_2B_COMPARE_FORMAT:
699+
case RESOLUTION_3B_COMPARE_FORMAT:
700+
case RESOLUTION_4B_COMPARE_FORMAT:
701+
case RESOLUTION_5B_COMPARE_FORMAT:
702+
case RESOLUTION_6B_COMPARE_FORMAT:
703+
case RESOLUTION_7B_COMPARE_FORMAT:
697704
case RESOLUTION_8B_COMPARE_FORMAT:
698-
CCR_RegisterValue = ((__HAL_TIM_GET_AUTORELOAD(&(_timerObj.handle)) + 1) * compare) / 255 ;
699-
break;
705+
case RESOLUTION_9B_COMPARE_FORMAT:
706+
case RESOLUTION_10B_COMPARE_FORMAT:
707+
case RESOLUTION_11B_COMPARE_FORMAT:
700708
case RESOLUTION_12B_COMPARE_FORMAT:
701-
CCR_RegisterValue = ((__HAL_TIM_GET_AUTORELOAD(&(_timerObj.handle)) + 1) * compare) / 4095 ;
709+
case RESOLUTION_13B_COMPARE_FORMAT:
710+
case RESOLUTION_14B_COMPARE_FORMAT:
711+
case RESOLUTION_15B_COMPARE_FORMAT:
712+
case RESOLUTION_16B_COMPARE_FORMAT:
713+
CCR_RegisterValue = ((__HAL_TIM_GET_AUTORELOAD(&(_timerObj.handle)) + 1) * compare) / ((1 << format) - 1) ;
702714
break;
703715
case TICK_COMPARE_FORMAT:
704716
default :
@@ -739,11 +751,23 @@ uint32_t HardwareTimer::getCaptureCompare(uint32_t channel, TimerCompareFormat_
739751
case PERCENT_COMPARE_FORMAT:
740752
return_value = (CCR_RegisterValue * 100) / __HAL_TIM_GET_AUTORELOAD(&(_timerObj.handle));
741753
break;
754+
case RESOLUTION_1B_COMPARE_FORMAT:
755+
case RESOLUTION_2B_COMPARE_FORMAT:
756+
case RESOLUTION_3B_COMPARE_FORMAT:
757+
case RESOLUTION_4B_COMPARE_FORMAT:
758+
case RESOLUTION_5B_COMPARE_FORMAT:
759+
case RESOLUTION_6B_COMPARE_FORMAT:
760+
case RESOLUTION_7B_COMPARE_FORMAT:
742761
case RESOLUTION_8B_COMPARE_FORMAT:
743-
return_value = (CCR_RegisterValue * 255) / __HAL_TIM_GET_AUTORELOAD(&(_timerObj.handle));
744-
break;
762+
case RESOLUTION_9B_COMPARE_FORMAT:
763+
case RESOLUTION_10B_COMPARE_FORMAT:
764+
case RESOLUTION_11B_COMPARE_FORMAT:
745765
case RESOLUTION_12B_COMPARE_FORMAT:
746-
return_value = (CCR_RegisterValue * 4095) / __HAL_TIM_GET_AUTORELOAD(&(_timerObj.handle));
766+
case RESOLUTION_13B_COMPARE_FORMAT:
767+
case RESOLUTION_14B_COMPARE_FORMAT:
768+
case RESOLUTION_15B_COMPARE_FORMAT:
769+
case RESOLUTION_16B_COMPARE_FORMAT:
770+
return_value = (CCR_RegisterValue * ((1 << format) - 1)) / __HAL_TIM_GET_AUTORELOAD(&(_timerObj.handle));
747771
break;
748772
case TICK_COMPARE_FORMAT:
749773
default :

cores/arduino/HardwareTimer.h

+19-4
Original file line numberDiff line numberDiff line change
@@ -67,12 +67,27 @@ typedef enum {
6767
} TimerFormat_t;
6868

6969
typedef enum {
70-
TICK_COMPARE_FORMAT, // default
70+
RESOLUTION_1B_COMPARE_FORMAT = 1, // used for Dutycycle: [0 .. 1]
71+
RESOLUTION_2B_COMPARE_FORMAT, // used for Dutycycle: [0 .. 3]
72+
RESOLUTION_3B_COMPARE_FORMAT, // used for Dutycycle: [0 .. 7]
73+
RESOLUTION_4B_COMPARE_FORMAT, // used for Dutycycle: [0 .. 15]
74+
RESOLUTION_5B_COMPARE_FORMAT, // used for Dutycycle: [0 .. 31]
75+
RESOLUTION_6B_COMPARE_FORMAT, // used for Dutycycle: [0 .. 63]
76+
RESOLUTION_7B_COMPARE_FORMAT, // used for Dutycycle: [0 .. 127]
77+
RESOLUTION_8B_COMPARE_FORMAT, // used for Dutycycle: [0 .. 255]
78+
RESOLUTION_9B_COMPARE_FORMAT, // used for Dutycycle: [0 .. 511]
79+
RESOLUTION_10B_COMPARE_FORMAT, // used for Dutycycle: [0 .. 1023]
80+
RESOLUTION_11B_COMPARE_FORMAT, // used for Dutycycle: [0 .. 2047]
81+
RESOLUTION_12B_COMPARE_FORMAT, // used for Dutycycle: [0 .. 4095]
82+
RESOLUTION_13B_COMPARE_FORMAT, // used for Dutycycle: [0 .. 8191]
83+
RESOLUTION_14B_COMPARE_FORMAT, // used for Dutycycle: [0 .. 16383]
84+
RESOLUTION_15B_COMPARE_FORMAT, // used for Dutycycle: [0 .. 32767]
85+
RESOLUTION_16B_COMPARE_FORMAT, // used for Dutycycle: [0 .. 65535]
86+
87+
TICK_COMPARE_FORMAT = 0x80, // default
7188
MICROSEC_COMPARE_FORMAT,
7289
HERTZ_COMPARE_FORMAT,
73-
PERCENT_COMPARE_FORMAT, // used for Dutycycle
74-
RESOLUTION_8B_COMPARE_FORMAT, // used for Dutycycle: [0.. 255]
75-
RESOLUTION_12B_COMPARE_FORMAT // used for Dutycycle: [0.. 4095]
90+
PERCENT_COMPARE_FORMAT, // used for Dutycycle
7691
} TimerCompareFormat_t;
7792

7893
#ifdef __cplusplus

cores/arduino/pins_arduino.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,7 @@ PinName analogInputToPinName(uint32_t pin);
313313
#define DACC_RESOLUTION 12
314314
#endif
315315
#ifndef PWM_RESOLUTION
316-
#define PWM_RESOLUTION 12
316+
#define PWM_RESOLUTION 8
317317
#endif
318318
#ifndef PWM_FREQUENCY
319319
#define PWM_FREQUENCY 1000

cores/arduino/stm32/analog.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
/* Includes ------------------------------------------------------------------*/
4343
#include "stm32_def.h"
4444
#include "PeripheralPins.h"
45+
#include "HardwareTimer.h"
4546

4647
#ifdef __cplusplus
4748
extern "C" {
@@ -51,7 +52,7 @@ extern "C" {
5152
void dac_write_value(PinName pin, uint32_t value, uint8_t do_init);
5253
void dac_stop(PinName pin);
5354
uint16_t adc_read_value(PinName pin);
54-
void pwm_start(PinName pin, uint32_t clock_freq, uint32_t value);
55+
void pwm_start(PinName pin, uint32_t clock_freq, uint32_t value, TimerCompareFormat_t resolution);
5556
void pwm_stop(PinName pin);
5657
uint32_t get_pwm_channel(PinName pin);
5758

cores/arduino/wiring_analog.c

+2-3
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ uint32_t g_anOutputPinConfigured[MAX_NB_PORT] = {0};
3030
#endif
3131

3232
static int _readResolution = 10;
33-
static int _writeResolution = 8;
33+
int _writeResolution = PWM_RESOLUTION;
3434
static uint32_t _writeFreq = PWM_FREQUENCY;
3535

3636
void analogReadResolution(int res)
@@ -115,8 +115,7 @@ void analogWrite(uint32_t ulPin, uint32_t ulValue)
115115
if (is_pin_configured(p, g_anOutputPinConfigured) == false) {
116116
set_pin_configured(p, g_anOutputPinConfigured);
117117
}
118-
ulValue = mapResolution(ulValue, _writeResolution, PWM_RESOLUTION);
119-
pwm_start(p, _writeFreq, ulValue);
118+
pwm_start(p, _writeFreq, ulValue, _writeResolution);
120119
} else
121120
#endif /* HAL_TIM_MODULE_ENABLED && !HAL_TIM_MODULE_ONLY */
122121
{

keywords.txt

+15
Original file line numberDiff line numberDiff line change
@@ -860,8 +860,23 @@ TICK_COMPARE_FORMAT LITERAL1
860860
MICROSEC_COMPARE_FORMAT LITERAL1
861861
HERTZ_COMPARE_FORMAT LITERAL1
862862
PERCENT_COMPARE_FORMAT LITERAL1
863+
RESOLUTION_1B_COMPARE_FORMAT LITERAL1
864+
RESOLUTION_2B_COMPARE_FORMAT LITERAL1
865+
RESOLUTION_3B_COMPARE_FORMAT LITERAL1
866+
RESOLUTION_4B_COMPARE_FORMAT LITERAL1
867+
RESOLUTION_5B_COMPARE_FORMAT LITERAL1
868+
RESOLUTION_6B_COMPARE_FORMAT LITERAL1
869+
RESOLUTION_7B_COMPARE_FORMAT LITERAL1
863870
RESOLUTION_8B_COMPARE_FORMAT LITERAL1
871+
RESOLUTION_9B_COMPARE_FORMAT LITERAL1
872+
RESOLUTION_10B_COMPARE_FORMAT LITERAL1
873+
RESOLUTION_11B_COMPARE_FORMAT LITERAL1
864874
RESOLUTION_12B_COMPARE_FORMAT LITERAL1
875+
RESOLUTION_13B_COMPARE_FORMAT LITERAL1
876+
RESOLUTION_14B_COMPARE_FORMAT LITERAL1
877+
RESOLUTION_15B_COMPARE_FORMAT LITERAL1
878+
RESOLUTION_16B_COMPARE_FORMAT LITERAL1
879+
865880

866881
HardwareTimer KEYWORD1
867882

libraries/SrcWrapper/src/stm32/analog.cpp

+2-3
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@
3737
*/
3838
#include "stm32_def.h"
3939
#include "analog.h"
40-
#include "HardwareTimer.h"
4140
#include "PinAF_STM32F1.h"
4241
#include "stm32yyxx_ll_adc.h"
4342

@@ -995,7 +994,7 @@ uint16_t adc_read_value(PinName pin)
995994
* @param value : the value to push on the PWM output
996995
* @retval None
997996
*/
998-
void pwm_start(PinName pin, uint32_t PWM_freq, uint32_t value)
997+
void pwm_start(PinName pin, uint32_t PWM_freq, uint32_t value, TimerCompareFormat_t resolution)
999998
{
1000999
TIM_TypeDef *Instance = (TIM_TypeDef *)pinmap_peripheral(pin, PinMap_PWM);
10011000
HardwareTimer *HT;
@@ -1010,7 +1009,7 @@ void pwm_start(PinName pin, uint32_t PWM_freq, uint32_t value)
10101009

10111010
HT->setMode(channel, TIMER_OUTPUT_COMPARE_PWM1, pin);
10121011
HT->setOverflow(PWM_freq, HERTZ_FORMAT);
1013-
HT->setCaptureCompare(channel, value, RESOLUTION_12B_COMPARE_FORMAT);
1012+
HT->setCaptureCompare(channel, value, resolution);
10141013
HT->resume();
10151014
}
10161015
/**

variants/ARMED_V1/variant.h

-1
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,6 @@ extern "C" {
115115
#define NUM_ANALOG_FIRST 32
116116

117117
// PWM resolution
118-
#define PWM_RESOLUTION 8
119118
#define PWM_FREQUENCY 20000 // >= 20 Khz => inaudible noise for fans
120119
#define PWM_MAX_DUTY_CYCLE 255
121120

variants/REMRAM_V1/variant.h

-1
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,6 @@ extern "C"
146146
#define NUM_ANALOG_FIRST 64
147147

148148
// PWM resolution
149-
#define PWM_RESOLUTION 8
150149
#define PWM_FREQUENCY 20000 // >= 20 Khz => inaudible noise for fans
151150
#define PWM_MAX_DUTY_CYCLE 255
152151

variants/RUMBA32_F446VE/variant.h

-1
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,6 @@ extern "C" {
115115
#define NUM_ANALOG_FIRST 80
116116

117117
// PWM resolution
118-
#define PWM_RESOLUTION 8
119118
#define PWM_FREQUENCY 20000 // >= 20 Khz => inaudible noise for fans
120119
#define PWM_MAX_DUTY_CYCLE 255
121120

0 commit comments

Comments
 (0)