文章目录

  • 一、前言
  • 二、移植前的准备
  • 三、移植
    • 3.0、移植的目的
    • 3.1、工程的实际硬盘上添加文件夹
    • 3.2、往bsp文件夹放入bsp代码
    • 3.3、往canfestival里放入源代码
    • 3.4、往obj_dir里放入代码
    • 3.5、在工程上添加文件canfestival,obj_dir,bsp三个文件夹
    • 3.6、在工程里添加各个文件的代码
    • 3.7、添加include的路径
  • 四、定时器
    • 4.1、TIM17
  • 五、代码
    • 5.1、bsp_canopen_timer.h
    • 5.2、main.c
    • 5.3、bsp_fdcan.c
    • 5.4、回到main.c
    • 5.5、重定向printf
  • 六、调试
    • 6.1、Debug(printf)Viewer
    • 6.1、CAN分析仪调试
  • 七、细节补充
    • 7.1、将CANopen从站的Node_ID改为0x05

一、前言


本博文的目的是用我弄好的BSP,直接往STM32工程里加入代码就能简单并快速地完成CANopen协议的移植。

刚开始研究“如何在STM32上实现CANopen协议”时注意到广州硬石科技的教程。这个教程我建议同学们一定要学习一下,移植Canfestival的流程我记得是没问题的。如下图所示:

硬石教程给Canfestival设计的定时器的代码在实现上有问题,说白了就是“定时不准。先不说硬石实现方法复杂(使用定时器的比较中断实现定时器中断),而且从我测试报文的时间间隔看来是有误差的(尤其在几个ms的时候)。所以,移植可以从硬石教程上学习,但是定时器的实现最好使用我这篇博文的方法。其实,我也是参考别人的文章,并走了不少弯路后才总结出来的。经过us级的定时器事件证明我的方法是可行的。

我使用的硬件:

工程代码:
链接:https://pan.baidu.com/s/1sPBxyKjswpcro1TmEIIiKw
提取码:i42i

二、移植前的准备


  1. 移植CANopen协议之前,需要准备一个已经完成CAN底层驱动的工程。我是基于之前分享的工程上进行CANopen协议的移植的,所以需要下载该工程的代码:
    STM32H743+CubeMX-双路FDCAN同时工作的终极方案(裸机)
  2. 下载我的提供的代码。里面含我编写的BSP与Canfestival的源码与对象字典的文件,如下图所示:

    这些文件的共享地址:
    链接:https://pan.baidu.com/s/10c05VtPURW4YWGYWKX1pcA
    提取码:1uwt

三、移植


3.0、移植的目的

在开发板的FDCAN1接口上实现CANopen从站。当然,我编写的这个bsp已经预留了FDCAN2也能实现CANopen从站或者主站。一般情况下,开发板只需一个FDCAN口实现CANopen。

3.1、工程的实际硬盘上添加文件夹

3.2、往bsp文件夹放入bsp代码

3.3、往canfestival里放入源代码

3.4、往obj_dir里放入代码

3.5、在工程上添加文件canfestival,obj_dir,bsp三个文件夹

3.6、在工程里添加各个文件的代码




特别注意一下的是,文件夹canfestival/Inc/STM32里的头文件也必须添加,如下图所示:

3.7、添加include的路径

在Keil的工程上添加完工程后,需要继续添加include Paths,不然会出现找不到”啥啥头文件“的情况。

四、定时器


4.1、TIM17

选择TIM17的原因是canfestival只需要一个简单的定时器,会产生定时器溢出中断即可,所以没必要占用其他高级定时器。

配置240-1分频的原因是TIM17挂载在APB2时钟总线上,APB2的时钟频率是240M,所以需要将此定时器进行1/240分频,让定时器的工作频率为1M。


接着,生成并编译代码。出现4个Error(s),5个Warning(s),但先不用管它。

五、代码


5.1、bsp_canopen_timer.h

在bsp_canopen_timer.h里告诉canfestival,我给它提供了TIM17定时器。

接着,编译代码后发现0 Error(s)里,还有5个Warning(s)。

其内容如下,在sdo.c文件里,我是不管这个警告的,在实践中也没有发现SDO有问题,可能是编译器原因吧。反正,不用管这5个警告,不会影响canfestival的使用。

再重新编译一次,就会出现0 Error(s),0 Warning(s).

5.2、main.c

函数HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)是HAL库的定时器中断回调函数,在main.c里调用。
TIM17是提供给Canfestival的,所以在TIM17的中断回调里调用TIMx_DispatchFromISR()。

5.3、bsp_fdcan.c

首先包含两个头文件:

因为只在FDCAN1接口上实现CANopen协议,所以在FDCAN的RX FIFO0的中断回调函数HAL_FDCAN_RxFifo0Callback()调用canfestival的接收函数canDispatch()。

5.4、回到main.c


接着,编译代码:

5.5、重定向printf

我的bsp代码里面有很多printf,所以一定要实现printf,否则单片机系统会跑飞。实现printf有很多种方法。我使用Keil自带的EventRecorder实现printf。

还是回到main.c


编译代码,下载代码到开发板子上。

六、调试


6.1、Debug(printf)Viewer

在这里调试窗口,可以看到printf的信息。

6.1、CAN分析仪调试

至此,FDCAN1已经运行CANopen协议了!!!!

七、细节补充


