@@ -285,10 +285,9 @@ where
285
285
/// Sets duty cycle (15 bit) for all PWM channels.
286
286
/// Will replace any ongoing sequence playback.
287
287
pub fn set_duty_on_common ( & self , duty : u16 ) {
288
- compiler_fence ( Ordering :: SeqCst ) ;
289
- T :: buffer ( )
290
- . get_mut ( )
291
- . copy_from_slice ( & [ duty. min ( self . max_duty ( ) ) & 0x7FFF ; 4 ] [ ..] ) ;
288
+ let mut buffer = T :: buffer ( ) . take ( ) ;
289
+ buffer. copy_from_slice ( & [ duty. min ( self . max_duty ( ) ) & 0x7FFF ; 4 ] [ ..] ) ;
290
+ T :: buffer ( ) . set ( buffer) ;
292
291
self . one_shot ( ) ;
293
292
self . set_load_mode ( LoadMode :: Common ) ;
294
293
self . pwm
@@ -302,10 +301,9 @@ where
302
301
/// Sets inverted duty cycle (15 bit) for all PWM channels.
303
302
/// Will replace any ongoing sequence playback.
304
303
pub fn set_duty_off_common ( & self , duty : u16 ) {
305
- compiler_fence ( Ordering :: SeqCst ) ;
306
- T :: buffer ( )
307
- . get_mut ( )
308
- . copy_from_slice ( & [ duty. min ( self . max_duty ( ) ) | 0x8000 ; 4 ] [ ..] ) ;
304
+ let mut buffer = T :: buffer ( ) . take ( ) ;
305
+ buffer. copy_from_slice ( & [ duty. min ( self . max_duty ( ) ) | 0x8000 ; 4 ] [ ..] ) ;
306
+ T :: buffer ( ) . set ( buffer) ;
309
307
self . one_shot ( ) ;
310
308
self . set_load_mode ( LoadMode :: Common ) ;
311
309
self . pwm
@@ -331,8 +329,9 @@ where
331
329
/// Sets duty cycle (15 bit) for a PWM group.
332
330
/// Will replace any ongoing sequence playback.
333
331
pub fn set_duty_on_group ( & self , group : Group , duty : u16 ) {
334
- compiler_fence ( Ordering :: SeqCst ) ;
335
- T :: buffer ( ) . get_mut ( ) [ usize:: from ( group) ] = duty. min ( self . max_duty ( ) ) & 0x7FFF ;
332
+ let mut buffer = T :: buffer ( ) . take ( ) ;
333
+ buffer[ usize:: from ( group) ] = duty. min ( self . max_duty ( ) ) & 0x7FFF ;
334
+ T :: buffer ( ) . set ( buffer) ;
336
335
self . one_shot ( ) ;
337
336
self . set_load_mode ( LoadMode :: Grouped ) ;
338
337
self . pwm
@@ -346,8 +345,9 @@ where
346
345
/// Sets inverted duty cycle (15 bit) for a PWM group.
347
346
/// Will replace any ongoing sequence playback.
348
347
pub fn set_duty_off_group ( & self , group : Group , duty : u16 ) {
349
- compiler_fence ( Ordering :: SeqCst ) ;
350
- T :: buffer ( ) . get_mut ( ) [ usize:: from ( group) ] = duty. min ( self . max_duty ( ) ) | 0x8000 ;
348
+ let mut buffer = T :: buffer ( ) . take ( ) ;
349
+ buffer[ usize:: from ( group) ] = duty. min ( self . max_duty ( ) ) | 0x8000 ;
350
+ T :: buffer ( ) . set ( buffer) ;
351
351
self . one_shot ( ) ;
352
352
self . set_load_mode ( LoadMode :: Grouped ) ;
353
353
self . pwm
@@ -373,25 +373,27 @@ where
373
373
/// Sets duty cycle (15 bit) for a PWM channel.
374
374
/// Will replace any ongoing sequence playback and the other channels will return to their previously set value.
375
375
pub fn set_duty_on ( & self , channel : Channel , duty : u16 ) {
376
- compiler_fence ( Ordering :: SeqCst ) ;
377
- T :: buffer ( ) . get_mut ( ) [ usize:: from ( channel) ] = duty. min ( self . max_duty ( ) ) & 0x7FFF ;
376
+ let mut buffer = T :: buffer ( ) . take ( ) ;
377
+ buffer[ usize:: from ( channel) ] = duty. min ( self . max_duty ( ) ) & 0x7FFF ;
378
+ T :: buffer ( ) . set ( buffer) ;
378
379
self . one_shot ( ) ;
379
380
self . set_load_mode ( LoadMode :: Individual ) ;
380
- if self . load_seq ( Seq :: Seq0 , T :: buffer ( ) . get_mut ( ) ) . is_ok ( ) {
381
- self . start_seq ( Seq :: Seq0 ) ;
382
- }
381
+ self . pwm . seq0 . ptr . write ( |w| unsafe { w . bits ( T :: buffer ( ) . as_ptr ( ) as u32 ) } ) ;
382
+ self . pwm . seq0 . cnt . write ( |w| unsafe { w . bits ( 4 ) } ) ;
383
+ self . start_seq ( Seq :: Seq0 ) ;
383
384
}
384
385
385
386
/// Sets inverted duty cycle (15 bit) for a PWM channel.
386
387
/// Will replace any ongoing sequence playback and the other channels will return to their previously set value.
387
388
pub fn set_duty_off ( & self , channel : Channel , duty : u16 ) {
388
- compiler_fence ( Ordering :: SeqCst ) ;
389
- T :: buffer ( ) . get_mut ( ) [ usize:: from ( channel) ] = duty. min ( self . max_duty ( ) ) | 0x8000 ;
389
+ let mut buffer = T :: buffer ( ) . take ( ) ;
390
+ buffer[ usize:: from ( channel) ] = duty. min ( self . max_duty ( ) ) | 0x8000 ;
391
+ T :: buffer ( ) . set ( buffer) ;
390
392
self . one_shot ( ) ;
391
393
self . set_load_mode ( LoadMode :: Individual ) ;
392
- if self . load_seq ( Seq :: Seq0 , T :: buffer ( ) . get_mut ( ) ) . is_ok ( ) {
393
- self . start_seq ( Seq :: Seq0 ) ;
394
- }
394
+ self . pwm . seq0 . ptr . write ( |w| unsafe { w . bits ( T :: buffer ( ) . as_ptr ( ) as u32 ) } ) ;
395
+ self . pwm . seq0 . cnt . write ( |w| unsafe { w . bits ( 4 ) } ) ;
396
+ self . start_seq ( Seq :: Seq0 ) ;
395
397
}
396
398
397
399
/// Returns the duty cycle value for a PWM channel.
@@ -1094,7 +1096,7 @@ pub trait Instance: private::Sealed + Deref<Target = crate::pac::pwm0::RegisterB
1094
1096
const INTERRUPT : Interrupt ;
1095
1097
1096
1098
/// Provides access to the associated internal duty buffer for the instance.
1097
- fn buffer ( ) -> & ' static mut Cell < [ u16 ; 4 ] > ;
1099
+ fn buffer ( ) -> & ' static Cell < [ u16 ; 4 ] > ;
1098
1100
}
1099
1101
1100
1102
// Internal static duty buffers. One per instance.
@@ -1109,32 +1111,32 @@ static mut BUF3: Cell<[u16; 4]> = Cell::new([0; 4]);
1109
1111
impl Instance for PWM0 {
1110
1112
const INTERRUPT : Interrupt = Interrupt :: PWM0 ;
1111
1113
#[ inline( always) ]
1112
- fn buffer ( ) -> & ' static mut Cell < [ u16 ; 4 ] > {
1113
- unsafe { & mut BUF0 }
1114
+ fn buffer ( ) -> & ' static Cell < [ u16 ; 4 ] > {
1115
+ unsafe { & BUF0 }
1114
1116
}
1115
1117
}
1116
1118
1117
1119
#[ cfg( not( any( feature = "52810" , feature = "52811" ) ) ) ]
1118
1120
impl Instance for PWM1 {
1119
1121
const INTERRUPT : Interrupt = Interrupt :: PWM1 ;
1120
- fn buffer ( ) -> & ' static mut Cell < [ u16 ; 4 ] > {
1121
- unsafe { & mut BUF1 }
1122
+ fn buffer ( ) -> & ' static Cell < [ u16 ; 4 ] > {
1123
+ unsafe { & BUF1 }
1122
1124
}
1123
1125
}
1124
1126
1125
1127
#[ cfg( not( any( feature = "52810" , feature = "52811" ) ) ) ]
1126
1128
impl Instance for PWM2 {
1127
1129
const INTERRUPT : Interrupt = Interrupt :: PWM2 ;
1128
- fn buffer ( ) -> & ' static mut Cell < [ u16 ; 4 ] > {
1129
- unsafe { & mut BUF2 }
1130
+ fn buffer ( ) -> & ' static Cell < [ u16 ; 4 ] > {
1131
+ unsafe { & BUF2 }
1130
1132
}
1131
1133
}
1132
1134
1133
1135
#[ cfg( not( any( feature = "52810" , feature = "52811" , feature = "52832" ) ) ) ]
1134
1136
impl Instance for PWM3 {
1135
1137
const INTERRUPT : Interrupt = Interrupt :: PWM3 ;
1136
- fn buffer ( ) -> & ' static mut Cell < [ u16 ; 4 ] > {
1137
- unsafe { & mut BUF3 }
1138
+ fn buffer ( ) -> & ' static Cell < [ u16 ; 4 ] > {
1139
+ unsafe { & BUF3 }
1138
1140
}
1139
1141
}
1140
1142
0 commit comments