A codeplug is the configuration file that defines everything about how a DMR radio behaves — channels, talkgroups, scan lists, RX groups, and various radio settings. The name is said to originate from the early days of professional radio, when configuration was stored on a physical plug-in ROM module. Today it’s a file you program via CPS (Customer Programming Software) and write to the radio over USB. Getting the codeplug right is the difference between a radio that just works and one that constantly surprises you in the wrong way.
After setting up my DMR hotspot and getting familiar with BrandMeister, I’ve been spending some time refining my codeplug for the Baofeng DM-32UV, a radio well known for it’s not so perfect software, but with this setup it feels like these bugs are not so significant. In this post I’ll share how I’ve structured things to keep the setup clean and practical — hopefully it saves someone else some time.
A Note on CPS Versions
If you’ve been struggling with the Baofeng CPS (Customer Programming Software) for the DM-32UV, you’re not alone. Versions prior to 1.60 had a bug that made it impossible to configure scan lists properly in CPS. This appears to have been fixed in version 1.60. If you’re on an older version, upgrading is well worth it.
One more gotcha: if the CPS interface shows garbled characters instead of English text, open the CPS.ini file in the installation folder and set the language parameter to EN. Simple fix, but not obvious.
My Setup
My radio operates across a mix of channel types:
VHF analog repeaters (LA5BR)
UHF analog repeaters (LA7BR)
DMR repeater (LD5BR) with various talkgroups
Personal hotspot with BrandMeister talkgroups on both time slots
The hotspot is built on a Raspberry Pi Zero 2 W running Pi-Star 4.3.7, with an MMDVM duplex hat.
On BrandMeister, I’ve configured the following static talkgroups:
TS1: TG 242 (Norway), TG 2424 (Regional)
TS2: TG 24201, TG 24202, TG 24203, TG 24204 (Chat groups)
Static talkgroups mean these are always active on the hotspot — traffic comes in without needing to key up first.
Codeplug Philosophy: Monitor Channels + Dedicated Channels
The core idea in my codeplug is a split between two types of channels:
Monitor channels (one per time slot) have a broad RX Group List covering all talkgroups I want to follow on that slot. Their TX Contact is set to TG 9 (Local) — a safe default that keeps any accidental PTT press from going out onto a busy talkgroup with wide reach. These are the channels I use for scanning and general listening.
Dedicated channels have no RX Group List at all. With Group Call Match enabled in the radio’s global settings, a channel without an RX Group List will only open squelch for the specific TX Contact talkgroup defined on that channel. When I hear something interesting on a monitor channel, I switch to the appropriate dedicated channel to reply.
This gives a clean separation: broad monitoring on two channels, precise TX on the rest.
Channel List
| No. | Name | Type | TX Contact | RX Group | Time Slot |
|---|---|---|---|---|---|
| 1 | LA5BR | Analog | — | RX TS1 | Slot 1 |
| 2 | LA7BR | Analog | — | RX TS1 | Slot 1 |
| 3 | LD5BR RX TS1 | Digital | 9 | RX TS1 | Slot 1 |
| 4 | LD5BR RX TS2 | Digital | 9 | RX TS2 | Slot 2 |
| 5 | LD5BR 242 | Digital | 242 | None | Slot 1 |
| 6 | LD5BR 2424 | Digital | 2424 | None | Slot 1 |
| 7 | LD5BR 24201 | Digital | 24201 | None | Slot 2 |
| 8 | LD5BR 24202 | Digital | 24202 | None | Slot 2 |
| 9 | LD5BR 24203 | Digital | 24203 | None | Slot 2 |
| 10 | Hotspot RX TS1 | Digital | 9 | RX TS1 | Slot 1 |
| 11 | Hotspot RX TS2 | Digital | 9 | RX TS2 | Slot 2 |
| 12 | Hotspot 91 | Digital | 91 | None | Slot 1 |
| 13 | Hotspot 92 | Digital | 92 | None | Slot 1 |
| 14 | Hotspot 242 | Digital | 242 | None | Slot 1 |
| 15 | Hotspot 2421 | Digital | 2421 | None | Slot 1 |
| 16 | Hotspot 2424 | Digital | 2424 | None | Slot 1 |
| 17 | Hotspot 2426 | Digital | 2426 | None | Slot 1 |
| 18 | Hotspot 2429 | Digital | 2429 | None | Slot 1 |
| 19 | Hotspot 24201 | Digital | 24201 | None | Slot 2 |
| 20 | Hotspot 24202 | Digital | 24202 | None | Slot 2 |
| 21 | Hotspot 24203 | Digital | 24203 | None | Slot 2 |
| 22 | Hotspot 24204 | Digital | 24204 | None | Slot 2 |
| 23 | Hotspot 242210 | Digital | 242210 | None | Slot 2 |
| 24 | Hotspot 240216 | Digital | 240216 | None | Slot 2 |
| 25 | Hotspot 242997 | Digital | 242997 | None | Slot 2 |
Scan Setup
My scan list includes the two analog repeater channels plus the two hotspot monitor channels — Hotspot RX TS1 and Hotspot RX TS2. This covers everything I want to passively monitor in one go.
A couple of settings worth noting:
CTC Scan Mode: Detection CTC — with analog repeaters using CTCSS tones in the scan list, enabling tone detection prevents noise bursts from triggering a scan stop. This has no effect on the DMR channels.
Hang Time: 3.0s — keeps the radio on an active channel long enough to react before scan resumes.
Priority Sweep Time: 500ms — seems to be a reasonable balance between scan speed and giving DMR channels enough time to decode properly.
Final Thoughts
The monitor + dedicated channel approach has made the radio much more pleasant to use. Scanning feels reliable, accidental TX goes nowhere harmful, and switching to reply on the right talkgroup is just a matter of turning the channel knob.
If you’re setting up a DM-32UV for BrandMeister use with a hotspot, hopefully this gives you a useful starting point.