7.1、将CANopen从站的Node_ID改为0x05

一般情况,CANopen从站的Node_ID不能设为0x01,0x01最好留给CANopen主站使用。

修改代码,编译与下载代码后,从CAN分析仪观察报文。

CANopen | 移植01 - STM32H743 + Canfestival的移植并让FDCAN1运行CANopen协议相关推荐

  1. U-Boot移植教程之二:移植

    内容来自 韦东山<嵌入式Linux应用开发完全手册> 一.U-Boot移植 开发板smdk2410的配置适用于大多数S3C2410单板,或是只需要极少的修改即可使用.但是目前U-Boot中 ...

  2. Microchip Studio 7.0项目移植(从ICC AVR移植到Microchip Studio 7.0)

    Microchip Studio 7.0 系列教程 1.Microchip Studio 7.0 如何修改字体大小Microchip Studio 7.0 如何修改字体大小 2.MicroChip S ...

  3. GD32上FAL Flash分区驱动移植及Easyflash与FlashDB移植说明

    GD32上FAL Flash分区驱动移植及Easyflash与FlashDB移植说明 效果 移植前提 下载源码 移植过程 加入以下文件及文件夹到工程目录和工程 将demo目录下的接口文件做下修改 修改 ...

  4. 嵌入式uboot移植之从uboot官方移植

    注:以下内容来自朱老师物联网大讲堂课件 1. 选择合适的官方原版uboot 1.1 官方原版uboot的版本 (1)版本号.刚开始是1.3.4,后来变成2009.08 (2)新版和旧版的差别.uboo ...

  5. lora 移植到android_LoRa---官方例程移植

    SX1278芯片上移植Semtech官方PING-PONG例程 移植环境:keil5.20 硬件平台:stm32f051+sx1278 2.准备文件: SX12xxDrivers-V2.1.0文件夹下 ...

  6. Linux系统移植:原厂 Kernel 移植到开发板

    文章目录 Linux系统移植:原厂 Kernel 移植到开发板 一.获取原厂内核并编译 二.内核启动测试 三.添加自己板子文件 3.1 板子配置文件 3.2 板子设备树 3.3 编译 四.重要配置修改 ...

  7. 尚硅谷大数据技术Spark教程-笔记01【Spark(概述、快速上手、运行环境、运行架构)】

    视频地址:尚硅谷大数据Spark教程从入门到精通_哔哩哔哩_bilibili 尚硅谷大数据技术Spark教程-笔记01[Spark(概述.快速上手.运行环境.运行架构)] 尚硅谷大数据技术Spark教 ...

  8. STM32H743+Cube-Keil上移植RTX5实时系统

    文章目录 一.前言 二.CubeMX 2.1.RCC 与 Clock Configuration 2.2.SYS 2.3.GPIO 2.4.DEBUG 2.5.Project Manager 三.Ke ...

  9. STM32H743开发板移植micropython并外扩32M的SQPI flash和32M的SDRAM

    文章目录 一.搭建编译环境 二.修改源码 1.复制源码 2.修改源码 2.1修改mpconfigboard.h文件 2.2修改stm32h7xx_hal_conf.h文件 2.3修改pins.csv文 ...

最新文章

  1. wdcp php5.3 pdo_mysql,WDCP常用组件(memcache、mysqli、PDO_MYSQL、mysql innodb、libmcrypt、php zip)的安装方法...
  2. 开发Android必知的工具
  3. RedHat已更改其开源许可规则
  4. python gevent缺点_python的flask框架结合gevent性能反而大幅度下降?
  5. 同时买票是怎么实现的_刷脸进站,语音买票!广州地铁这波操作666~
  6. 如何在我的世界里打造一台计算机,在《我的世界》里从零打造一台计算机有多难?...
  7. P2577 [ZJOI2005]午餐
  8. 揭秘.NET Core剪裁器背后的技术
  9. 历史精华文章分类汇总,祝大家中秋快乐!
  10. php 分布式 session,浅析PHP分布式中Redis实现Session的方法
  11. SQL的简单增、删、改
  12. 探究:数字孪生是如何赋能智慧能源信息化领域系统发展的?
  13. 华为ensp(telnet)实验
  14. 2018WPS暑期实习生web前端笔试题
  15. 田洪川(天轰穿)老师谈.NET学习:将励志和教学结合起来
  16. 微信小游戏马甲包过审策略
  17. 实现HTML转PDF 多个PDF合并
  18. 利用 yaml-cpp 开源库读写 yaml 配置文件—— 读写部分
  19. linux服务被植入挖矿(2t3ik与ddgs)解决方式
  20. nett服务器接收消息的方法,C#(一沙框架) .net core3.1 SignalR 服务端推送消息至客户端的实现方法,用弹窗插件进行显示,非常美观实用...

热门文章

  1. 从0开始Vue2集成Bootstrap4(1)
  2. docker探索-docker安装运行tomcat(六)
  3. Gartner:人工智能将把部分专业工作变成公用事业
  4. 眼下发展最迅猛的十家网络安全公司
  5. Object-C中方法
  6. Mongodb定时备份脚本和清除脚本
  7. IMail邮件服务-1
  8. 为什么大部分的C/C++码农都成不了高级工程师?真实原因是缺少核心能力!
  9. 要是不会用数据,算什么IT产品经理?
  10. Python游戏编程入门,让你秒变电脑大神!