简体   繁体   English

STM32从CAN总线唤醒

[英]STM32 wakeup from CAN bus

I am trying to wake up the CPU from the CAN bus but it fails.我试图从 CAN 总线唤醒 CPU,但失败了。 Data from the bus processor receive but does not wake it up, for example, an interrupt from GPIO wakes it up and then it responds to the last 3 data from CAN Bus来自总线处理器的数据接收但没有唤醒它,例如来自GPIO的中断唤醒它然后它响应来自CAN总线的最后3个数据

CPU STM32F103C6中央处理器 STM32F103C6

  HAL_SuspendTick();
  HAL_TIM_Base_Stop(&htim1);
  HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
  HAL_TIM_Base_Start(&htim1);
  HAL_ResumeTick();
  tick_sleep = HAL_GetTick();

HAL Config interrupt HAL 配置中断

CAN Bus config CAN总线配置

    void MX_CAN_Init(void)
{
 
  /* USER CODE BEGIN CAN_Init 0 */
 
  /* USER CODE END CAN_Init 0 */
 
  /* USER CODE BEGIN CAN_Init 1 */
 
  /* USER CODE END CAN_Init 1 */
  hcan.Instance = CAN1;
  hcan.Init.Prescaler = 6;
  hcan.Init.Mode = CAN_MODE_NORMAL;
  hcan.Init.SyncJumpWidth = CAN_SJW_1TQ;
  hcan.Init.TimeSeg1 = CAN_BS1_2TQ;
  hcan.Init.TimeSeg2 = CAN_BS2_1TQ;
  hcan.Init.TimeTriggeredMode = DISABLE;
  hcan.Init.AutoBusOff = ENABLE;
  hcan.Init.AutoWakeUp = ENABLE;
  hcan.Init.AutoRetransmission = ENABLE;
  hcan.Init.ReceiveFifoLocked = DISABLE;
  hcan.Init.TransmitFifoPriority = DISABLE;
  if (HAL_CAN_Init(&hcan) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN CAN_Init 2 */
  HAL_CAN_Start(&hcan);
    CAN_FilterTypeDef  sFilterConfig;
    sFilterConfig.FilterIdHigh   = 0xFFFF;
    sFilterConfig.FilterIdLow   = 0xFFFF;
    sFilterConfig.FilterMaskIdHigh = 0;
    sFilterConfig.FilterMaskIdLow = 0;
    sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;
    sFilterConfig.FilterBank = 0;
    sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
    sFilterConfig.FilterScale = CAN_FILTERSCALE_16BIT;
    sFilterConfig.FilterActivation = ENABLE;
    sFilterConfig.SlaveStartFilterBank = 0;
 
    HAL_CAN_ConfigFilter(&hcan,&sFilterConfig);
  /* USER CODE END CAN_Init 2 */
 
}

I forgot to run interrupts from CAN我忘了从 CAN 运行中断

      /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_CAN_Init();
  MX_I2C1_Init();
  MX_TIM3_Init();
  MX_USART2_UART_Init();
  MX_TIM1_Init();
  /* USER CODE BEGIN 2 */
  HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
  HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_3);
  HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_4);
  HAL_TIM_Base_Start_IT(&htim1);
  HAL_CAN_ActivateNotification(&hcan, CAN_IT_RX_FIFO0_MSG_PENDING); // CAN interrupts start

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM