@@ -38,6 +38,13 @@ pub struct PushPull;
3838/// Open drain output (type state)
3939pub struct OpenDrain ;
4040
41+ /// Alternate mode (type state)
42+ pub struct Alternate < AF , MODE >
43+ {
44+ _af : PhantomData < AF > ,
45+ _mode : PhantomData < MODE > ,
46+ }
47+
4148/// Alternate function 0 (type state)
4249pub struct AF0 ;
4350
@@ -99,7 +106,7 @@ macro_rules! gpio {
99106
100107 use rcc:: AHB2 ;
101108 use super :: {
102- AF4 , AF5 , AF6 , AF7 , Floating , GpioExt , Input , OpenDrain , Output ,
109+ Alternate , AF4 , AF5 , AF6 , AF7 , AF8 , AF9 , Floating , GpioExt , Input , OpenDrain , Output ,
103110 PullDown , PullUp , PushPull ,
104111 } ;
105112
@@ -229,7 +236,7 @@ macro_rules! gpio {
229236 self ,
230237 moder: & mut MODER ,
231238 afr: & mut $AFR,
232- ) -> $PXi<AF4 > {
239+ ) -> $PXi<Alternate < AF4 , MODE > > {
233240 let offset = 2 * $i;
234241
235242 // alternate function mode
@@ -252,7 +259,7 @@ macro_rules! gpio {
252259 self ,
253260 moder: & mut MODER ,
254261 afr: & mut $AFR,
255- ) -> $PXi<AF5 > {
262+ ) -> $PXi<Alternate < AF5 , MODE > > {
256263 let offset = 2 * $i;
257264
258265 // alternate function mode
@@ -275,7 +282,7 @@ macro_rules! gpio {
275282 self ,
276283 moder: & mut MODER ,
277284 afr: & mut $AFR,
278- ) -> $PXi<AF6 > {
285+ ) -> $PXi<Alternate < AF6 , MODE > > {
279286 let offset = 2 * $i;
280287
281288 // alternate function mode
@@ -298,7 +305,7 @@ macro_rules! gpio {
298305 self ,
299306 moder: & mut MODER ,
300307 afr: & mut $AFR,
301- ) -> $PXi<AF7 > {
308+ ) -> $PXi<Alternate < AF7 , MODE > > {
302309 let offset = 2 * $i;
303310
304311 // alternate function mode
@@ -317,6 +324,54 @@ macro_rules! gpio {
317324 $PXi { _mode: PhantomData }
318325 }
319326
327+ /// Configures the pin to serve as alternate function 8 (AF8)
328+ pub fn into_af8(
329+ self ,
330+ moder: & mut MODER ,
331+ afr: & mut $AFR,
332+ ) -> $PXi<Alternate <AF8 , MODE >> {
333+ let offset = 2 * $i;
334+
335+ // alternate function mode
336+ let mode = 0b10 ;
337+ moder. moder( ) . modify( |r, w| unsafe {
338+ w. bits( ( r. bits( ) & !( 0b11 << offset) ) | ( mode << offset) )
339+ } ) ;
340+
341+ let af = 8 ;
342+ let offset = 4 * ( $i % 8 ) ;
343+
344+ afr. afr( ) . modify( |r, w| unsafe {
345+ w. bits( ( r. bits( ) & !( 0b1111 << offset) ) | ( af << offset) )
346+ } ) ;
347+
348+ $PXi { _mode: PhantomData }
349+ }
350+
351+ /// Configures the pin to serve as alternate function 9 (AF9)
352+ pub fn into_af9(
353+ self ,
354+ moder: & mut MODER ,
355+ afr: & mut $AFR,
356+ ) -> $PXi<Alternate <AF9 , MODE >> {
357+ let offset = 2 * $i;
358+
359+ // alternate function mode
360+ let mode = 0b10 ;
361+ moder. moder( ) . modify( |r, w| unsafe {
362+ w. bits( ( r. bits( ) & !( 0b11 << offset) ) | ( mode << offset) )
363+ } ) ;
364+
365+ let af = 9 ;
366+ let offset = 4 * ( $i % 8 ) ;
367+
368+ afr. afr( ) . modify( |r, w| unsafe {
369+ w. bits( ( r. bits( ) & !( 0b1111 << offset) ) | ( af << offset) )
370+ } ) ;
371+
372+ $PXi { _mode: PhantomData }
373+ }
374+
320375 /// Configures the pin to operate as a floating input pin
321376 pub fn into_floating_input(
322377 self ,
@@ -423,6 +478,28 @@ macro_rules! gpio {
423478
424479 $PXi { _mode: PhantomData }
425480 }
481+
482+ /// Configures the pin to operate as an touch sample
483+ pub fn into_touch_sample(
484+ self ,
485+ moder: & mut MODER ,
486+ otyper: & mut OTYPER ,
487+ afr: & mut $AFR,
488+ ) -> $PXi<Alternate <AF9 , Output <OpenDrain >>> {
489+ let od = self . into_open_drain_output( moder, otyper) ;
490+ od. into_af9( moder, afr)
491+ }
492+
493+ /// Configures the pin to operate as an touch channel
494+ pub fn into_touch_channel(
495+ self ,
496+ moder: & mut MODER ,
497+ otyper: & mut OTYPER ,
498+ afr: & mut $AFR,
499+ ) -> $PXi<Alternate <AF9 , Output <PushPull >>> {
500+ let od = self . into_push_pull_output( moder, otyper) ;
501+ od. into_af9( moder, afr)
502+ }
426503 }
427504
428505 impl $PXi<Output <OpenDrain >> {
0 commit comments