Я запускаю свою первую тестовую программу CAN, используя STM32CubeMX, STM32F103C8T6 и Eclipse.
Я использовал настройки CAN по умолчанию в STM32CubeMX (также пробовал петлю, но результаты одинаковы).
То, что я вижу (см. рисунок ниже), это две вещи, которые я не понимаю;
Когда я выполняю следующую строку (зеленую): 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 (не показано на рисунке ниже)?
По умолчанию STM32CubeMx создает код инициализации для «can» (если выбрано). Этот код находится в MX_CAN_Init и вызывается main.
Однако он не назначает/инициализирует pRxMsg и pTxMsg.
pTxMsg должен быть определен как:
CanTxMsgTypeDef txMessage;
hcan.pTxMsg = &txMessage;
и pRxMsg как:
CanRxMsgTypeDef rxMessage;
hcan.pRxMsg = &rxMessage;
Лундин
Мишель Кейзерс