cubemx实现CAN通讯

2019-09-30来源: eefocus关键字:cubemx  CAN通讯  Keil5

首先要安装cubemx跟Keil5两个编程软件


然后打开cubemx软件,新建一个工程项目:

输入CPU型号:

在右下角双击CPU具体型号

稍等片刻会打开如下对话框:

首先要配置系统的调试方式:我们选择SW方式

然后配置晶振源,这里选择的是外部晶振,8M

使能看门狗

使能CAN

使能TIM2时钟源,采用内部时钟

配置完成后可以看到单片机管脚已经做了配置

切换到Clock Configuration选项卡,配置时钟周期,这里配置为8M

切换到Configuration选项卡,进入CAN配置选项配置波特率如下为500Kbps

配置接收中断

配置定时器如下为1ms定时器

配置定时器中断

配置完成后点击保存,然后点击如下按钮,生成代码

填写工程名称,路径,编程软件等等

选择生成代码的方式

等待

点击打开项目。代码生成部分完成。

添加一些特殊配置和逻辑代码


添加CAN的配置信息函数


void Can_Config(void)

{

  hcan.pTxMsg = &TxMessage;

  hcan.pRxMsg = &RxMessage;

 

  /*##-1- Configure CAN1 Transmission Massage #####################################*/

  hcan.pTxMsg->StdId = 0x123;

  hcan.pTxMsg->RTR = CAN_RTR_DATA;

  hcan.pTxMsg->IDE = CAN_ID_STD;

  hcan.pTxMsg->DLC = 8;

 

  /*##-2- Configure the CAN1 Filter ###########################################*/

  sFilterConfig.FilterNumber = 0;

  sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;

  sFilterConfig.FilterScale = CAN_FILTERSCALE_16BIT;

  sFilterConfig.FilterIdHigh = 0;

  sFilterConfig.FilterIdLow = 0;

  sFilterConfig.FilterMaskIdHigh = 0;

  sFilterConfig.FilterMaskIdLow = 0;

  sFilterConfig.FilterFIFOAssignment = CAN_FIFO0;

  sFilterConfig.FilterActivation = ENABLE;

  sFilterConfig.BankNumber = 14;

  HAL_CAN_ConfigFilter(&hcan, &sFilterConfig);

}

 在Main函数中while(1)之前调用一下即可


添加定时器启动函数: HAL_TIM_Base_Start_IT(&htim2);


CAN接收中断启动函数:HAL_CAN_Receive_IT(&hcan, CAN_FIFO0);


/* USER CODE BEGIN 2 */

 

Can_Config();                        //Can配置信息

HAL_TIM_Base_Start_IT(&htim2);       //定时器启动

HAL_CAN_Receive_IT(&hcan, CAN_FIFO0);//使能Can接收中断

 

  /* USER CODE END 2 */

 打开stm32f1xx_it.c文件,找到如下函数,


添加接收中断启动函数:HAL_CAN_Receive_IT(&hcan, CAN_FIFO0);


注意:接收中断启动函数使能一次只进一次中断,所以中断退出前要再次使能。


void USB_LP_CAN1_RX0_IRQHandler(void)

{

  /* USER CODE BEGIN USB_LP_CAN1_RX0_IRQn 0 */

 

  /* USER CODE END USB_LP_CAN1_RX0_IRQn 0 */

  HAL_CAN_IRQHandler(&hcan);

  /* USER CODE BEGIN USB_LP_CAN1_RX0_IRQn 1 */

  HAL_CAN_Receive_IT(&hcan, CAN_FIFO0);//ʹÄÜCAN½ÓÊÕ

  /* USER CODE END USB_LP_CAN1_RX0_IRQn 1 */

}

添加CAN接收服务函数:HAL_CAN_RxCpltCallback


说明:该函数在stm32f1xx_hal_can.c文件中已经有定义,它的定义方式如下:


__weak void HAL_CAN_TxCpltCallback(CAN_HandleTypeDef* hcan)


函数前面的__weak关键字意思是如果有同样的定义,先执行没有__weak关键字的函数,所以当我们定义了HAL_CAN_RxCpltCallback函数后,编译器会先编译我们定义的函数,而忽略系统定义的该函数。当我们没有定义该函数时,系统会编译带有__weak关键字的函数。


void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef* hcan)

{

    unsigned short int speed;

    switch(hcan->pRxMsg->StdId)

    {//根据ID处理数据

        case 0x123://

        /*在此添加数据处理逻辑*/

        break;

        default:

        break;

     }

}

 添加CAN发送函数:


/* USER CODE BEGIN WHILE */

  while (1)

  {

        HAL_IWDG_Refresh(&hiwdg); //喂狗函数

 

        if(Can_Trans_Timer == 0)

        {//每100ms发送一次数据

            Can_Trans_Timer = 100;

            hcan.pTxMsg->StdId = 0x123;

 

            hcan.pTxMsg->Data[0] = 'C';

            hcan.pTxMsg->Data[1] = 'A';

            hcan.pTxMsg->Data[2] = 'N';

            hcan.pTxMsg->Data[3] = ' ';

            hcan.pTxMsg->Data[4] = 'T';

            hcan.pTxMsg->Data[5] = 'E';

            hcan.pTxMsg->Data[6] = 'S';

            hcan.pTxMsg->Data[7] = 'T';

            HAL_CAN_Transmit(&hcan, 200);//发送一帧数据

        }

    }

  /* USER CODE END WHILE */

在定时器函数中添加定时器代码:


void TIM2_IRQHandler(void)

