Glad you found part of the answer.
So I guess my real question is Why use functions when you can use use macros?
This depends on whether you wish to optimize code speed verse code size.
A function needs to be called and returned from. This produces code instruction cycle overhead (extra time) but the function is only in one place in the code.
A MACRO is a text substitution during pre-compile (pre-process) so a macro used multiple times is in the code in multiple places. It doesn't have the instruction cycle overhead of a function so executes faster but takes more code space.
Another use of Macros is to make later changes to constants easier and more readable code.
Say you have a UART and a value to set the baud rate. By using macros you can have several pre-defined baud rate values defined as the baud rate then in the UART set-up use the macro. Example:
#define Baud_9600 25
#define Baud_4800 50
So instead of:
baud_reg = 25;
you use:
baud_reg = Baud_9600;
if you later wish to change the baud rate to 4800 then you just use the macro which is human readable rather than some constant that you have to look up or re-calculate. This also makes read your code more understandable as "baud_reg = 50;" does mean much without digging out the data sheet whereas "baud_reg = Baud_4800;" is readily apparent.
The two marcos I used above does not make the code larger as the pre-processor only substitutes a macro that is used.
Does that help answer your question?