0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

教程:如何用STM32-CubeMX-实现CAN通讯

STM32嵌入式开发 来源:STM32嵌入式开发 作者:STM32嵌入式开发 2020-09-30 17:24 次阅读

首先要安装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 */

责任编辑:xj

原文标题:STM32-CubeMX-实现CAN通讯

文章出处:【微信公众号:STM32嵌入式开发】欢迎添加关注!文章转载请注明出处。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

原文标题:STM32-CubeMX-实现CAN通讯

文章出处:【微信号:c-stm32,微信公众号:STM32嵌入式开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何检测can通讯电路的好坏

    CAN(Controller Area Network)是一种基于总线通信的局域网技术,广泛应用于汽车电子、工业控制等领域。在实际应用中,CAN通讯电路的好坏对整个系统的稳定性和可靠性具有重要
    的头像 发表于 06-16 09:42 2086次阅读

    STM32H743接收CAN数据想要使用DMA,不占用CPU数据,能否实现

    请教各位大佬,接收CAN数据想要使用DMA,不占用CPU数据,能否实现。 我在cubeMX例程FDCAN没有DMA配置。网上也没找到FDCAN使用DMA的。
    发表于 05-31 08:08

    PLC与CAN通讯设备如何搭配使用呢?

    PLC与CAN通讯设备的搭配使用,主要取决于具体的应用场景和需求。
    的头像 发表于 05-11 10:39 511次阅读

    STM32CubeMX和Datasheet引脚位置不一致,那个是对的?

    环境版本:CubeMX 5.3.0 ,datasheet- DS12110 Rev 7 CPU:STM32H743IIT6配置CAN1_RXFD引脚时,CubeMX上是第11脚,而Da
    发表于 04-15 06:41

    请问STM32L4如何利用STM32CubeMX实现EXTI控制LED?

    STM32L4利用STM32CubeMX如何实现EXTI控制LED?
    发表于 04-09 08:07

    STM32F042F4中为什么不能用CAN

    使用STM32cubeMX选择F0系列带CAN的单片机,出现了F042F4,其PDF手册里面也说明了具有CAN接口,但在cubeMX的配置程序中却不能使用
    发表于 04-09 07:41

    stm32cubemx生成的can代码,运行调试显示显性位错误的原因?

    stm32cubemx生成的can代码,运行调试显示显性位错误,找不到原因,芯片是stm32f103z,求助各位。
    发表于 04-07 07:56

    两片STM32CAN接口,可以直接用TX与RX引脚连接正常通讯吗?

    两片 STM32CAN接口,可以直接用TX与RX引脚连接(不接CAN收发器芯片)正常通讯
    发表于 04-01 07:38

    使用STM32F042单片机做的CAN通讯,运行一段时间后通讯异常的原因?

    使用STM32F042单片机做的CAN通讯,运行一段时间后发现通讯异常,当通讯异常时,重新下载程序后通讯
    发表于 03-15 07:11

    如何在stm32cubemx中精确查询?

    stm32cubemx中finder功能的确很方便,但我遇到一个问题 现在片子上pin复用功能越来越多,越来越方便 我同时需要多个接口,如,1个can,2个spi,1个csi...... 选择时,会出现数量上满足了,但不少pin是复用,不能共存。 请教如何在
    发表于 03-12 06:11

    何用cubemx配置并实现STM32F373的三个SDADC并行采样?

    求大神指点如何实现STM32F373的三个SDADC并行采样,用cubemx配置?
    发表于 03-11 07:14

    Mini CAN Unit小型CAN总线通讯单元

    技术,CAN总线能够实现稳定通信,适应长距离传输和嘈杂环境的要求。MiniCANUnitMiniCANUnit是一款小型CAN总线通讯单元,采用了TJA1051T
    的头像 发表于 02-19 12:47 434次阅读
    Mini <b class='flag-5'>CAN</b> Unit小型<b class='flag-5'>CAN</b>总线<b class='flag-5'>通讯</b>单元

    何用示波器排查CAN的各种错误帧呢?

    何用示波器排查CAN的各种错误帧呢? 导言: 控制器局域网络(Controller Area Network,CAN)是一种常用的现场总线通信协议,广泛应用于汽车电子系统、工业自动化等领域。然而
    的头像 发表于 12-07 11:09 1068次阅读

    基于STM32CUBEMX驱动低压步进器电机驱动器STSPIN220(2)----驱动STSPIN220

    本文档的目标是提供关于使用STM32CubeMX驱动低压步进电机驱动器STSPIN220的详尽信息和操作指南。通过本文档,将深入了解如何利用STM32CubeMX来配置电机驱动器,以及如何实现对步进电机的精确控制和运动。
    的头像 发表于 12-01 15:25 892次阅读
    基于<b class='flag-5'>STM32CUBEMX</b>驱动低压步进器电机驱动器STSPIN220(2)----驱动STSPIN220

    stm32cube怎么安装 STM32CubeMX安装步骤教程

    STM32CubeMXSTM32芯片图形化配置工具,通过简单的操作便能实现相关配置,省去了我们配置各种外设的时间,支持MDK、IAR For ARM、TrueStudio等多种工具。
    发表于 11-14 12:37 1577次阅读
    <b class='flag-5'>stm32</b>cube怎么安装 <b class='flag-5'>STM32CubeMX</b>安装步骤教程