MMDVM board for STM32 Nucleo

To realize a multimode digital repeater, G4KLX has developed a very complete software called MMDVM (Multimode Digital Voice Modem). It is compatible with the main digital modes (to date, C4FM, DSTAR, DMR Tier 2 and now P25).

After my previous MMDVM interface card with an Arduino Due, this new shield realize the interface between transmitter and receiver with the STM32F446RE ST Microelectronics Nucleo board. This board has the advantage of speed up at a rate of 8 MHz (CPU frequency up to 180 MHz), and has a rather low purchase price (about 15 EUR excl. VAT). A computer (such as a Raspberry Pi for example) connect via USB to the STM32 completes the relaêater controler and hosts the second part of the MMDVMHost software.

I realized this PCB trace, like some other OM, with components of classic sizes (integrated circuits in DIL format, resistances in quarter of Watt, …). There is only the TCXO which remains rather small. To get rid of a SMD formatting component, I chose to install a TCXO HCMOS directly compatible with 3.3V. The reference chosen is FOX924B-12 with a stated stability of +/- 2.5 ppm.

The plate is inserted directly below the Nucleo STM32 board, on CN7 and CN10 connectors.

The following features have been added to the previous MMDVM interface card running with an Arduino Due:

  • Measurement of RSSI signals sent by the receiver (with validation jumper)
  • An LED signaling the life of the deck (Live Led)
  • Four LEDs indicating the active mode (DStar, DMR, YSF, P25)
  • Integrated radio interface pins between the two mini-Din connectors
  • Switching to a single mini-Din connector Transmitter / Receiver
  • Nextion touch screen LCD interface
  • Four additional mounting brackets 3mm (50.00mm x 75.56mm)

Diagram of the MMDVM board for Nucleo STM32F4 – The MMDVM filter is under CC BY / SA / NC license established by KI6ZUM

PDF Format : Diagram MMDVM shield for STM32


MMDVM shield for Nucleo STM32 (Top view – dimensions in mm)

MMDVM shield for STM32 – Rear face with ground plane, with 2 femal connectors

Here the Bill Of Materials:

Name Value Precision Mounting box
C1 10µF D4R2,54_ELKO
C2 10µF D4R2,54_ELKO
C3 10nF 10% 3X5R2,54
C4 47µF D4R2,54_ELKO
C5 47µF D4R2,54_ELKO
C6 10nF 10% 3X5R2,54
C7 10nF 10% 3X5R2,54
C8 10µF D4R2,54_ELKO
C9 47µF D4R2,54_ELKO
C10 1nF 5% 3X5R2,54
C11 1µF D4R2,54_ELKO
C12 470pF 3X5R2,54
C13 39nF 5% 3X8R5,08
C14 10nF 10% 3X5R2,54
C15 100nF 3X5R2,54
C16 47µF D4R2,54_ELKO
C17 39nF 5% 3X8R5,08
C18 1nF 5% 3X5R2,54
C19 100nF 3X5R2,54
C20 47µF D4R2,54_ELKO
C21 100nF 3X5R2,54
C22 22nF 3X5R2,54
C29 100nF 3X5R2,54
C-TX1 Transmitter DIN6POL-MINI
D2 LED PTT LED_3mm_rouge
D3 LED POWER LED_3mm_jaune
D4 LED DSTAR LED_3mm_vert
D5 LED DMR LED_3mm_vert
D6 LED YSF LED_3mm_vert
D7 LED P25 LED_3mm_vert
D8 LED LIVE LED_3mm_jaune
IC2 MCP6002-I/P DIL8
IC3 MCP6002-I/P DIL8
IC4 LP2950ACZ3,3 TO92
Q1 2N7000 TO92
Q3 2N7000 TO92
R1 330 0204_MET
R3 4,7K 1% 0204_MET
R4 5,1K 1% 0204_MET
R5 22K 1% 0204_MET
R7 4,7K 1% 0204_MET
R8 4,7K 1% 0204_MET
R13 10K 0204_MET
R14 330 0204_MET
R15 47K 0204_MET
R16 1M 0204_MET
R17 47K 0204_MET
R18 5,1K 1% 0204_MET
R20 220 x 8 SIL9
R21 22K 1% 0204_MET
R22 4,7K 1% 0204_MET
R23 22K 1% 0204_MET
R24 27K 0204_MET
R25 47K 0204_MET
R30 100K 0204_MET
R98 100K VISHAY_64W
R99 100K VISHAY_64W
TCXO1 12MHz (FOX924B-12) CFPX-104
J1 Radio interfaces Stiftleiste_1x07_G_2,54
J2 Nextion LCD Stiftleiste_1x04_G_2,54
JP1 Connector Sel. Stiftleiste_2x02_G_2,54
JP2 En.RSSI Stiftleiste_1x02_G_2,54
CN7, CN20 Female conn. 2×19 Stiftleiste_2x19_F_2,54

