Для первого вопроса, который вы зададите, может быть что-то подобное: ( НЕ ИСПЫТАНО: поскольку у меня нет определений макросов или более подробной информации о том, что вам нужно, я могу только догадываться )
CAN1->MCR = ( CAN1->MCR & (~(CAN1_MCR_DBF | CAN1_MCR_RESET)) ) | CAN1_MCR_DBF;
Это не очень хороший код, его трудно читать, но преимущество в том, что в регистре есть только одна операция чтения-изменения-записи.
Отложенная читаемость кода, помните, чтов некоторых случаях лучше модифицировать два бита в двух отдельных операциях. В данном случае я не знаю, только таблица данных продукта может сказать вам, если есть какие-то ограничения на биты, установленные / сброшенные (AFAIK, по крайней мере, нет регистра CAN_MCR на STM32H7 по крайней мере).
О вашем втором вопросеЯ предполагаю, что у вас отсутствуют определения битовых полей регистров в STM32, поэтому я предполагаю, что вы используете заголовочные файлы STMicro HAL?
Есть несколько способов обработки регистров, но, насколько мне известно, заголовочные файлы из STMicro не используют битовые полятак что вы, вероятно, не сможете сделать что-то вроде if(CAN1_MCR.B1==1){}
.
Если вы хотите использовать битовые поля, вы можете переопределить регистры STM32.