6
6
#![ no_std]
7
7
8
8
use cortex_m_rt:: entry;
9
- use embedded_hal:: digital:: v2:: { InputPin , OutputPin , StatefulOutputPin , ToggleableOutputPin } ;
9
+ use embedded_hal:: digital:: v2:: { InputPin , OutputPin , ToggleableOutputPin } ;
10
10
use panic_rtt_target as _;
11
11
use rtt_target:: { rprintln, rtt_init_print} ;
12
- use va108xx_hal:: gpio:: { porta, portb, PinState } ;
13
- use va108xx_hal:: prelude:: * ;
12
+ use va108xx_hal:: gpio:: { PinState , PinsA , PinsB } ;
14
13
15
14
#[ allow( dead_code) ]
16
15
#[ derive( Debug ) ]
@@ -20,6 +19,8 @@ enum TestCase {
20
19
TestPullup ,
21
20
TestPulldown ,
22
21
TestMask ,
22
+ // Tie PORTB[22] to PORTB[23] for this test
23
+ PortB ,
23
24
Perid ,
24
25
// Tie PA0 to an oscilloscope and configure pulse detection
25
26
Pulse ,
@@ -32,11 +33,9 @@ fn main() -> ! {
32
33
rtt_init_print ! ( ) ;
33
34
rprintln ! ( "-- VA108xx Test Application --" ) ;
34
35
let mut dp = va108xx:: Peripherals :: take ( ) . unwrap ( ) ;
35
- let porta = dp. PORTA . split ( & mut dp. SYSCONFIG ) . unwrap ( ) ;
36
- let _portb = dp. PORTB . split ( & mut dp. SYSCONFIG ) . unwrap ( ) ;
37
- let mut led1 = porta
38
- . pa10
39
- . into_push_pull_output ( & mut dp. IOCONFIG , & mut dp. PORTA ) ;
36
+ let pinsa = PinsA :: new ( & mut dp. SYSCONFIG , None , dp. PORTA ) ;
37
+ let pinsb = PinsB :: new ( & mut dp. SYSCONFIG , Some ( dp. IOCONFIG ) , dp. PORTB ) ;
38
+ let mut led1 = pinsa. pa10 . into_push_pull_output ( ) ;
40
39
let test_case = TestCase :: Delay ;
41
40
42
41
match test_case {
@@ -56,101 +55,80 @@ fn main() -> ! {
56
55
match test_case {
57
56
TestCase :: TestBasic => {
58
57
// Tie PORTA[0] to PORTA[1] for these tests!
59
- let mut out = porta
60
- . pa0
61
- . into_push_pull_output ( & mut dp. IOCONFIG , & mut dp. PORTA )
62
- . enable_input ( & mut dp. IOCONFIG , true ) ;
63
- let input = porta
64
- . pa1
65
- . into_floating_input ( & mut dp. IOCONFIG , & mut dp. PORTA ) ;
58
+ let mut out = pinsa. pa0 . into_readable_push_pull_output ( ) ;
59
+ let input = pinsa. pa1 . into_floating_input ( ) ;
66
60
out. set_high ( ) . unwrap ( ) ;
67
- assert ! ( out. is_set_high( ) . unwrap( ) ) ;
68
61
assert ! ( input. is_high( ) . unwrap( ) ) ;
69
62
out. set_low ( ) . unwrap ( ) ;
70
- assert ! ( out. is_set_low( ) . unwrap( ) ) ;
71
63
assert ! ( input. is_low( ) . unwrap( ) ) ;
72
64
}
73
65
TestCase :: TestPullup => {
74
66
// Tie PORTA[0] to PORTA[1] for these tests!
75
- let input = porta
76
- . pa1
77
- . into_pull_up_input ( & mut dp. IOCONFIG , & mut dp. PORTA ) ;
67
+ let input = pinsa. pa1 . into_pull_up_input ( ) ;
78
68
assert ! ( input. is_high( ) . unwrap( ) ) ;
79
- let mut out = porta
80
- . pa0
81
- . into_push_pull_output ( & mut dp. IOCONFIG , & mut dp. PORTA ) ;
69
+ let mut out = pinsa. pa0 . into_readable_push_pull_output ( ) ;
82
70
out. set_low ( ) . unwrap ( ) ;
83
71
assert ! ( input. is_low( ) . unwrap( ) ) ;
84
72
out. set_high ( ) . unwrap ( ) ;
85
73
assert ! ( input. is_high( ) . unwrap( ) ) ;
86
- out. into_floating_input ( & mut dp . IOCONFIG , & mut dp . PORTA ) ;
74
+ out. into_floating_input ( ) ;
87
75
assert ! ( input. is_high( ) . unwrap( ) ) ;
88
76
}
89
77
TestCase :: TestPulldown => {
90
78
// Tie PORTA[0] to PORTA[1] for these tests!
91
- let input = porta
92
- . pa1
93
- . into_pull_down_input ( & mut dp. IOCONFIG , & mut dp. PORTA ) ;
79
+ let input = pinsa. pa1 . into_pull_down_input ( ) ;
94
80
assert ! ( input. is_low( ) . unwrap( ) ) ;
95
- let mut out = porta
96
- . pa0
97
- . into_push_pull_output ( & mut dp. IOCONFIG , & mut dp. PORTA ) ;
81
+ let mut out = pinsa. pa0 . into_push_pull_output ( ) ;
98
82
out. set_low ( ) . unwrap ( ) ;
99
83
assert ! ( input. is_low( ) . unwrap( ) ) ;
100
84
out. set_high ( ) . unwrap ( ) ;
101
85
assert ! ( input. is_high( ) . unwrap( ) ) ;
102
- out. into_floating_input ( & mut dp . IOCONFIG , & mut dp . PORTA ) ;
86
+ out. into_floating_input ( ) ;
103
87
assert ! ( input. is_low( ) . unwrap( ) ) ;
104
88
}
105
89
TestCase :: TestMask => {
106
90
// Tie PORTA[0] to PORTA[1] for these tests!
107
- let input = porta
108
- . pa1
109
- . into_pull_down_input ( & mut dp. IOCONFIG , & mut dp. PORTA )
110
- . clear_datamask ( & mut dp. PORTA ) ;
111
- assert ! ( !input. datamask( & dp. PORTA ) ) ;
112
- let out = porta
113
- . pa0
114
- . into_push_pull_output ( & mut dp. IOCONFIG , & mut dp. PORTA )
115
- . clear_datamask ( & mut dp. PORTA ) ;
116
- assert ! ( input. is_low_masked( & mut dp. PORTA ) . is_err( ) ) ;
117
- assert ! ( out. set_high_masked( & mut dp. PORTA ) . is_err( ) ) ;
91
+ let input = pinsa. pa1 . into_pull_down_input ( ) . clear_datamask ( ) ;
92
+ assert ! ( !input. datamask( ) ) ;
93
+ let mut out = pinsa. pa0 . into_push_pull_output ( ) . clear_datamask ( ) ;
94
+ assert ! ( input. is_low_masked( ) . is_err( ) ) ;
95
+ assert ! ( out. set_high_masked( ) . is_err( ) ) ;
96
+ }
97
+ TestCase :: PortB => {
98
+ // Tie PORTB[22] to PORTB[23] for these tests!
99
+ let mut out = pinsb. pb22 . into_readable_push_pull_output ( ) ;
100
+ let input = pinsb. pb23 . into_floating_input ( ) ;
101
+ out. set_high ( ) . unwrap ( ) ;
102
+ assert ! ( input. is_high( ) . unwrap( ) ) ;
103
+ out. set_low ( ) . unwrap ( ) ;
104
+ assert ! ( input. is_low( ) . unwrap( ) ) ;
118
105
}
119
106
TestCase :: Perid => {
120
- assert_eq ! ( porta :: get_perid( & dp . PORTA ) , 0x004007e1 ) ;
121
- assert_eq ! ( portb :: get_perid( & dp . PORTB ) , 0x004007e1 ) ;
107
+ assert_eq ! ( PinsA :: get_perid( ) , 0x004007e1 ) ;
108
+ assert_eq ! ( PinsB :: get_perid( ) , 0x004007e1 ) ;
122
109
}
123
110
TestCase :: Pulse => {
124
- let mut output_pulsed = porta
111
+ let mut output_pulsed = pinsa
125
112
. pa0
126
- . into_push_pull_output ( & mut dp . IOCONFIG , & mut dp . PORTA )
127
- . pulse_mode ( & mut dp . PORTA , true , PinState :: Low ) ;
113
+ . into_push_pull_output ( )
114
+ . pulse_mode ( true , PinState :: Low ) ;
128
115
rprintln ! ( "Pulsing high 10 times.." ) ;
129
116
output_pulsed. set_low ( ) . unwrap ( ) ;
130
117
for _ in 0 ..10 {
131
118
output_pulsed. set_high ( ) . unwrap ( ) ;
132
119
cortex_m:: asm:: delay ( 25_000_000 ) ;
133
120
}
134
- let mut output_pulsed = output_pulsed. pulse_mode ( & mut dp . PORTA , true , PinState :: High ) ;
121
+ let mut output_pulsed = output_pulsed. pulse_mode ( true , PinState :: High ) ;
135
122
rprintln ! ( "Pulsing low 10 times.." ) ;
136
123
for _ in 0 ..10 {
137
124
output_pulsed. set_low ( ) . unwrap ( ) ;
138
125
cortex_m:: asm:: delay ( 25_000_000 ) ;
139
126
}
140
127
}
141
128
TestCase :: Delay => {
142
- let mut out_0 = porta
143
- . pa0
144
- . into_push_pull_output ( & mut dp. IOCONFIG , & mut dp. PORTA )
145
- . delay ( & mut dp. PORTA , true , false ) ;
146
- let mut out_1 = porta
147
- . pa1
148
- . into_push_pull_output ( & mut dp. IOCONFIG , & mut dp. PORTA )
149
- . delay ( & mut dp. PORTA , false , true ) ;
150
- let mut out_2 = porta
151
- . pa3
152
- . into_push_pull_output ( & mut dp. IOCONFIG , & mut dp. PORTA )
153
- . delay ( & mut dp. PORTA , true , true ) ;
129
+ let mut out_0 = pinsa. pa0 . into_push_pull_output ( ) . delay ( true , false ) ;
130
+ let mut out_1 = pinsa. pa1 . into_push_pull_output ( ) . delay ( false , true ) ;
131
+ let mut out_2 = pinsa. pa3 . into_push_pull_output ( ) . delay ( true , true ) ;
154
132
for _ in 0 ..20 {
155
133
out_0. toggle ( ) . unwrap ( ) ;
156
134
out_1. toggle ( ) . unwrap ( ) ;
0 commit comments