In order to make your copy of the electronic card, you will find here all the production and drilling files of the standard Gerber card : MMDVM STM32 F5UII v2 – licenced CC by-nc-sa

Here is the board mounted, tested and functional

MMDVM shield mounted under the STM32 board of ST Microelectronics

The STM32F4446RE behind the MMDVM filtering shield

In the table below, you will find the pinout to follow according to the board. Like my previous MMDVM board for Arduino uses the NTH definition.

Sur le tableau ci-dessous, vous retrouvez le brochage à suivre en fonction de la platine. Comme ma précédente platine MMDVM pour Arduino utilise la définition NTH.

Once your shield is mounted, you will probably be in a hurry to load the MMDVM firmware and set MMDVM on the STM32 interface board: MMDVM installation on a STM32F4xx board

And for tuning, I invite you to read the article dedicated to the installation of MMDVHost and the DMR mode calibration.

If you are interested to participate in a possible future new grouped order, leave your email below to be reported !

If you would be interested to participate in a possible future new grouped order (MMDVM board, SvxLink Card), leave your email below to be reported!

18 thoughts on “MMDVM board for STM32 Nucleo

  1. Hi ,

    Made the board using the Geber files .

    Seem to have a problem a soon i connect the TCXO .. i can’t program the board anymore .
    STM-32 link gives errors .. as soon i remove C22 .. it works fine to program .
    checked the TCXO with scope .. perfect 12Mhz ..



    1. Hello Tom,

      I do not understanding how it can be a link with the STM-32 programming failing, and the C22.
      I have mounted 22nF for C22, but 22pF is the normal value. If you can, have a try with 22pF.
      Actually, have you suppress C22 and put a strap for continuity of the signal ?


  2. Yes i tryed with a bridge on C22 ..
    Same problem .. it’s really weird , on the SP8NTH it’s indeed 22pf .
    Dit not try that yet .
    Werid this is . have it on 2 boards i made .
    A soon a remove C22 or the bridge .. i can program w/o problems .

    1. Adrian,

      I This MMDVM shield is yes inspired from SP8NTH schematic and will be plugged under a Nucleo STM32F446RE, but not for the Discovery version board. I do not know if this shield is existing somewhere. Sorry.


  3. Hello

    Thanks your effort. And I would like to ask a question. What is the output voltage of LP2950ACZ ? does is 3V or 3V3 ?

    As I found the Txco work on 3V3, but your circuit diagram marked the 3V only for the output of LP2950ACZ.

    Merci de votre travail. Et j’aimerais poser une question. Quelle est la tension de sortie de LP2950ACZ? Est-ce que c’est 3V ou 3V3?
    Comme j’ai trouvé le travail de Txco sur 3V3, mais votre diagramme de circuit a marqué le 3V uniquement pour la sortie de LP2950ACZ.

    1. Thank you Francis,

      The supply must be 3,3V. I installed a LP2950ACZ-3,3 , that is thecomplete reference. I will precise it above.
      Thank for remarks.

      Merci Francis,

      L’alimentation doit être de 3,3V. J’ai installé un LP2950ACZ-3,3, voilà la référence complète. Je vais le préciser ci-dessus.
      Merci pour les remarques.

    The STM32 gerber v1 included a big mistake ! The output of TCXO coming from C22 is wiring to pin 15 of CN7. It should have been connected to pin 17 CN7 !

    For those who would have realized the board based on the Gerber v1 file, you can correct this problem by opening C22 upper pin and connect it with a little wire to pin 17 of CN7 (9th row, right side of the board).

    Sorry for inconvenience.
    The Gerber v2 is correct now.


    Le STM32 gerber v1 a inclus une grosse erreur! La sortie de TCXO provenant de C22 est le câblage de la broche 15 du CN7. Il aurait dû être connecté à la broche 17 CN7!

    Pour ceux qui auraient réalisé la platine sur la base du fichier Gerber v1, vous pouvez corriger ce problème en ouvrant la broche supérieure de C22 et la connecter avec un petit fil à la pin 17 du CN7 (9ème rangée, côté droit de la carte).

    Désolé pour les inconvénients.
    Le Gerber v2 est correct maintenant.

  5. Thanks for the fix and al your efforts Christian !
    here is a picture of the mod .

    Correction STM32 v1

    Merci pour la correction et tous vos efforts, Christian!
    Voici une image de la modif.

    1. Thank you Tom for you testing. The gerber (v2) is updated as the top/bottom board images.

      Merci Tom pour les tests. Le gerber (v2) est à jour ainsi que les images de la platine.

  6. So besides the C22 pin 15 of CN7 problem. Does the C22 also unnecessary, which can be removed (short the pins together).

    Donc, outre le soucis du raccordement de C22 à la pin 15 du CN7, le C22 est-il également inutile, et être supprimé (ou broches mises ensemble).

    1. Hi Francis,

      As you want, you can remove C22 like Tom has done (see above on picture) or let C22 online. So cut the upper pin (The one positioned nearby C16) and solder a wire on this up pin to CN7/17

      Comme vous le souhaitez, vous pouvez supprimer comme Tom l’a fait (voir ci-dessus sur la photo) ou laisser C22 en ligne. Coupez alors la pate du haut (celle positionné prêt de C16) et soudez un fil sur cette patte en l’air vers le CN7 / 17

  7. Someone tried to short CN7/15 and CN7/17 ?
    If pin15 is in high impedence ( eg. output mode ) is too easy to fix !


    Quelqu’un a-t-il essayé de court circuiter CN7/15 et CN7/17 ?
    Si pin 15 est en haute impédance (en mode de sortie), cela serait trop facile à règler !

  8. I’m having problems with DMR reception into the repeater (DR1-X). Made the mod to connect TCXO pin 17 with/without 22 nF cap, but the modem will not decode DMR. Played with levels and looked ADC input with scope. All look comparible to my working Arduino Due based modem. Also tried an attenuator on the Disc output because I was seeing ADC overflow messages on DStar. No luck at all with DMR. No messages in MMDVMHost console when I TX with several different DMR HT’s.

    Receives and transmits DStar fine and transmits DMR network traffic OK. Adjusted TX deviation with Bessel null method which worked normally. The 446RE is running the latest FW and the host is also the current release. It compiled and installed without issue and is set up for a 12 MHz TCXO. The oscillator signal looks fine on the scope and is running at 12 MHz.

    Any troubleshooting tips and hints with MMDVM.ini settings appreciated. I am using RX and TX invert=1 and that seems to work with DStar, but tried various settings. Anyway to verify the STM32 is running on the external clock?


    Dave, K7DMK

    1. Well, I found the problem. It was a bad op-amp in the receive chain on the F5UII board. The bottom half of a sine wave test signal was being cut off when fed into the RX input. When I measured the bias voltage on the virtual ground voltage divider it was only about 1.1V instead of 3.3/2 or 1.65V. The bad op-amp input was pulling down the voltage instead of presenting a very high input impedance.

      Luckily I had installed IC sockets for the amps so it was a quick fix to replace the bad part.

      DMR decode is now working. Interestingly, DStar decode did not seem to be affected.

      Dave, K7DMK

      Voila, j’ai trouvé la source du problème. C’était un mauvais ampli-op installé dans la chaîne de réception sur la carte F5UII. La moitié inférieure du signal de test sinusoïdal était coupée lorsque placé dans l’entrée RX. Quand je mesure la tension de polarisation sur le diviseur virtuel de tension de masse, il n’y avait que seulement 1.1V au lieu de 3,3 / 2 ou 1.65V. La mauvaise entrée ampli-op tirant alors vers le bas la tension au lieu de présenter une impédance d’entrée très élevée.

      Heureusement, j’avais installé des supports de circuits intégrés pour les amplis de sorte qu’il était rapide de remplacer la pièce défectueuse.

      Le décodage DMR fonctionne maintenant. Fait intéressant, DStar ne semblait pas être affecté par le problème.

      Dave, K7DMK

    1. Yes, Mauro,

      The STM32F4XX_Lib directory must be put in the MMDVM directory before compiling.
      otherwise, you have this error.
      RSSIRB.cpp: In constructor 'CRSSIRB::CRSSIRB(uint16_t)':
      RSSIRB.cpp:25:8: error: 'NULL' was not declared in this scope

      Oui Mauro,

      Il faut mettre le répertoire STM32F4XX_Lib dans le répertoire MMDVM avant de compiler.
      sinon en effet, vous avez cette erreur
      RSSIRB.cpp: In constructor 'CRSSIRB::CRSSIRB(uint16_t)':
      RSSIRB.cpp:25:8: error: 'NULL' was not declared in this scope

Leave a Reply

Your email address will not be published. Required fields are marked *