CMSIS (Cortex Microcontroller Software Interface Standard)

CMSIS is a vendor-independent set of hardware abstraction interfaces to the Cortex microcontrollers. It is beyond the scope of this document to describe CMSIS. Please do a web search for detail.


For the firmware developers, it provides a set of functions to access low-level Cortex features through a defined API without writing compiler or vendor specific code.


The function prototypes are in the header files in <install root>\SDK\Arm\. Among the files:


     core_cmInstrs.h defines API functions for accessing low level Cortex instructions such as USAT, DSB etc. They are typically implemented as inline assembly or inline functions, which are compiler specific. By defining the API, the programmers do not have to write compiler-dependent code themselves, and also allow the programs to be portable across different compilers.

     core_cm0.h, core_cm3.h etc. These files define architecture-specific API functions. For example, a set of NVIC (see below) functions to manipulate the interrupt behaviors.


There are additional files allowing access to various Cortex-M and MCU specific features.


Silicon vendors usually provide a set of library files compatible with the core CMSIS functions, typically in source form, that let you access MCU specific features. For example, ST provides the Standard Peripheral Library and the later HAL library for programming their MCU.


Normally, you do not include the CMSIS header files from ARM directly, but you do include one of the vendor-provided files, e.g. stm32f7xx.h, which includes the ARM files. One reason is that the CMSIS files may depend on a device-specific define. For example, the number of priority bits implemented is device-specific, and is defined in a device-specific file, even though its definition is used in the core_cm?.h file.

System Initialization

CMSIS defines a function SystemInit() that initializes the MCU-specific basic functions. At the minimum, it sets the MCU PLL (Phase Lock Loop) to provide a stable and fast clock for the system. This function should be called at the beginning of your main() function.


ImageCraft’s JumpStart API (JSAPI) provides an alternative to CMSIS and vendor libraries. It is a mid-level API that is highly functional and avoids some of the tedium of using a vendor-provided library, which usually is just a way to access their MCU’s I/O registers. For example, with JSAPI, you program the I2C at a functional level, instead of going into the nitty-gritty details of manipulating the low level I/O registers. JSAPI is documented separately.