你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F103RB 无法进入CAN中断的问题

[复制链接]
MissOne 提问时间:2020-12-22 10:22 /
鄙人买了一块NUCLEO F103RB的开发板,第一次玩STM系列的片子。使用STM32Cube和STM32MX开发,确实很好用,快捷方便。
IO,定时器等等资源很快就调试完了。现在有个小问题,请教下大家。是关于CAN。
103只有一路CAN,我配置完成后,收发正常:示波器可见波形,且使用zlg-CANTEST调试正确,但是MCU的收发是做在定时器中的。因为CAN的收发中断都不能进去,请教大家。
网上有说是没配置过滤,在下也尝试了,无计可施。
收藏 评论13 发布时间:2020-12-22 10:22

举报

13个回答
MissOne 回答时间:2020-12-22 10:25:45
  1. static void MX_CAN_Init(void)
  2. {

  3.   /* USER CODE BEGIN CAN_Init 0 */

  4.   /* USER CODE END CAN_Init 0 */

  5.   /* USER CODE BEGIN CAN_Init 1 */

  6.   /* USER CODE END CAN_Init 1 */
  7.   hcan.Instance = CAN1;
  8.   hcan.Init.Prescaler = 8;
  9.   hcan.Init.Mode = CAN_MODE_NORMAL;
  10.   hcan.Init.SyncJumpWidth = CAN_SJW_1TQ;
  11.   hcan.Init.TimeSeg1 = CAN_BS1_3TQ;
  12.   hcan.Init.TimeSeg2 = CAN_BS2_4TQ;
  13.   hcan.Init.TimeTriggeredMode = DISABLE;
  14.   hcan.Init.AutoBusOff = DISABLE;
  15.   hcan.Init.AutoWakeUp = DISABLE;
  16.   hcan.Init.AutoRetransmission = DISABLE;
  17.   hcan.Init.ReceiveFifoLocked = DISABLE;
  18.   hcan.Init.TransmitFifoPriority = DISABLE;
  19.   if (HAL_CAN_Init(&hcan) != HAL_OK)
  20.   {
  21.     Error_Handler();
  22.   }
  23.   /* USER CODE BEGIN CAN_Init 2 */

  24.   /* USER CODE END CAN_Init 2 */

  25. }[code]void CAN_SettingData_Init(void)
  26. {
  27.           //ID
  28.           canHeader.StdId = 0x770;
  29.           //数据长度
  30.           canHeader.DLC = 8;
  31.           //设置为标准帧0,扩展�????1
  32.           canHeader.IDE=0;
  33.           //0数据帧,1远程�????
  34.           canHeader.RTR=0;

  35.           canFilterConfig.FilterBank  = 0;//过滤器组0
  36.           canFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;//标识符屏蔽位模式
  37.           canFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;//滤波器位宽为单个32�???
  38.           canFilterConfig.FilterIdHigh =0; //要过滤的ID高位,因为这个代码设置不是过滤ID的,�???以随意填了一个ID
  39.           canFilterConfig.FilterIdLow =0;//要过滤的ID低位
  40.           canFilterConfig.FilterMaskIdHigh = 0;                //这里设置接收任意ID的CAN数据
  41.           canFilterConfig.FilterMaskIdLow = 0;                //0表示接收来自发�?�端任意ID的数�???
  42.           canFilterConfig.FilterFIFOAssignment =CAN_FILTER_FIFO0;//过滤器指向FIFO0�???
  43.           canFilterConfig.SlaveStartFilterBank=14;
  44.           canFilterConfig.FilterActivation = ENABLE;//使能过滤�???
  45. }[code]int main(void)
  46. {
  47.   /* USER CODE BEGIN 1 */
  48.   /* USER CODE END 1 */

  49.   /* MCU Configuration--------------------------------------------------------*/

  50.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  51.   HAL_Init();

  52.   /* USER CODE BEGIN Init */

  53.   /* USER CODE END Init */

  54.   /* Configure the system clock */
  55.   SystemClock_Config();

  56.   /* USER CODE BEGIN SysInit */

  57.   /* USER CODE END SysInit */

  58.   /* Initialize all configured peripherals */
  59.   MX_GPIO_Init();
  60.   MX_USART2_UART_Init();
  61.   MX_CAN_Init();
  62.   MX_TIM1_Init();
  63.   MX_TIM2_Init();
  64.   MX_TIM3_Init();
  65.   /* USER CODE BEGIN 2 */

  66.   pwmCount = 0;
  67.   HAL_TIM_Base_Start_IT(&htim1);
  68.   HAL_TIM_PWM_Start_IT(&htim2,TIM_CHANNEL_1);

  69.   //�???定要设置过滤�???,不然无法接收数据
  70.   CAN_SettingData_Init();
  71.   HAL_CAN_ConfigFilter(&hcan, &canFilterConfig);
  72.   HAL_CAN_Start(&hcan);


  73.   /* USER CODE END 2 */

  74.   /* Infinite loop */
  75.   /* USER CODE BEGIN WHILE */
  76.    while (1)
  77.   {
  78.     /* USER CODE END WHILE */

  79.     /* USER CODE BEGIN 3 */
  80.   }
  81.   /* USER CODE END 3 */
  82. }
