STM32 HAL CAN не обновляет значение и вылетает при установке ExtId

Я запускаю свою первую тестовую программу CAN, используя STM32CubeMX, STM32F103C8T6 и Eclipse.

Я использовал настройки CAN по умолчанию в STM32CubeMX (также пробовал петлю, но результаты одинаковы).

То, что я вижу (см. рисунок ниже), это две вещи, которые я не понимаю;

  • На картинке ниже вы можете видеть, что я превысил строку с hcan.pTxMsg->StdId = 0x321 (левый красный овал), но текущее значение показывает 536891392 (правый красный овал).
  • Когда я выполняю следующую строку (зеленую): hcan.pTxMsg->ExtId = 0x01, я получаю прерывание по жесткой ошибке:

    /**

    • @brief Эта функция обрабатывает прерывание по аппаратному сбою. / void HardFault_Handler(void) { / НАЧАЛО КОДА ПОЛЬЗОВАТЕЛЯ HardFault_IRQn 0 */

      /* КОД ПОЛЬЗОВАТЕЛЯ КОНЕЦ HardFault_IRQn 0 / while (1) { } / КОД ПОЛЬЗОВАТЕЛЯ НАЧАЛО HardFault_IRQn 1 */

      /* КОД ПОЛЬЗОВАТЕЛЯ END HardFault_IRQn 1 */ }

Почему значение не обновляется и почему я получаю аппаратную ошибку (указатель hcan.pTxMsg не равен NULL, поскольку он даже отображает поле StdId (он даже может отображать ExtId со значением 134222077 (не показано на рисунке ниже)?

Скриншот

Просто дикая догадка, но вы установили для hcan допустимый экземпляр (CAN1 или как там он называется в ST)? Подобные указатели сообщения. Если они указывают на мусор, может произойти нечто подобное.
@Lundin ... ты указал мне правильное направление. Для моей будущей ссылки и других я добавил это как ответ. Спасибо за ваш комментарий.

Ответы (1)

По умолчанию STM32CubeMx создает код инициализации для «can» (если выбрано). Этот код находится в MX_CAN_Init и вызывается main.

Однако он не назначает/инициализирует pRxMsg и pTxMsg.

pTxMsg должен быть определен как:

CanTxMsgTypeDef txMessage;
hcan.pTxMsg = &txMessage;

и pRxMsg как:

CanRxMsgTypeDef rxMessage;
hcan.pRxMsg = &rxMessage;