4
4
#![ allow( unused_macros) ]
5
5
#![ deny( warnings) ]
6
6
//#![deny(unsafe_code)]
7
-
8
7
#![ no_main]
9
8
#![ no_std]
10
9
11
10
use cortex_m:: asm;
12
11
13
- use cortex_m_rt:: { entry} ;
12
+ use cortex_m_rt:: entry;
14
13
15
- use stm32h7xx_hal as hal;
16
- use hal:: stm32;
17
- use hal:: { prelude:: * , pac } ;
18
- use hal:: hal:: digital:: v2:: OutputPin ;
19
- use hal:: rcc:: { rec:: Sai1ClkSel } ;
20
- use hal:: sai:: { self , SaiI2sExt , SaiChannel } ;
21
14
use hal:: dma;
15
+ use hal:: hal:: digital:: v2:: OutputPin ;
16
+ use hal:: rcc:: rec:: Sai1ClkSel ;
17
+ use hal:: sai:: { self , SaiChannel , SaiI2sExt } ;
18
+ use hal:: stm32;
22
19
use hal:: time:: Hertz ;
20
+ use hal:: { pac, prelude:: * } ;
21
+ use stm32h7xx_hal as hal;
23
22
24
23
use pac:: interrupt;
25
24
@@ -28,11 +27,10 @@ use log::info;
28
27
#[ macro_use]
29
28
mod utilities;
30
29
31
-
32
30
// = global constants =========================================================
33
31
34
32
// 32 samples * 2 audio channels * 2 buffers
35
- const DMA_BUFFER_LENGTH : usize = 32 * 2 * 2 ;
33
+ const DMA_BUFFER_LENGTH : usize = 32 * 2 * 2 ;
36
34
37
35
const AUDIO_SAMPLE_HZ : Hertz = Hertz ( 48_000 ) ;
38
36
@@ -41,15 +39,13 @@ const AUDIO_SAMPLE_HZ: Hertz = Hertz(48_000);
41
39
// But not less than so targetting 257
42
40
const PLL3_P_HZ : Hertz = Hertz ( AUDIO_SAMPLE_HZ . 0 * 257 ) ;
43
41
44
-
45
42
// = static data ==============================================================
46
43
47
44
#[ link_section = ".sram3" ]
48
45
static mut TX_BUFFER : [ u32 ; DMA_BUFFER_LENGTH ] = [ 0 ; DMA_BUFFER_LENGTH ] ;
49
46
#[ link_section = ".sram3" ]
50
47
static mut RX_BUFFER : [ u32 ; DMA_BUFFER_LENGTH ] = [ 0 ; DMA_BUFFER_LENGTH ] ;
51
48
52
-
53
49
// = entry ====================================================================
54
50
55
51
#[ entry]
@@ -61,7 +57,9 @@ fn main() -> ! {
61
57
let dp = hal:: pac:: Peripherals :: take ( ) . unwrap ( ) ;
62
58
let pwr = dp. PWR . constrain ( ) ;
63
59
let vos = pwr. freeze ( ) ;
64
- let ccdr = dp. RCC . constrain ( )
60
+ let ccdr = dp
61
+ . RCC
62
+ . constrain ( )
65
63
. use_hse ( 16 . mhz ( ) )
66
64
. sys_ck ( 400 . mhz ( ) )
67
65
. pll3_p_ck ( PLL3_P_HZ )
@@ -70,7 +68,6 @@ fn main() -> ! {
70
68
// enable sai1 peripheral and set clock to pll3
71
69
let sai1_rec = ccdr. peripheral . SAI1 . kernel_clk_mux ( Sai1ClkSel :: PLL3_P ) ;
72
70
73
-
74
71
// - configure pins ---------------------------------------------------
75
72
76
73
let gpiob = dp. GPIOB . split ( ccdr. peripheral . GPIOB ) ;
@@ -85,38 +82,43 @@ fn main() -> ! {
85
82
Some ( gpioe. pe3 . into_alternate_af6 ( ) ) , // SD_B
86
83
) ;
87
84
88
-
89
85
// - configure dma1 -------------------------------------------------------
90
86
91
- let dma1_streams = dma:: dma:: StreamsTuple :: new ( dp. DMA1 , ccdr. peripheral . DMA1 ) ;
87
+ let dma1_streams =
88
+ dma:: dma:: StreamsTuple :: new ( dp. DMA1 , ccdr. peripheral . DMA1 ) ;
92
89
93
90
// dma1 stream 0
94
- let tx_buffer: & ' static mut [ u32 ; DMA_BUFFER_LENGTH ] = unsafe { & mut TX_BUFFER } ;
91
+ let tx_buffer: & ' static mut [ u32 ; DMA_BUFFER_LENGTH ] =
92
+ unsafe { & mut TX_BUFFER } ;
95
93
let dma_config = dma:: dma:: DmaConfig :: default ( )
96
94
. priority ( dma:: config:: Priority :: High )
97
95
. memory_increment ( true )
98
96
. peripheral_increment ( false )
99
97
. circular_buffer ( true )
100
98
. fifo_enable ( false ) ;
101
- let mut dma1_str0: dma:: Transfer < _ , _ , dma:: MemoryToPeripheral , _ > = dma:: Transfer :: init (
102
- dma1_streams. 0 ,
103
- unsafe { pac:: Peripherals :: steal ( ) . SAI1 } ,
104
- tx_buffer,
105
- None ,
106
- dma_config,
107
- ) ;
99
+ let mut dma1_str0: dma:: Transfer < _ , _ , dma:: MemoryToPeripheral , _ > =
100
+ dma:: Transfer :: init (
101
+ dma1_streams. 0 ,
102
+ unsafe { pac:: Peripherals :: steal ( ) . SAI1 } ,
103
+ tx_buffer,
104
+ None ,
105
+ dma_config,
106
+ ) ;
108
107
109
108
// dma1 stream 1
110
- let rx_buffer: & ' static mut [ u32 ; DMA_BUFFER_LENGTH ] = unsafe { & mut RX_BUFFER } ;
111
- let dma_config = dma_config. transfer_complete_interrupt ( true )
112
- . half_transfer_interrupt ( true ) ;
113
- let mut dma1_str1: dma:: Transfer < _ , _ , dma:: PeripheralToMemory , _ > = dma:: Transfer :: init (
114
- dma1_streams. 1 ,
115
- unsafe { pac:: Peripherals :: steal ( ) . SAI1 } ,
116
- rx_buffer,
117
- None ,
118
- dma_config,
119
- ) ;
109
+ let rx_buffer: & ' static mut [ u32 ; DMA_BUFFER_LENGTH ] =
110
+ unsafe { & mut RX_BUFFER } ;
111
+ let dma_config = dma_config
112
+ . transfer_complete_interrupt ( true )
113
+ . half_transfer_interrupt ( true ) ;
114
+ let mut dma1_str1: dma:: Transfer < _ , _ , dma:: PeripheralToMemory , _ > =
115
+ dma:: Transfer :: init (
116
+ dma1_streams. 1 ,
117
+ unsafe { pac:: Peripherals :: steal ( ) . SAI1 } ,
118
+ rx_buffer,
119
+ None ,
120
+ dma_config,
121
+ ) ;
120
122
121
123
// - configure sai ----------------------------------------------------
122
124
@@ -140,18 +142,18 @@ fn main() -> ! {
140
142
Some ( sai1_rx_config) ,
141
143
) ;
142
144
143
-
144
145
// - reset ak4556 codec -----------------------------------------------
145
146
146
147
ak4556_reset. set_low ( ) . unwrap ( ) ;
147
- asm:: delay ( 480_000 ) ; // ~ 1ms (datasheet specifies minimum 150ns)
148
+ asm:: delay ( 480_000 ) ; // ~ 1ms (datasheet specifies minimum 150ns)
148
149
ak4556_reset. set_high ( ) . unwrap ( ) ;
149
150
150
-
151
151
// - start audio ------------------------------------------------------
152
152
153
153
// unmask interrupt handler for dma 1, stream 1
154
- unsafe { pac:: NVIC :: unmask ( pac:: Interrupt :: DMA1_STR1 ) ; }
154
+ unsafe {
155
+ pac:: NVIC :: unmask ( pac:: Interrupt :: DMA1_STR1 ) ;
156
+ }
155
157
156
158
dma1_str1. start ( |_sai1_rb| {
157
159
sai1. enable_dma ( SaiChannel :: ChannelB ) ;
@@ -162,19 +164,20 @@ fn main() -> ! {
162
164
163
165
// wait until sai1's fifo starts to receive data
164
166
info ! ( "sai1 fifo waiting to receive data" ) ;
165
- while sai1_rb. cha . sr . read ( ) . flvl ( ) . is_empty ( ) { }
167
+ while sai1_rb. cha . sr . read ( ) . flvl ( ) . is_empty ( ) { }
166
168
info ! ( "audio started" ) ;
167
169
168
170
sai1. enable ( ) ;
169
171
} ) ;
170
172
171
-
172
173
// - dma1 stream 1 interrupt handler --------------------------------------
173
174
174
- type TransferDma1Str1 = dma:: Transfer < dma:: dma:: Stream1 < stm32:: DMA1 > ,
175
- stm32:: SAI1 ,
176
- dma:: PeripheralToMemory ,
177
- & ' static mut [ u32 ; 128 ] > ;
175
+ type TransferDma1Str1 = dma:: Transfer <
176
+ dma:: dma:: Stream1 < stm32:: DMA1 > ,
177
+ stm32:: SAI1 ,
178
+ dma:: PeripheralToMemory ,
179
+ & ' static mut [ u32 ; 128 ] ,
180
+ > ;
178
181
179
182
static mut TRANSFER_DMA1_STR1 : Option < TransferDma1Str1 > = None ;
180
183
unsafe {
@@ -183,8 +186,10 @@ fn main() -> ! {
183
186
184
187
#[ interrupt]
185
188
fn DMA1_STR1 ( ) {
186
- let tx_buffer: & ' static mut [ u32 ; DMA_BUFFER_LENGTH ] = unsafe { & mut TX_BUFFER } ;
187
- let rx_buffer: & ' static mut [ u32 ; DMA_BUFFER_LENGTH ] = unsafe { & mut RX_BUFFER } ;
189
+ let tx_buffer: & ' static mut [ u32 ; DMA_BUFFER_LENGTH ] =
190
+ unsafe { & mut TX_BUFFER } ;
191
+ let rx_buffer: & ' static mut [ u32 ; DMA_BUFFER_LENGTH ] =
192
+ unsafe { & mut RX_BUFFER } ;
188
193
189
194
let stereo_block_length = tx_buffer. len ( ) / 2 ;
190
195
@@ -215,7 +220,6 @@ fn main() -> ! {
215
220
}
216
221
}
217
222
218
-
219
223
// - main loop ------------------------------------------------------------
220
224
221
225
loop {
0 commit comments