@@ -38,6 +38,7 @@ static stm32l4_dac_t stm32l4_dac;
38
38
#endif /* defined(PIN_DAC0) || defined(PIN_DAC1) */
39
39
static stm32l4_timer_t stm32l4_pwm [PWM_INSTANCE_COUNT ];
40
40
41
+ static uint8_t _channels [PWM_INSTANCE_COUNT ];
41
42
static int _readResolution = 10 ;
42
43
static int _writeResolution = 8 ;
43
44
@@ -48,6 +49,7 @@ static uint8_t _writeCalibrate = 3;
48
49
49
50
void analogReference (eAnalogReference reference )
50
51
{
52
+ (void )reference ;
51
53
}
52
54
53
55
void analogReadResolution (int resolution )
@@ -264,32 +266,6 @@ void analogWrite(uint32_t pin, uint32_t value)
264
266
{
265
267
instance = g_APinDescription [pin ].pwm_instance ;
266
268
267
- if (stm32l4_pwm [instance ].state == TIMER_STATE_NONE )
268
- {
269
- stm32l4_timer_create (& stm32l4_pwm [instance ], g_PWMInstances [instance ], STM32L4_PWM_IRQ_PRIORITY , 0 );
270
-
271
- if (_writeFrequency [instance ] && _writeRange [instance ])
272
- {
273
- carrier = _writeFrequency [instance ] * _writeRange [instance ];
274
- modulus = _writeRange [instance ];
275
- }
276
- else
277
- {
278
- carrier = 2000000 ;
279
- modulus = 4095 ;
280
- }
281
-
282
- divider = stm32l4_timer_clock (& stm32l4_pwm [instance ]) / carrier ;
283
-
284
- if (divider == 0 )
285
- {
286
- divider = 1 ;
287
- }
288
-
289
- stm32l4_timer_enable (& stm32l4_pwm [instance ], divider - 1 , modulus - 1 , 0 , NULL , NULL , 0 );
290
- stm32l4_timer_start (& stm32l4_pwm [instance ], false);
291
- }
292
-
293
269
if (_writeFrequency [instance ] && _writeRange [instance ])
294
270
{
295
271
if (value > _writeRange [instance ])
@@ -302,9 +278,44 @@ void analogWrite(uint32_t pin, uint32_t value)
302
278
value = mapResolution (value , _writeResolution , 12 );
303
279
}
304
280
305
- stm32l4_gpio_pin_configure (g_APinDescription [pin ].pin , (GPIO_PUPD_NONE | GPIO_OSPEED_HIGH | GPIO_OTYPE_PUSHPULL | GPIO_MODE_ALTERNATE ));
281
+ if (_channels [instance ] & (1u << g_APinDescription [pin ].pwm_channel ))
282
+ {
283
+ stm32l4_timer_compare (& stm32l4_pwm [instance ], g_APinDescription [pin ].pwm_channel , value );
284
+ }
285
+ else
286
+ {
287
+ _channels [instance ] |= (1u << g_APinDescription [pin ].pwm_channel );
306
288
307
- stm32l4_timer_channel (& stm32l4_pwm [instance ], g_APinDescription [pin ].pwm_channel , value , TIMER_CONTROL_PWM );
289
+ if (stm32l4_pwm [instance ].state == TIMER_STATE_NONE )
290
+ {
291
+ stm32l4_timer_create (& stm32l4_pwm [instance ], g_PWMInstances [instance ], STM32L4_PWM_IRQ_PRIORITY , 0 );
292
+
293
+ if (_writeFrequency [instance ] && _writeRange [instance ])
294
+ {
295
+ carrier = _writeFrequency [instance ] * _writeRange [instance ];
296
+ modulus = _writeRange [instance ];
297
+ }
298
+ else
299
+ {
300
+ carrier = 2000000 ;
301
+ modulus = 4095 ;
302
+ }
303
+
304
+ divider = stm32l4_timer_clock (& stm32l4_pwm [instance ]) / carrier ;
305
+
306
+ if (divider == 0 )
307
+ {
308
+ divider = 1 ;
309
+ }
310
+
311
+ stm32l4_timer_enable (& stm32l4_pwm [instance ], divider - 1 , modulus - 1 , 0 , NULL , NULL , 0 );
312
+ stm32l4_timer_start (& stm32l4_pwm [instance ], false);
313
+ }
314
+
315
+ stm32l4_gpio_pin_configure (g_APinDescription [pin ].pin , (GPIO_PUPD_NONE | GPIO_OSPEED_HIGH | GPIO_OTYPE_PUSHPULL | GPIO_MODE_ALTERNATE ));
316
+
317
+ stm32l4_timer_channel (& stm32l4_pwm [instance ], g_APinDescription [pin ].pwm_channel , value , TIMER_CONTROL_PWM );
318
+ }
308
319
309
320
return ;
310
321
}
0 commit comments