@@ -7,6 +7,8 @@ use embassy_hal_internal::{into_ref, PeripheralRef};
77
88use super :: low_level:: { CountingMode , OutputCompareMode , OutputPolarity , Timer } ;
99use super :: { Channel , Channel1Pin , Channel2Pin , Channel3Pin , Channel4Pin , GeneralInstance4Channel , TimerBits } ;
10+ #[ cfg( gpio_v2) ]
11+ use crate :: gpio:: Pull ;
1012use crate :: gpio:: { AfType , AnyPin , OutputType , Speed } ;
1113use crate :: time:: Hertz ;
1214use crate :: Peripheral ;
@@ -28,8 +30,21 @@ pub struct PwmPin<'d, T, C> {
2830 phantom : PhantomData < ( T , C ) > ,
2931}
3032
33+ /// PWM pin config
34+ ///
35+ /// This configures the pwm pin settings
36+ pub struct PwmPinConfig {
37+ /// PWM Pin output type
38+ pub output_type : OutputType ,
39+ /// PWM Pin speed
40+ pub speed : Speed ,
41+ /// PWM Pin pull type
42+ #[ cfg( gpio_v2) ]
43+ pub pull : Pull ,
44+ }
45+
3146macro_rules! channel_impl {
32- ( $new_chx: ident, $channel: ident, $pin_trait: ident) => {
47+ ( $new_chx: ident, $new_chx_with_config : ident , $ channel: ident, $pin_trait: ident) => {
3348 impl <' d, T : GeneralInstance4Channel > PwmPin <' d, T , $channel> {
3449 #[ doc = concat!( "Create a new " , stringify!( $channel) , " PWM pin instance." ) ]
3550 pub fn $new_chx( pin: impl Peripheral <P = impl $pin_trait<T >> + ' d, output_type: OutputType ) -> Self {
@@ -43,14 +58,36 @@ macro_rules! channel_impl {
4358 phantom: PhantomData ,
4459 }
4560 }
61+
62+ #[ doc = concat!( "Create a new " , stringify!( $channel) , " PWM pin instance with config." ) ]
63+ pub fn $new_chx_with_config(
64+ pin: impl Peripheral <P = impl $pin_trait<T >> + ' d,
65+ pin_config: PwmPinConfig ,
66+ ) -> Self {
67+ into_ref!( pin) ;
68+ critical_section:: with( |_| {
69+ pin. set_low( ) ;
70+ pin. set_as_af(
71+ pin. af_num( ) ,
72+ #[ cfg( gpio_v1) ]
73+ AfType :: output( pin_config. output_type, pin_config. speed) ,
74+ #[ cfg( gpio_v2) ]
75+ AfType :: output_pull( pin_config. output_type, pin_config. speed, pin_config. pull) ,
76+ ) ;
77+ } ) ;
78+ PwmPin {
79+ _pin: pin. map_into( ) ,
80+ phantom: PhantomData ,
81+ }
82+ }
4683 }
4784 } ;
4885}
4986
50- channel_impl ! ( new_ch1, Ch1 , Channel1Pin ) ;
51- channel_impl ! ( new_ch2, Ch2 , Channel2Pin ) ;
52- channel_impl ! ( new_ch3, Ch3 , Channel3Pin ) ;
53- channel_impl ! ( new_ch4, Ch4 , Channel4Pin ) ;
87+ channel_impl ! ( new_ch1, new_ch1_with_config , Ch1 , Channel1Pin ) ;
88+ channel_impl ! ( new_ch2, new_ch2_with_config , Ch2 , Channel2Pin ) ;
89+ channel_impl ! ( new_ch3, new_ch3_with_config , Ch3 , Channel3Pin ) ;
90+ channel_impl ! ( new_ch4, new_ch4_with_config , Ch4 , Channel4Pin ) ;
5491
5592/// A single channel of a pwm, obtained from [`SimplePwm::split`],
5693/// [`SimplePwm::channel`], [`SimplePwm::ch1`], etc.
0 commit comments