Explain please this define
define has two practices it can be used to define a constant:

#define PI (3.14)


or it can be used to define macros(somehow look like functions) and it's inlined directly into the code, so there isn't any function call overhead as in :

#define MAX(a, b) ((a) &gt; (b) ? (a) : (b))


in this case, 

#define POKE(addr, val) (*(volatile unsigned int *)(addr) = (val))


is a macro(like a function) to store val into the address addr by using the concept of pointers 

https://en.wikipedia.org/wiki/Pointer_(computer_programming)