67
67
/// dac = DAC(1)
68
68
/// dac.write_timed(buf, 400 * len(buf), mode=DAC.CIRCULAR)
69
69
70
- #if MICROPY_HW_ENABLE_DAC
70
+ #if defined( MICROPY_HW_ENABLE_DAC ) && MICROPY_HW_ENABLE_DAC
71
71
72
72
STATIC DAC_HandleTypeDef DAC_Handle ;
73
73
@@ -139,7 +139,7 @@ typedef enum {
139
139
typedef struct _pyb_dac_obj_t {
140
140
mp_obj_base_t base ;
141
141
uint32_t dac_channel ; // DAC_CHANNEL_1 or DAC_CHANNEL_2
142
- DMA_Stream_TypeDef * dma_stream ; // DMA1_Stream5 or DMA1_Stream6
142
+ const dma_descr_t * tx_dma_descr ;
143
143
uint16_t pin ; // GPIO_PIN_4 or GPIO_PIN_5
144
144
uint8_t bits ; // 8 or 12
145
145
uint8_t state ;
@@ -162,7 +162,13 @@ STATIC mp_obj_t pyb_dac_init_helper(pyb_dac_obj_t *self, mp_uint_t n_args, const
162
162
HAL_GPIO_Init (GPIOA , & GPIO_InitStructure );
163
163
164
164
// DAC peripheral clock
165
+ #if defined(MCU_SERIES_F4 ) || defined(MCU_SERIES_F7 )
165
166
__DAC_CLK_ENABLE ();
167
+ #elif defined(MCU_SERIES_L4 )
168
+ __HAL_RCC_DAC1_CLK_ENABLE ();
169
+ #else
170
+ #error Unsupported Processor
171
+ #endif
166
172
167
173
// stop anything already going on
168
174
HAL_DAC_Stop (& DAC_Handle , self -> dac_channel );
@@ -217,11 +223,11 @@ STATIC mp_obj_t pyb_dac_make_new(const mp_obj_type_t *type, mp_uint_t n_args, mp
217
223
if (dac_id == 1 ) {
218
224
dac -> pin = GPIO_PIN_4 ;
219
225
dac -> dac_channel = DAC_CHANNEL_1 ;
220
- dac -> dma_stream = DMA_STREAM_DAC1 ;
226
+ dac -> tx_dma_descr = & dma_DAC_1_TX ;
221
227
} else if (dac_id == 2 ) {
222
228
dac -> pin = GPIO_PIN_5 ;
223
229
dac -> dac_channel = DAC_CHANNEL_2 ;
224
- dac -> dma_stream = DMA_STREAM_DAC2 ;
230
+ dac -> tx_dma_descr = & dma_DAC_2_TX ;
225
231
} else {
226
232
nlr_raise (mp_obj_new_exception_msg_varg (& mp_type_ValueError , "DAC %d does not exist" , dac_id ));
227
233
}
@@ -371,9 +377,12 @@ mp_obj_t pyb_dac_write_timed(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_
371
377
372
378
__DMA1_CLK_ENABLE ();
373
379
380
+ DMA_HandleTypeDef DMA_Handle ;
381
+ /* Get currently configured dma */
382
+ dma_init_handle (& DMA_Handle , self -> tx_dma_descr , (void * )NULL );
374
383
/*
375
- DMA_Cmd(self->dma_stream , DISABLE);
376
- while (DMA_GetCmdStatus(self->dma_stream ) != DISABLE) {
384
+ DMA_Cmd(DMA_Handle->Instance , DISABLE);
385
+ while (DMA_GetCmdStatus(DMA_Handle->Instance ) != DISABLE) {
377
386
}
378
387
379
388
DAC_Cmd(self->dac_channel, DISABLE);
@@ -389,18 +398,10 @@ mp_obj_t pyb_dac_write_timed(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_
389
398
DAC_Init(self->dac_channel, &DAC_InitStructure);
390
399
*/
391
400
392
- // DMA1_Stream[67] channel7 configuration
393
- DMA_HandleTypeDef DMA_Handle ;
394
- DMA_Handle .Instance = self -> dma_stream ;
395
-
396
401
// Need to deinit DMA first
397
402
DMA_Handle .State = HAL_DMA_STATE_READY ;
398
403
HAL_DMA_DeInit (& DMA_Handle );
399
404
400
- DMA_Handle .Init .Channel = DMA_CHANNEL_DAC1 ; // DAC1 & DAC2 both use the same channel
401
- DMA_Handle .Init .Direction = DMA_MEMORY_TO_PERIPH ;
402
- DMA_Handle .Init .PeriphInc = DMA_PINC_DISABLE ;
403
- DMA_Handle .Init .MemInc = DMA_MINC_ENABLE ;
404
405
if (self -> bits == 8 ) {
405
406
DMA_Handle .Init .PeriphDataAlignment = DMA_PDATAALIGN_BYTE ;
406
407
DMA_Handle .Init .MemDataAlignment = DMA_MDATAALIGN_BYTE ;
@@ -409,11 +410,6 @@ mp_obj_t pyb_dac_write_timed(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_
409
410
DMA_Handle .Init .MemDataAlignment = DMA_MDATAALIGN_HALFWORD ;
410
411
}
411
412
DMA_Handle .Init .Mode = args [2 ].u_int ;
412
- DMA_Handle .Init .Priority = DMA_PRIORITY_HIGH ;
413
- DMA_Handle .Init .FIFOMode = DMA_FIFOMODE_DISABLE ;
414
- DMA_Handle .Init .FIFOThreshold = DMA_FIFO_THRESHOLD_HALFFULL ;
415
- DMA_Handle .Init .MemBurst = DMA_MBURST_SINGLE ;
416
- DMA_Handle .Init .PeriphBurst = DMA_PBURST_SINGLE ;
417
413
HAL_DMA_Init (& DMA_Handle );
418
414
419
415
if (self -> dac_channel == DAC_CHANNEL_1 ) {
@@ -444,8 +440,8 @@ mp_obj_t pyb_dac_write_timed(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_
444
440
445
441
/*
446
442
// enable DMA stream
447
- DMA_Cmd(self->dma_stream , ENABLE);
448
- while (DMA_GetCmdStatus(self->dma_stream ) == DISABLE) {
443
+ DMA_Cmd(DMA_Handle->Instance , ENABLE);
444
+ while (DMA_GetCmdStatus(DMA_Handle->Instance ) == DISABLE) {
449
445
}
450
446
451
447
// enable DAC channel
0 commit comments