"0x40004000" es un entero hexadecimal. Presumiblemente, el número entero es una dirección de memoria de alguna documentación específica de la CPU
"volatile unsigned long *" es una descripción de un tipo. Específicamente, el tipo que describe es un puntero volátil (los punteros volátiles deshabilitan ciertas optimizaciones que serían inapropiadas para un acceso de hardware como este) a un largo sin firmar.
"el valor (tipo)" en C es un encasillado.
Así que "(volatile unsigned long *) 0x40004000" toma 0x40004000 y lo convierte en un volatile unsigned long *.
El * cerca del principio le dice al compilador que elimine la referencia al puntero. Eso es para acceder a lo que sea en la ubicación señalada por el puntero.
Finalmente, los corchetes externos son para asegurarse de que todo en la macro permanezca agrupado si se usa como parte de una operación más grande.
Entonces, al juntarlo todo cuando usamos su macro en una expresión, le pedimos al compilador que lea / escriba la dirección de memoria 0x40004000 como un valor largo sin firmar (probablemente un valor de 32 bits sin signo)