[uquote="VladislavS",url="/forum/viewtopic.php?p=3697189#p3697189"]Нет, так не прокатит. Регистр SPI_DR чувствителен к разрядности команды записи в него. Правая часть автоматом из uint32_t во время записи командой STRH или STRB обрежется до необходимых 16 и 8 бит.[/uquote]
Там будет не обрезание, а неявное приведение типа. Что ваш, что мой код скомпилируется в одно и то же на STM32. Только это не тот случай когда нужна работа с указателями. И при переносе на BigEndian-систему можно отловить трудновыявимых граблей.
Код: Выделить всё
/**
* @brief Transmits a Data through the SPIx/I2Sx peripheral.
* @param SPIx: where x can be
* - 1, 2 or 3 in SPI mode
* - 2 or 3 in I2S mode
* @param Data : Data to be transmitted.
* @retval None
*/
void SPI_I2S_SendData(SPI_TypeDef* SPIx, uint16_t Data)
{
/* Check the parameters */
assert_param(IS_SPI_ALL_PERIPH(SPIx));
/* Write in the DR register the data to be sent */
SPIx->DR = Data;
}
2.
Сначала "убить" volatile приведением типа, а потом геройски найти решение. *КРУТОЧЁ*IAR делает 9 операций записи, GCC три. Комментарии излишни.
В данном случае себя верно ведёт GCC, т. к. данные нигде не используются и результат не нужен.
3.
обрежется до необходимых 16 и 8 бит.
Хм-м-м... Тупая документация, на помойку её.25.5
SPI and I2S registers
Refer to Section 2.1 on page 46 for a list of abbreviations used in register descriptions.
The peripheral registers can be accessed by half-words (16-bit) or words (32-bit).
слева!