ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
30 апреля
1394954 Топик полностью
Nikolay_Po (20.01.2024 20:45, просмотров: 83) ответил VladislavS. на Регистры это volatile сущности, с ними так не работает. Разве что для копии какого-нибудь регистра статуса с кучей разношерстных полей. Один раз считываем во временную переменную и уже с её полями работаем. Результат хороший, но много одноразовой кропотливой писанины. Не стоит оно того. Вот, например, пробовал для usb-шного региста.
Я так: 
	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 были бы построены на них, то можно было бы избежать нескольких разных обращений к разным битовым полям одного регистра, если в этом нет необходимости. Или я где-то ошибаюсь?