Siendo evidente la importancia que tiene ARM en el mundo de la electrónica, a la hora de trabajar con estos dispositivos se  presentan distintas opciones para encarar su programación. 
Por ejemplo imaginemos que estamos trabajando con un Cortex M4, en C (32 bits)
tenemos dos caminos, podemos usar las librerías clásicas de periféricos (LL) o la nueva biblioteca HAL(Capa de Abstracción de Hardware).
La diferencia entre ambos enfoques es grande, las librerías en bajo nivel para periféricos son especializadas para cada microcontrolador, contienen las definiciones de registros y bits de control del microcontrolador
y un conjunto de funciones destinadas a completar las estructuras que finalmente configuran al periférico.
El programador y la electrónica están muy vinculados y es normal trabajar con la hoja de datos del microcontrolador para tener certeza de lo
que estamos haciendo con los registros de la CPU.
Todo esto ofrece una gran optimización de código pero una menor portabilidad y un gran trabajo del programador lo que implica mayor tiempo para el desarrollo de una aplicación.

Por otro lado tenemos HAL, una programación en un nivel mas alto, ofrece una portabilidad mayor entre dispositivos, oculta la complejidad de la electrónica y el trabajo se hace mas rápido, sobre todo si se usa software que generan el código de forma automática según los recursos de hardware que se necesiten, es el caso de CubeMX para STM, con el se pueden configurar pines, periféricos, interrupciones y prácticamente todo el funcionamiento del microcontrolador generando de forma automática el proyecto completo pudiendo incluso elegir el compilador con el cual se va a trabajar dejando al programador solo la responsabilidad de escribir el código que hace referencia a la solución específica que se está implementando.
Por ejemplo con CubeMX ya no hay que preocuparnos si hemos configurado correctamente los canales DMA para funcionar con los conversores A/D, el software lo hace por nosotros y solo tenemos que ocuparnos de los propios datos obtenidos.
También podemos combinar LL y HAL, y hacer una programación mixta, esto es muy útil cuando tenemos drivers que fueron escritos usando LL y los queremos seguir usando por su buen desempeño.
En lo personal y como programador que inicio su camino con los viejos 68HC05 y 68HC11 de Motorola, no puedo negar que me siento mas identificado con la LL que con HAL sin embargo hay una realidad y es el tiempo que invertimos en el diseño de un sistema electrónico y está claro que software como CubeMX logran que los tiempos se acorten drásticamente escribiendo gran parte del código de manera automática.

Siempre habrá opiniones encontradas respecto de LL y HAL pero está claro que hay una diferencia entre diseñar un sistema como hobby donde el tiempo no es algo que urge, a tener que sacar un producto al mercado rápidamente para estar un paso adelante de la competencia y es ahí donde el tiempo invertido juega un papel importante.
Otro punto a considerar es que las empresas están centrando sus esfuerzos y atención en HAL a medida que la complejidad de los nuevos dispositivos crece logrando de esta forma separar al programador del complejo hardware y al mismo tiempo sumar compatibilidad entre distint
as arquitecturas.

Y en el caso de Cortex que pasa con CMSIS?

Bueno CMSIS es un estándar de ARM para todos los núcleos Cortex sin importar la marca del fabricante del chip.
CMSIS es básicamente una colección de definiciones
para registros y bits comunes a todos los núcleos Cortex y está disponible para todo el mudo, dependerá de cada fabricante, si así lo cree conveniente, desarrollar una capa HAL para una familia de microcontroladores y nada impide que utilice las macros de CMSIS para las definiciones del hardware de la misma forma como lo hace CubeMX.

OK, pero entonces si cada fabricante desarrolla su capa HAL son compatibles entre si?
La respuesta es no, la portabilidad no será entre fabricantes de chip
s, será entre los distintos chips de un mismo fabricante cosa que es bastante complicada de lograr usando las bibliotecas clásicas de periféricos.
Sin embargo lo que si es común a todos los fabricantes es CMSIS, ya sea que programe usando LL o HAL si usa CMSIS tendrá un punto a favor para lograr la compatibilidad entre los distintos fabricantes de electrónica :).