QUERY · ISSUE
dac.write_timed() does not work with NUCLEO_G474RE
bugport-stm32
The example code from micropython document does not work with NUCLEO_G474RE.
import math
from array import array
from pyb import DAC
# create a buffer containing a sine-wave, using half-word samples
buf = array('H', 2048 + int(2047 * math.sin(2 * math.pi * i / 128)) for i in range(128))
# output the sine-wave at 400Hz
dac = DAC(1, bits=12)
dac.write_timed(buf, 400 * len(buf), mode=DAC.CIRCULAR)
The DAC1 output of PA4 pin (A2 pin on arduino connector) shows no waveform.
After a little research, I found the root cause is that DMA_PDATAALIGN_WORD should be used for the "DMA + DAC" operation of STM32G4 cpu.
Here is my modification of dac.c to make dac.write_timed() work with NUCLEO_G474RE.
STATIC void dac_start_dma(uint32_t dac_channel, const dma_descr_t *dma_descr, uint32_t dma_mode, uint32_t bit_size, uint32_t dac_align, size_t len, void *buf) {
uint32_t dma_align;
if (bit_size == 8) {
dma_align = DMA_MDATAALIGN_BYTE | DMA_PDATAALIGN_BYTE;
} else {
#if defined(STM32G4)
dma_align = DMA_MDATAALIGN_HALFWORD | DMA_PDATAALIGN_WORD;
#else
dma_align = DMA_MDATAALIGN_HALFWORD | DMA_PDATAALIGN_HALFWORD;
#endif
}
CANDIDATE · ISSUE
dac1 and dac2 channels interfere with each other
ports
Have found an issue with the dac module:
- If I setup dac(1) with a sinewave at 6khz without doing anything to dac(2), output is just fine.
- If I have dac(1) outputting on the pin then try and display a 63khz triangle on dac(2), the triangle displays but kills dac(1)
... dac(1) sits at some dc level. - Even with the same frequency used for both calls to dac.write_timed(), I still have the issue.
Code used to test was:
#6.3khz Sine wave
buf = bytearray(1000)
dac1 = DAC(1)
dac1.write_timed(buf, 6300 * 1000, mode=DAC.CIRCULAR)
Triangle wave 63Khz by default.
buf2 = bytearray(100)
dac2 = DAC(2)
dac2.write_timed(buf2, 63000 * 100, mode=DAC.CIRCULAR)
I have not included the code that fills in the buffers.