Требуется модифицировать эти значения при поступлении команды извне
(GSM, GPRS, LTE, SMS) Как написано:
[Рабочие режимы bxCAN]
У bxCAN есть 3 основных рабочих режима: initialization (инициализация), normal (активная работа) и Sleep (сон, приостановка). После аппаратного сброса bxCAN находится в режиме Sleep, чтобы снизить потребление энергии, и на CANTX активен внутренний pull-up (верхний подтягивающий резистор). Программа запрашивает bxCAN на вход в режим initialization или Sleep установкой бит INRQ или SLEEP в регистре CAN_MCR. Как только произошел вход в режим, bxCAN подтверждает это установкой бит INAK или SLAK в регистре CAN_MSR, и внутренний pull-up запрещается. Когда ни один из бит INAK и SLAK не установлен, bxCAN находится в режиме normal. Перед входом в режим normal bxCAN всегда должен быть синхронизирован с шиной CAN. Для синхронизации bxCAN ждет, пока шина CAN не освободится (перейдет в состояние idle), это означает, что отслеживается появление 11 следующих друг за другом рецессивных бита на сигнале CANRX.
Режим инициализации. Программная инициализация может быть осуществлена, когда железо CAN находится в режиме инициализации (Initialization mode). Чтобы войти в этот режим, программа устанавливает бит INRQ в регистре CAN_MCR и ждет, пока железо подтвердит этот запрос установкой бита INAK в регистре статуса CAN_MSR.
Чтобы покинуть режим инициализации, программа очищает бит INQR. bxCAN покинет режим инициализации, когда бит INAK очистится аппаратурой.
Во время режима инициализации останавливаются все входящие и исходящие транзакции сообщений CAN, и статус шины CAN на выходе CANTX сохраняется рецессивным (лог. 1).
Вход в режим инициализации не меняет ни один регистр конфигурации.
Чтобы инициализировать контроллер CAN, программа должна установить длительность бита (Bit Timing, регистр CAN_BTR) и опции CAN (регистр управления CAN_MCR).
Чтобы инициализировать регистры, связанные с банками фильтров CAN (mode, scale, FIFO assignment, activation и значения фильтраand filter values), программа должна установить бит FINIT (в регистре CAN_FMR). Инициализация фильтра также может быть осуществлена вне режима инициализации.
Примечание: когда FINIT=1, прием CAN деактивирован. Значения фильтра также можно модифицировать сбросом соответствующих бит активации (в регистре CAN_FA1R). Если банк фильтра не используется, то рекомендуется оставить его в неактивном режиме (т. е. оставить его соответствующий бит FACTx очищенным).
- не работает - убился в вариантах и комбинациях. Суть: если прописать численно фильтры в
void MX_CAN1_Init (void)
{
...
}
То всё замечательно фильтруется,
но если то же самое посимвольно поместить в юзер-функцию.... То фильтры, именно значения (маски-сказки-раскраски) обнуляются)
Не помогает ни предваряющий
HAL_CAN_DeInit(&hcan1);
ни
hcan1Filter.FilterActivation = DISABLE;
Другие источники пишут - Вроде бы должно работать при соблюдении описанных условий. Все флаги-биты проверил - в Хале всё строго. Например;
/* Request initialisation */
SET_BIT(hcan->Instance->MCR, CAN_MCR_INRQ);
Живьём - всё прёт на прием, как при 0х0000 в фильтрах;
Что поражает, я ранее реализовал изменение битрэйта, буквально вытащив их библии Хала:
hcan->Init.Prescaler = prescaler;
WRITE_REG(hcan->Instance->BTR, (uint32_t)(hcan->Init.Mode | hcan->Init.SyncJumpWidth |hcan->Init.TimeSeg1 | hcan->Init.TimeSeg2 | hcan->Init.Prescaler - 1U)));
А вот в фильтрах такой фишки WRITE_REG() нет.
Впрочем и в прочем, извините, не в каникулы же!
С Новым! :-)