Цитата(scifi @ May 21 2014, 12:06)

Если хочется максимально быстро и именно процессором, то без ассемблера не получится.
Всё прекрасно получается и без ассемблера.
Код
static __inline volatile uint32_t* bb_bit_address(volatile uint32_t* p, uint_fast8_t bit)
{
return (
(volatile uint32_t*) (
(((uint32_t)p & 0xf0000000UL) | 0x02000000UL)
+ ((((uint32_t)p & 0x000fffffUL)<<5) | (bit<<2))
)
);
}
#define _PIN_BITBAND_RD_PTR(XPORT, XPIN, ...) bb_bit_address(&GPIO##XPORT->IDR, XPIN)
#define _PIN_BITBAND_WR_PTR(XPORT, XPIN, ...) bb_bit_address(&GPIO##XPORT->ODR, XPIN)
#define _PIN_TOGGLE(XPORT, XPIN, ...) do {*_PIN_BITBAND_WR_PTR(XPORT, XPIN) = ~*_PIN_BITBAND_RD_PTR(XPORT, XPIN);} while (0)
#define pin_toggle(PIN) _PIN_TOGGLE(PIN)
И далее в программе:
Код
#define PIN_LED_RED B,9,H,OUTPUT_PUSH_PULL,SPEED_10MHZ // можно и 50MHZ, но не особо нужно...
pin_init(PIN_LED_RED);
for(;;)
pin_toggle(PIN_LED_RED);