Embedded Systems Fundamentals with Arm Cortex-M based Microcontrollers: A Practical Approach