{

  /* USER CODE BEGIN TIM2_IRQn 0 */

  if(Can_Trans_Timer > 0)          Can_Trans_Timer--;

  /* USER CODE END TIM2_IRQn 0 */

  HAL_TIM_IRQHandler(&htim2);

  /* USER CODE BEGIN TIM2_IRQn 1 */

  /* USER CODE END TIM2_IRQn 1 */

}

说明:在往工程中添加代码时要注意,不要任意往里面添加代码,要在注释着USER CODE BEGIN的地方添加代码,这样在重新生成代码时才不至于将已经写好的代码覆盖掉,如下


/* USER CODE BEGIN Includes */


添加用户代码


/* USER CODE END Includes */


/* USER CODE BEGIN PFP */


添加用户代码


/* USER CODE END PFP */


/* USER CODE BEGIN 0 */


添加用户代码


/* USER CODE END 0 */

关键字:cubemx  CAN通讯  Keil5 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic476220.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32F4 CubeMX HAL CAN 使用步骤
下一篇:关于STM32F105 双CAN口通信的一些学习心得

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

HAL库 STM32CubeMX教程五----看门狗(独立看门狗,窗口看门狗)
前言:   今天我们来学习看门狗的配置与函数,看门狗可以有效解决程序的跑飞,在使用过程中比较常见,是防止芯片故障的有效外设,我们一起来学习下HAL库 STM32CubeMX的独立看门狗,靠窗看门狗的使用。本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用所用工具:1、芯片: STM32F407ZET62、STM32CubeMx软件3、IDE: MDK-Keil软件4、STM32F1xx/STM32F4xxHAL库 知识概括:通过本篇博客您将学到:STM32CubeMX创建看门狗例程独立看门狗,靠窗看门狗 工作原理看门狗在由单片机构成的微型计算机系统中单片机
发表于 2019-11-16
HAL库 STM32CubeMX教程五----看门狗(独立看门狗,窗口看门狗)
使用STM32CubeMX,生成STM32F103ZE SPI3 HAL 工程
1,选择芯片型号为STM32F103ZET6,开始工程,引脚配置如下:主要是RCC,SPI3,和SYS三个模块2,时钟配置,可按下图进行:3,SPI3配置,如下图,配完这一步其它可以不管,直接生成工程。4,生成工程,打开工程手动输入红框中内容。运行:成功输出波形。
发表于 2019-10-18
使用STM32CubeMX,生成STM32F103ZE SPI3 HAL 工程
STM32CubeMX 软件使用学习笔记1
1:CubeMX是ST公司开发的一款软件,旨在通过图形化的配置MCU方式,来减轻开发人员的工作量,让大家更轻松,快乐。用户使用图形化工具配置MCU后,CubeMX可以根据用户选择的IDE,来生成对应的工程文件(包含了初始化代码),下文将介绍。可以在ST的官网上查看CubeMX的功能介绍,并下载CubeMX. https://www.st.com/en/development-tools/stm32cubemx.html2:CubeMX下载完成后,在安装时,会提示安装java sdk, 按提示安装即可。3:安装完成后,打开软件,界面如下。4:手动安装MCU软件包。菜单栏“Help”->“manage embedded
发表于 2019-10-08
STM32CubeMX 软件使用学习笔记1
stm32 CubeMx falsh应用
STM32CubeMx工具没有配置Flash应用。需用户调用库函数实现FLASH的擦除、读、写操作。具体FLASH的擦除、读、写流程及具体配置详情需查看STM32 FLASH编程文档。现贴出基于STM32CubeMX工具MDK建立的工程文档,实现的FLASH操作代码。//读取指定地址的半字(16位数据)//faddr:读地址(此地址必须为2的倍数!!)//返回值:对应数据.uint16_t STMFLASH_ReadHalfWord(uint32_t faddr){return *(uint16_t*)faddr; }//从指定地址开始读出指定长度的数据//ReadAddr:起始地址//pBuffer:数据指针
发表于 2019-10-08
关于由CubeMx 生成stm32f4+freertos,不正常分析之堆栈大小设置
freertos官方手册上有说,移植中出现的问题大多数是由堆栈设置不合理造成的,今天结合自身遇到问题分析一下1.任务堆栈设置过小,很容易造成硬件溢出,跳转到void HardFault_Handler(void);调试方法,可以通过调用函数,UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask );来跟踪剩余堆栈,不过在CubeMx中的Configuration->FreeRtos->Include parameters中使能uxTaskGetStackHighWaterMark函数;2.整体设置过小,TOTAL_HEAP_SIZE
发表于 2019-09-30
基于LabVIEW 和J1939 协议的CAN 总线通讯平台开发
  概述:  进入21 世纪以来,商用车CAN 总线网络的应用得到了异常迅猛的发展。现今市面上满足国3~国5 排放标准的商用车,无一例外均应用CAN 总线网络,进行整车VECU、发动机EECU、自动变速箱ECU、汽车组合仪表ECU、车轮防抱死制动ECU 之间的数据通讯。基于J1939 协议的商用车CAN总线,针对单片机微控制器MCU 节点的MCU + CAN 控制器 + CAN 收发器的CAN 通讯接口,在车载网络控制系统中得到了大量应用;而对整车道路试验、发动机台架试验、整车电环境半实物仿真测试的上位机节点的PC 机或笔记本电脑 + CAN 通讯模块,大都使用价格昂贵的Vector CANoe 模块。  存在
发表于 2019-11-09
基于LabVIEW 和J1939 协议的CAN 总线通讯平台开发
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved