QUOTE (Jenya7 @ Mar 27 2018, 11:23)

а что в нем не так? на будущее. чтобы знать.
Поехали по буквам:
CODE
uint32_t spixbase = 0x00;
1)Придуманный специально для этого uintptr_t? Не, не слышали.
CODE
spixbase = (uint32_t)SPIx;
spixbase += 0x0C;
2)Магические числа. Ну хоть стандартный макрос offsetof() можно было использовать вместо магичесого числа? Не, не слышали.
3)Почему не смогли взять сразу адрес SPIx->DR? Адресная арифметика, которую компилятор делает лучше криворукого программиста, тут делается вручную.
4)Переменная называется spix
base, хотя хранит совсем не base.
CODE
*(__IO uint8_t *) spixbase = Data;
Ну наконец-то! Полэкрана кода ради одного-единственного явного приведения типа.
А что мешало вместо всего этого "шедевра" написать один макрос
CODE
#define SPI_SendData8(SPIx, data) *(__IO uint8_t *)&SPIx->DR = data