El incremento del puntero viene dado siempre según el tamaño de la variable a la que apunta.
en este caso, por ejemplo, hacer ptrMR++; incrementa el puntero en 4 bytes, por ser declarado como puntero a un uint32_t.
Un reemplazo del switch podría ser:
if (canal > 0 && canal < 7)
{
uint32_t* ptrMR = (uint32_t*) 0x40018018;
*(ptrMR + canal + (canal>>2) * 6) = on_time;
}
Saludos.