Skip to content

Commit 0979ffe

Browse files
committed
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 #790
1 parent 119d793 commit 0979ffe

File tree

10 files changed

+71
-21
lines changed

10 files changed

+71
-21
lines changed

cores/arduino/HardwareTimer.cpp

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -538,11 +538,23 @@ void HardwareTimer::setCaptureCompare(uint32_t channel, uint32_t compare, TimerC
538538
case PERCENT_COMPARE_FORMAT:
539539
CCR_RegisterValue = ((__HAL_TIM_GET_AUTORELOAD(&(_timerObj.handle)) + 1) * compare) / 100;
540540
break;
541+
case RESOLUTION_1B_COMPARE_FORMAT:
542+
case RESOLUTION_2B_COMPARE_FORMAT:
543+
case RESOLUTION_3B_COMPARE_FORMAT:
544+
case RESOLUTION_4B_COMPARE_FORMAT:
545+
case RESOLUTION_5B_COMPARE_FORMAT:
546+
case RESOLUTION_6B_COMPARE_FORMAT:
547+
case RESOLUTION_7B_COMPARE_FORMAT:
541548
case RESOLUTION_8B_COMPARE_FORMAT:
542-
CCR_RegisterValue = ((__HAL_TIM_GET_AUTORELOAD(&(_timerObj.handle)) + 1) * compare) / 255 ;
543-
break;
549+
case RESOLUTION_9B_COMPARE_FORMAT:
550+
case RESOLUTION_10B_COMPARE_FORMAT:
551+
case RESOLUTION_11B_COMPARE_FORMAT:
544552
case RESOLUTION_12B_COMPARE_FORMAT:
545-
CCR_RegisterValue = ((__HAL_TIM_GET_AUTORELOAD(&(_timerObj.handle)) + 1) * compare) / 4095 ;
553+
case RESOLUTION_13B_COMPARE_FORMAT:
554+
case RESOLUTION_14B_COMPARE_FORMAT:
555+
case RESOLUTION_15B_COMPARE_FORMAT:
556+
case RESOLUTION_16B_COMPARE_FORMAT:
557+
CCR_RegisterValue = ((__HAL_TIM_GET_AUTORELOAD(&(_timerObj.handle)) + 1) * compare) / ((1 << format) - 1) ;
546558
break;
547559
case TICK_COMPARE_FORMAT:
548560
default :
@@ -584,11 +596,23 @@ uint32_t HardwareTimer::getCaptureCompare(uint32_t channel, TimerCompareFormat_
584596
case PERCENT_COMPARE_FORMAT:
585597
return_value = (CCR_RegisterValue * 100) / __HAL_TIM_GET_AUTORELOAD(&(_timerObj.handle));
586598
break;
599+
case RESOLUTION_1B_COMPARE_FORMAT:
600+
case RESOLUTION_2B_COMPARE_FORMAT:
601+
case RESOLUTION_3B_COMPARE_FORMAT:
602+
case RESOLUTION_4B_COMPARE_FORMAT:
603+
case RESOLUTION_5B_COMPARE_FORMAT:
604+
case RESOLUTION_6B_COMPARE_FORMAT:
605+
case RESOLUTION_7B_COMPARE_FORMAT:
587606
case RESOLUTION_8B_COMPARE_FORMAT:
588-
return_value = (CCR_RegisterValue * 255) / __HAL_TIM_GET_AUTORELOAD(&(_timerObj.handle));
589-
break;
607+
case RESOLUTION_9B_COMPARE_FORMAT:
608+
case RESOLUTION_10B_COMPARE_FORMAT:
609+
case RESOLUTION_11B_COMPARE_FORMAT:
590610
case RESOLUTION_12B_COMPARE_FORMAT:
591-
return_value = (CCR_RegisterValue * 4095) / __HAL_TIM_GET_AUTORELOAD(&(_timerObj.handle));
611+
case RESOLUTION_13B_COMPARE_FORMAT:
612+
case RESOLUTION_14B_COMPARE_FORMAT:
613+
case RESOLUTION_15B_COMPARE_FORMAT:
614+
case RESOLUTION_16B_COMPARE_FORMAT:
615+
return_value = (CCR_RegisterValue * ((1 << format) - 1)) / __HAL_TIM_GET_AUTORELOAD(&(_timerObj.handle));
592616
break;
593617
case TICK_COMPARE_FORMAT:
594618
default :

cores/arduino/HardwareTimer.h

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,27 @@ typedef enum {
6666
} TimerFormat_t;
6767

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

7792
#ifdef __cplusplus

cores/arduino/pins_arduino.h

Lines changed: 1 addition & 1 deletion
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.cpp

Lines changed: 2 additions & 3 deletions
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
/**

cores/arduino/stm32/analog.h

Lines changed: 2 additions & 1 deletion
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

Lines changed: 2 additions & 3 deletions
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

Lines changed: 15 additions & 0 deletions
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

variants/ARMED_V1/variant.h

Lines changed: 0 additions & 1 deletion
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

Lines changed: 0 additions & 1 deletion
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

Lines changed: 0 additions & 1 deletion
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)