Embedded 如何使用STM32F105通过CAN正确接收信息

Embedded 如何使用STM32F105通过CAN正确接收信息,embedded,stm32,can-bus,Embedded,Stm32,Can Bus,这是我第一次为微控制器编程,我想知道如何使用中断通过CAN接收消息。我初始化了micro,STM32F105,因此只允许使用0x0106和0x010A标识。 这是主要部分: /* CAN1 init function */ static void MX_CAN1_Init(void) { hcan1.Instance = CAN1; hcan1.Init.Prescaler = 4; hcan1.Init.Mode = CAN_MODE_NORMAL; hcan1.Init.SJW =

这是我第一次为微控制器编程,我想知道如何使用中断通过CAN接收消息。我初始化了micro,STM32F105,因此只允许使用0x0106和0x010A标识。 这是主要部分:

/* CAN1 init function */
static void MX_CAN1_Init(void)
{

 hcan1.Instance = CAN1;
 hcan1.Init.Prescaler = 4;
 hcan1.Init.Mode = CAN_MODE_NORMAL;
 hcan1.Init.SJW = CAN_SJW_1TQ;
 hcan1.Init.BS1 = CAN_BS1_6TQ;
 hcan1.Init.BS2 = CAN_BS2_1TQ;
 hcan1.Init.TTCM = DISABLE;
 hcan1.Init.ABOM = DISABLE;
 hcan1.Init.AWUM = DISABLE;
 hcan1.Init.NART = DISABLE;
 hcan1.Init.RFLM = DISABLE;
 hcan1.Init.TXFP = DISABLE;
 if (HAL_CAN_Init(&hcan1) != HAL_OK)
 {
   Error_Handler();
 }

}
这是中断部分:

void CAN1_RX0_IRQHandler(void)
{
 /* USER CODE BEGIN CAN1_RX0_IRQn 0 */

 /* USER CODE END CAN1_RX0_IRQn 0 */
 HAL_CAN_IRQHandler(&hcan1);
 /* USER CODE BEGIN CAN1_RX0_IRQn 1 */

 // other code here
 }

基本上,当我测试我的电路板时,中断例程似乎从未执行过。。你知道问题出在哪里吗?

阅读参考手册,扔掉STlib HAL膨胀软件,直接对寄存器进行编程。启用所有建议的编译器警告,将警告视为错误。最后,使用调试器查看代码正在执行的操作,检查寄存器等。如果这不是您想要执行的操作(可能除了HAL操作),请不要在嵌入式系统上工作(可能还有编程)。@Olaf感谢您的建议。我已经在用调试器测试发生了什么。我原以为使用STM32CubeMX生成的代码是个好主意,但事实似乎并非如此,所以我将阅读手册并直接在寄存器中写入。你能传输吗?奥拉夫对HAL的态度很暴躁。这太可怕了,圣立方是个怪物。如果您真的不想使用底层软件来设置寄存器,那么周围有一些不使用HAL的较旧库,它们也没有那么庞大,但是直接对它们进行编程确实可以帮助您很好地深入了解外围设备,并且最终获得更精简的代码。我不确定你是否初始化了中断?@swand不,我没有。。我所能看到的就是空闲状态,所以我猜这是关于寄存器的。我正在阅读文档,同时检查HAL_能接收到的代码,看看我需要的所有寄存器是否都正确初始化
void CAN1_RX0_IRQHandler(void)
{
 /* USER CODE BEGIN CAN1_RX0_IRQn 0 */

 /* USER CODE END CAN1_RX0_IRQn 0 */
 HAL_CAN_IRQHandler(&hcan1);
 /* USER CODE BEGIN CAN1_RX0_IRQn 1 */

 // other code here
 }