STM32 очищает и устанавливает биты - PullRequest
0 голосов
/ 03 октября 2019

Я новичок в STM32 и не могу разобраться с побитовой операцией. Например, я хочу установить регистр регулировки CAN_MCR. Мне нужно установить бит 16 этого регистра и очистить бит 15. Я знаю, что могу сделать что-то вроде этого:

CAN1-> MCR |=  CAN1_MCR_DBF;
CAN1->MCR ~= (CAN1_MCR_RESET);

Интересно, могу ли я сделать что-то вроде этого:

CAN1->MCR |= (0b10 << 15);

или

CAN1->MCR &= ~(0b10 << 15);

Так как один устанавливает бит, а другой очищает, я не знаю, какой оператор мне следует использовать?

Другой вопрос: если я хочу проверить какой-то конкретный биткакого-то регистра. Как я могу это сделать? Допустим, я хочу проверить бит 15 регистра CAN1_MCR. Как я могу это сделать? В PIC мы могли бы сделать это:

if(CAN1_MCR.B1==1){}

Как я могу сделать это в Arm? Я знаю, что это все простые вопросы, но я не смог найти для них полезных ответов.

1 Ответ

1 голос
/ 03 октября 2019

Для первого вопроса, который вы зададите, может быть что-то подобное: ( НЕ ИСПЫТАНО: поскольку у меня нет определений макросов или более подробной информации о том, что вам нужно, я могу только догадываться )

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.

...