A mi C con ASM inline no me gusta, es preferible realizarlo aparte en un archivo a mi parecer. si queres portarlo a otro micro y queres "probarlo" solo le presentas la version en C y ya esta funcionando. en cambio con inline no y deberias cambiar mas cosas, a no ser que el codigo sea simple... Y por ejemplo solo use Thumb-16
si queres algo por donde empezar.... pues mirá, estoy armando el esqueleto de lo que será el firm del cartel RGB y hasta ahora he creado este código:
Eso es un SPI, para mi deberias hacerlo por SPI (hasta aprovechar un QSPI o 2), tu "latch" seria el CS, seguro que podes mantener el CS hasta el ultimo dato enviado. Es decir enviar multiple bytes y luego recien ahi que se levante el CS. Y por hardware. Pero voy a intentar hacerlo. Indicame el micro que estas trabajando por que seguro que tengo que buscar los registros y esas cosas. Ya que por ejemplo vi que algunos poseen un registro especial para poner una salida a 1, mientras que otros usan la misma direccion para el encode.
PD: Estuve viendo y es un dolor de cabeza GCC sin optimizaciones

Y me esta siendo un dolor de cabeza acostumbrarme a ese ASM

Una cosa mas. Al comienzo es ponerle una constante, o tenes pensado hacer una funcion? si es asi pone como es la funcion. Ya que veo que estas enviando Rojo,Verde y Azul al 100%, todo terminaria en una constante e.e
MCH = 0x0000.0148
MCL = 0000 0bbb bbbb bggg gggg grrr rrrr r010
Estoy en lo correcto? Y b/r/g van a cambiar ? Y van a ser pasados por alguna funcion?
Que micro estamos hablando? Cortex-M3 ? M0+ ?
Da lo mismo llamar una función como la esta definiendo el maestro Killer a tener el ASM embebido en la función en c?
En el caso que no sea lo mismo, como se definiria?
En tu caso creaste una funcion, lo cual seria lo correcto. Pero no un Inline "bruto", en medio de la funcion, nuevamente prefiero tener separado lo que es ASM y C, no me gustaria que esten juntos.
Creo, realmente CREO, por que no estoy seguro, que esta es la funcion en puro Assembler
.syntax unified @Permite el uso de Thumb y Thumb2
.thumb @ Thumb
.text @ Codigo
.global _nrf_delay_us
_nrf_delay_us:
@ Primer valor pasado por la funcion esta en R0
SUBS r0, #1 @ R0 = R0-1, Actualizo las flag SUB{S} , Si es 0 es lo mismo que esperar 2^32
NOP @ Thumb instruccion, por ser un inmmediato de 3 bits tiene un encode de 16bits
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
BNE.N _nrf_delay_us @ forzado 16bits, Salta si Z=0
BX LR @ Return , PC <- LR
.end
Si tenes para probarlo genial

, asi vemos si funciona o no xD, en C solo quedaria como:
extern void nrf_delay_us(uint32_t number_of_us);
El codigo creo que funciona. Al menos procedi a ensamblarlo y hice un dump del object, el cual me dio el codigo correctamente como lo puse.