复制代码
[/code][/code]
MissOne 回答时间:2020-12-22 10:26:19
此处无响应:
  1. void USB_HP_CAN1_TX_IRQHandler(void)
  2. {
  3.   /* USER CODE BEGIN USB_HP_CAN1_TX_IRQn 0 */

  4.   /* USER CODE END USB_HP_CAN1_TX_IRQn 0 */
  5.   HAL_CAN_IRQHandler(&hcan);
  6.   /* USER CODE BEGIN USB_HP_CAN1_TX_IRQn 1 */

  7.   /* USER CODE END USB_HP_CAN1_TX_IRQn 1 */
  8. }

  9. /**
  10.   * @brief This function handles USB low priority or CAN RX0 interrupts.
  11.   */
  12. void USB_LP_CAN1_RX0_IRQHandler(void)
  13. {
  14.   /* USER CODE BEGIN USB_LP_CAN1_RX0_IRQn 0 */

  15.   /* USER CODE END USB_LP_CAN1_RX0_IRQn 0 */
  16.   HAL_CAN_IRQHandler(&hcan);
  17.   /* USER CODE BEGIN USB_LP_CAN1_RX0_IRQn 1 */

  18.   /* USER CODE END USB_LP_CAN1_RX0_IRQn 1 */
  19. }
复制代码
MissOne 回答时间:2020-12-22 10:26:57
此处正常:
  1. void Event_100ms()
  2. {
  3.         //100mS 事件
  4.         if(count100ms++ > 1000)
  5.         {
  6.                 count100ms = 0;
  7.                 ld2state = !ld2state;
  8.                 HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, ld2state);
  9.                 if(isBroadcast!=0)
  10.                 {
  11.                         aData[0] = (uint8_t)(runningTimeUs>>8);
  12.                         aData[1] = (uint8_t)runningTimeUs;
  13.                         HAL_CAN_AddTxMessage(&hcan,&canHeader,aData,&txMailbox);
  14.                 }
  15.                 CanReceiveData(&hcan,CAN_RX_FIFO0);
  16.         }
  17. }
复制代码
MissOne 回答时间:2020-12-22 13:26:40
环回模式也不能进入中断
大陶 回答时间:2020-12-22 15:24:32
先试一下回环模式,再看一下中断的优先级。
MissOne 回答时间:2020-12-22 16:03:15
回环模式也进不了中断,中断优先级有尝试调整过,没有效果!
MissOne 回答时间:2020-12-22 16:03:58
dataozi 发表于 2020-12-22 15:24
先试一下回环模式,再看一下中断的优先级。

回环模式也进不了,优先级也调整过,没有效果
MissOne 回答时间:2020-12-23 08:31:41
回环模式也进不了中断,优先级也尝试修改,未有效果
MissOne 回答时间:2020-12-23 08:41:13
dataozi 发表于 2020-12-22 15:24
先试一下回环模式,再看一下中断的优先级。

回环也不行,优先级也有修改,还是无效果
MissOne 回答时间:2020-12-23 10:37:15
已解决,固件使用的1.80,必须要激活:HAL_CAN_ActivateNotification(&hcan,CAN_IT_RX_FIFO1_MSG_PENDING|CAN_IT_RX_FIFO0_MSG_PENDING);
MissOne 回答时间:2020-12-23 10:39:38
已解决,最新的固件库1.83,要使用这个函数,激活中断事件:
HAL_CAN_ActivateNotification
MissOne 回答时间:2021-1-6 13:27:40
已找到原因:没有激活中断,大意了。这个函数,HAL_CAN_ActivateNotification
MissOne 回答时间:2021-1-19 09:05:21
解决了:用的hal库,要用这个开中断HAL_CAN_ActivateNotification

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版