Я так: UART4->CR1 = 1 * USART_CR1_UE //Enable UART4 module
| 0 * USART_CR1_M //8-bit mode, one stop bit
| 0 * USART_CR1_WAKE //Default, Wake up on idle line (irrelevant)
| 0 * USART_CR1_PCE //Disable parity transmission and control
| 0 * USART_CR1_PS //Even parity (not used)
| 0 * USART_CR1_PEIE //Don't enable parity error interrupt
| 0 * USART_CR1_TXEIE //Don't enable transmission buffer free interrupt yet
| 0 * USART_CR1_TCIE //Don't enable transmission complete interrupt yet
| 0 * USART_CR1_RXNEIE //Inhibit Rx data ready interrupt
| 0 * USART_CR1_IDLEIE //Inhibit idle status interrupt
| 0 * USART_CR1_TE //Don't enable the transmitter yet
| 0 * USART_CR1_RE //Don't enable the receiver yet
| 0 * USART_CR1_RWU //Receiver wakeup mode is active (irrelevant)
| 0 * USART_CR1_SBK; //Don't transmit a break character
Бывает, что нужно в тексте программы потом поменять сразу несколько битовых полей одного регистра. Если делать это как, к примеру, в HAL STM, получается несколько обращений. И приходится или составлять такие многоэтажные конструкции из битовых И и масок или значений со сдвигами. Вот, думаю, а если заполнять биты в виде структуры, используя compound literal. Внутри функций можно переменными данными. По идее, он сначала скомпонуется, потом запишется в регистр за раз. Верно ведь?
Если бы поддержка этих литералов была внедрена шире и раньше, возможно, LL и HAL были бы построены на них, то можно было бы избежать нескольких разных обращений к разным битовым полям одного регистра, если в этом нет необходимости. Или я где-то ошибаюсь?