CANopen | 移植01 - STM32H743 + Canfestival的移植并让FDCAN1运行CANopen协议
文章目录
- 一、前言
- 二、移植前的准备
- 三、移植
- 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
二、移植前的准备
- 移植CANopen协议之前,需要准备一个已经完成CAN底层驱动的工程。我是基于之前分享的工程上进行CANopen协议的移植的,所以需要下载该工程的代码:
STM32H743+CubeMX-双路FDCAN同时工作的终极方案(裸机) - 下载我的提供的代码。里面含我编写的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协议相关推荐
- U-Boot移植教程之二:移植
内容来自 韦东山<嵌入式Linux应用开发完全手册> 一.U-Boot移植 开发板smdk2410的配置适用于大多数S3C2410单板,或是只需要极少的修改即可使用.但是目前U-Boot中 ...
- 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 ...
- GD32上FAL Flash分区驱动移植及Easyflash与FlashDB移植说明
GD32上FAL Flash分区驱动移植及Easyflash与FlashDB移植说明 效果 移植前提 下载源码 移植过程 加入以下文件及文件夹到工程目录和工程 将demo目录下的接口文件做下修改 修改 ...
- 嵌入式uboot移植之从uboot官方移植
注:以下内容来自朱老师物联网大讲堂课件 1. 选择合适的官方原版uboot 1.1 官方原版uboot的版本 (1)版本号.刚开始是1.3.4,后来变成2009.08 (2)新版和旧版的差别.uboo ...
- lora 移植到android_LoRa---官方例程移植
SX1278芯片上移植Semtech官方PING-PONG例程 移植环境:keil5.20 硬件平台:stm32f051+sx1278 2.准备文件: SX12xxDrivers-V2.1.0文件夹下 ...
- Linux系统移植:原厂 Kernel 移植到开发板
文章目录 Linux系统移植:原厂 Kernel 移植到开发板 一.获取原厂内核并编译 二.内核启动测试 三.添加自己板子文件 3.1 板子配置文件 3.2 板子设备树 3.3 编译 四.重要配置修改 ...
- 尚硅谷大数据技术Spark教程-笔记01【Spark(概述、快速上手、运行环境、运行架构)】
视频地址:尚硅谷大数据Spark教程从入门到精通_哔哩哔哩_bilibili 尚硅谷大数据技术Spark教程-笔记01[Spark(概述.快速上手.运行环境.运行架构)] 尚硅谷大数据技术Spark教 ...
- STM32H743+Cube-Keil上移植RTX5实时系统
文章目录 一.前言 二.CubeMX 2.1.RCC 与 Clock Configuration 2.2.SYS 2.3.GPIO 2.4.DEBUG 2.5.Project Manager 三.Ke ...
- STM32H743开发板移植micropython并外扩32M的SQPI flash和32M的SDRAM
文章目录 一.搭建编译环境 二.修改源码 1.复制源码 2.修改源码 2.1修改mpconfigboard.h文件 2.2修改stm32h7xx_hal_conf.h文件 2.3修改pins.csv文 ...
最新文章
- wdcp php5.3 pdo_mysql,WDCP常用组件(memcache、mysqli、PDO_MYSQL、mysql innodb、libmcrypt、php zip)的安装方法...
- 开发Android必知的工具
- RedHat已更改其开源许可规则
- python gevent缺点_python的flask框架结合gevent性能反而大幅度下降?
- 同时买票是怎么实现的_刷脸进站,语音买票!广州地铁这波操作666~
- 如何在我的世界里打造一台计算机,在《我的世界》里从零打造一台计算机有多难?...
- P2577 [ZJOI2005]午餐
- 揭秘.NET Core剪裁器背后的技术
- 历史精华文章分类汇总,祝大家中秋快乐!
- php 分布式 session,浅析PHP分布式中Redis实现Session的方法
- SQL的简单增、删、改
- 探究:数字孪生是如何赋能智慧能源信息化领域系统发展的?
- 华为ensp(telnet)实验
- 2018WPS暑期实习生web前端笔试题
- 田洪川(天轰穿)老师谈.NET学习:将励志和教学结合起来
- 微信小游戏马甲包过审策略
- 实现HTML转PDF 多个PDF合并
- 利用 yaml-cpp 开源库读写 yaml 配置文件—— 读写部分
- linux服务被植入挖矿(2t3ik与ddgs)解决方式
- nett服务器接收消息的方法,C#(一沙框架) .net core3.1 SignalR 服务端推送消息至客户端的实现方法,用弹窗插件进行显示,非常美观实用...