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嵌入式开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    AT32F系列 CAN通讯模式使用

    AT32F系列 CAN通讯模式使用本帖子演示AT32F系列_CAN通讯模式的使用方法。注:本应用笔记对应的代码是基于雅特力提供的V2.x.x 板级支持包(BSP)而开发,对于其他版本B
    发表于 10-20 16:29

    CAN通讯失败的常见原因

    通过这种由外至内、从硬件到软件的逐层排查,我能够高效地定位并解决绝大多数CAN通讯故障。
    的头像 发表于 10-14 15:15 1026次阅读

    意法半导体:STM32CubeMX将不再集成到STM32CubeIDE中

    从2025年11月发布的版本开始,我们将仅以 独立 版本的形式提供 STM32CubeIDE 和 STM32CubeMXSTM32CubeMX将不再集成到STM32CubeIDE
    的头像 发表于 09-01 17:18 2632次阅读

    Profinet转CAN网关模块对实现西门子PLC与CAN变频器协同通信的助力研究

    在智能物流仓储系统中,AGV等设备的通讯网络稳定性和实时性至关重要。通过Profinet转CAN网关,可以实现中控系统(如西门子PLC,支持ProFiNet协议)与伺服驱动器(支持CAN
    的头像 发表于 06-09 14:59 595次阅读
    Profinet转<b class='flag-5'>CAN</b>网关模块对<b class='flag-5'>实现</b>西门子PLC与<b class='flag-5'>CAN</b>变频器协同通信的助力研究

    STM32F103TBU6 封装是VFQFPN36 将PD0和PD1配置成CAN不成功是什么原因?

    规格书上可以配置成CAN, 程序配置好后发现发送数据没有邮箱。然后在STM32CubeMX软件进CAN配置发现STM32F103TBU6封装是VFQFPN36PD0和PD1没有
    发表于 06-06 06:42

    STM32F103TBU6封装是VFQFPN36,将PD0和PD1配置成CAN不成功是什么原因?

    规格书上可以配置成CAN, 程序配置好后发现发送数据没有邮箱。然后在STM32CubeMX软件进CAN配置发现STM32F103TBU6封装是VFQFPN36PD0和PD1没有
    发表于 04-27 08:41

    STM32开发入门进阶必备!《STM32嵌入式系统开发—基于STM32CubeMX和HAL库》新书发布!

    近日,由华清远见教育科技集团精心编撰的教育部高等学校电子信息类专业教学指导委员会规划教材、普通高等教育电子信息类专业系列教材——《STM32嵌入式系统开发—基于STM32CubeMX和HAL库》重磅
    的头像 发表于 04-03 14:54 1366次阅读
    <b class='flag-5'>STM32</b>开发入门进阶必备!《<b class='flag-5'>STM32</b>嵌入式系统开发—基于<b class='flag-5'>STM32CubeMX</b>和HAL库》新书发布!

    使用STM32H7的FDCAN通讯,为什么CAN1会收到CAN2的帧ID,CAN2也会收到CAN1的?

    使用STM32H7的FDCAN通讯,请问为什么CAN1会收到CAN2的帧ID,CAN2也会收到CAN
    发表于 03-14 10:33

    请问STM32cubeMX中文版怎么设置?

    STM32cubeMX中文版怎么设置?
    发表于 03-13 06:12

    STM32CubeMX用于STM32配置和初始化C代码生成

    电子发烧友网站提供《STM32CubeMX用于STM32配置和初始化C代码生成.pdf》资料免费下载
    发表于 02-26 17:32 678次下载

    工程师开发利器:STM32CubeMX 与 eDesignSuite 的协同开发

    HAL 库实现高效控制。示例:通过 CubeMX 配置 PWM 输出和 ADC 采样,配合 eDesignSuite 的电机驱动算法,快速实现电机调速功能。系统级验证与优化利用 STM32C
    的头像 发表于 02-26 14:07 1115次阅读
    工程师开发利器:<b class='flag-5'>STM32CubeMX</b> 与 eDesignSuite 的协同开发

    使用stm32cubeMX无法生成mdk工程文件?

    几年前使用过cubemx,可以生成keil的工程文件。最近有个工程使用cubemx创建,结果只能生成stm32cubemx类型的文件,无法生成mdk的工程文件。 请教如何解决。 (我之前使用过多次
    发表于 01-04 20:03

    STM32CubeMX生成的代码,是怎样的HAL架构?

    需要注意,CubeMX只是一个初始化工具,它只是帮你完成了HAL库外设和时钟的初始化,具体程序的编写还需要查阅HAL库的说明,使用相关函数实现你想实现的功能。CubeMX生成的代码包含
    的头像 发表于 01-01 21:01 1233次阅读
    <b class='flag-5'>STM32CubeMX</b>生成的代码,是怎样的HAL架构?

    STM32CubeMX的菜单介绍

    相信初学者打开STM32CubeMX一定是一脸懵逼,里面都是全英文的,不知道从何入手。这里先给大家简单讲解一下。在新建工程这一栏里,我们最常用的是第一个,它会弹出一个芯片列表供你选择,然后就会创建一
    的头像 发表于 12-25 21:03 692次阅读
    <b class='flag-5'>STM32CubeMX</b>的菜单介绍