This 12-Bit Dual Output Dma powered Timer cotrolled Waveform Generator program ( TCWG ) is the long promised Dma variant of the already published
Mini-DDS pure Software version. As an AVR assembler disciple, It took me quite a while to come to terms with the whole notion of understanding how the seemingly
complex ARM Stm32 F4 Dma Direct Memory Access peripheral actually works. First things first, hats off to Denis, whose well worked examples of Stm32 F1Dma apps
helped me to grasp some of the basics of what lies behind their practical use :-) And a further acknowledgement to Denis ; thanks for this short Basicprogram here,
which can be used to pre-calculate the SineWave values for the 12-Bit Lookup table: The SineWave values are then moved from Flash into Ram whenever a Sinewave
must be output. The TCWG uses the basic programmable timer, (Timer_6), to trigger the Dac1, which in turn "clocks" the 256 * 32-Bit Ram array and sends the contents
out to the Dac. So the Cpu must only correctly initialise the needed peripherals and then finally enable the Dma and that's that! The Cpu then goes to sleep until it's
awoken from its slumber by the next keypress of the onboard Blue-button. What an amazing thing the Stm32 Dma is and what a difference it makes in comparison to
the good ol AVR, where almost everything had to be done in software :-( To further reduce power consumption in Sleep mode the peripheral clocks can also be
disabled just prior to executing the WFI instruction.
[ For N = 0 to 255
S= Abs ( 2048 + ( 2047 * ( Sin ( N * Pi * 2 / 256 ) ) ) )
Next N ]
The other waveforms are, so to say, calculated on the fly and are also stored into Ram, The Dma1 then fetches the stored data array in Ram @ 0x20000000 and
dumps the 32-bit values into the Dac peripheral register @ DAC_DHR12RD. Timer_6 is used to trigger the Dma and consulting the Dma request map, we can see that
Dac1 is connected to the Dma using Channel_7 and Stream_5. All very straight forward and logical, but it took me ages to wade through all the documentation in
order to make sense of things. Patience and the grace and favour of the Gods are what's needed when working with the Stm F4 and sometimes an awful lot of luck!
SquareWave @ 41,016Hz
Triangle Wave @ 41,016 Hz
Sawtooth Wave @ 41,016 Hz
Sine Wave @ 41,016 Hz
Some Waveform Parameters of the above signals
Operating the device is really quiet simple. On power up the default Green led lights up and we can see a nice Sinewave on the scope. Depress and release the
User-push button once and we can now see the Orange led coming on and the waveform changes to a SawToothWave. Hit the button again, and this time we can
observe both the Red led and a TriangleWave to boot. With the next button sequence it's a Blue led in conjunction with a SquareWave. And the whole process loops
back again to Green / SineWave with the next button operation! The formula for calculating the Dma Update Event frequency is given in the Stm AN4013 Application
note, where on page 7 it reads as follows .....[ Dma Update Event = APB1 Clock / ( ( ( PreScaler + 1 ) * ( AutoReload + 1 ) ) * Counter ) ]. The Maximum allowed
frequency of the low-speed APB1 domain is 42 Mhz. I've found out through a wee bit of empirical research, that the formula was not giving the correct values,
when measured with an accurate digital frequency meter, so I lashed together a simple DmaDac.exe gui program to do the boring calculations for us :-) One simply
enters the desired frequency between 2.504 and 41,016 Hz in decimal and the required Auto-Reload value is output in hexadecimal format. As always it's the case, that
garbage in garbage out remains the watchword ;-) This small program is to be found in the dowloaded Zip file.
Enter Frequency Valid Result
" Supposin, supposin three men were frozen. Two died. How many were left ? " Anonymous.