STM32 printf 重定向到CAN

最近在调试一款电机驱动板 使用的是CAN总线而且板子上只有一个CAN
想移植Easylogger到上面试试easylogger的效果,先实现pritnf的重定向功能来打印输出
只需要添加以下代码即可实现

代码

#include <stdarg.h>
uint8_t FDCAN_UserTxBuffer[512];
void FDCAN_printf(const char *format, ...)
{va_list args;uint32_t length;va_start(args, format);length = vsnprintf((char *)FDCAN_UserTxBuffer, 512, (char *)format, args);va_end(args);FDCAN_Send_Data(0x100,FDCAN_UserTxBuffer,length);
}
/* CAN 发送一帧数据 */
void FDCAN_Send_Message(uint32_t id, uint8_t *buf, uint8_t len)
{FDCAN_TxHeaderTypeDef TxHeader;/* 配置Tx缓冲区消息 */TxHeader.Identifier = id;                /* 报文ID */TxHeader.IdType = FDCAN_EXTENDED_ID;     /* 扩展ID模式  */TxHeader.TxFrameType = FDCAN_DATA_FRAME; /* 数据帧 */#if defined(CLASSIC_CAN)if (len >= 8)len = 8;uint32_t CAN_FRAME_DL = len ;
#elseuint32_t CAN_FRAME_DL = FDCAN_DLC_BYTES_64; /* FDCAN 默认使用64*/
#endifTxHeader.DataLength = CAN_FRAME_DL;              /* 数据帧长度 */TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE; /*发送节点错误 */TxHeader.BitRateSwitch = FDCAN_BRS_OFF;          /* 无波特率切换 */TxHeader.FDFormat = CAN_MODE;                    /* CAN模式*/TxHeader.TxEventFifoControl = FDCAN_STORE_TX_EVENTS;TxHeader.MessageMarker = 0x01;/* 发送缓冲区消息 */HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, buf);while (HAL_FDCAN_GetTxFifoFreeLevel(&hfdcan1) != 3); /*等待发送完成*/
}
/* CAN发送多帧数据 */
void FDCAN_Send_Data(uint32_t id, uint8_t *buf, uint32_t len)
{uint32_t transmission_times = 0; /* 发送次数 */uint32_t remian_bytes = 0;       /* 剩余字节 */uint32_t frame_length = 0;       /* 帧长度 */#if defined(CLASSIC_CAN)frame_length = 8;
#elseframe_length = 64;
#endiftransmission_times = len / frame_length;remian_bytes = len % frame_length;int i = 0;while (i < transmission_times){FDCAN_Send_Message(id, buf + i * frame_length, len);i++;}if (remian_bytes > 0){FDCAN_Send_Message(id, buf + transmission_times * frame_length, remian_bytes);}
}

定义了一个宏定义来实现log测试和应用的分离

/*** @brief 输出日志任务* @param argument */
void USER_LOG_Task(void *argument)
{for (;;){#ifdef USER_LOG_ENABLEFDCAN_printf("\n Hellow world!\n");#endifosDelay(1000);}
}

实验效果

在这里插入图片描述

参考文章

STM32 printf 重定向到USB-CDC

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/24693.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小程序 UI 风格魅力非凡

小程序 UI 风格魅力非凡

[创业之路-114] :互联网时代下的扁平化管理趋势与面临的挑战

目录 前言&#xff1a;扁平化管理的时代背景 一、扁平化管理的定义 二、扁平化管理的特点 三、扁平化管理的实施 四、扁平化管理的优势 五、偏平化管理的缺点 六、扁平化管理面临的挑战 七、扁平化管理条件和配套措施 7.1 扁平化管理的条件 7.2 扁平化管理的配套措施…

五分钟上手IoT小程序

五分钟上手IoT小程序 IoT小程序框架搭建开发环境首先安装NodeJs安装NodeJs验证安装成功 安装cnpm 安装VSCode 开发IDE下载开发IDE安装开发IDE安装框架脚手架 下载模拟器创建工程项目应用编译(打包构建) VSCode 开发IDE安装插件通过开发插件创建工程编译工程debug编译编译太慢问…

13、SpringBoot 源码分析 - 自动配置深度分析六

SpringBoot 源码分析 - 自动配置深度分析六 refresh和自动配置大致流程AutoConfigurationImportSelector的fireAutoConfigurationImportEvents通知自动配置导入事件AutoConfigurationGroup的selectImports封装成Entry返回MyAutoConfiguration自动配置类创建META-INF文件夹和文件…

3、前端本地环境搭建

前端本地环境搭建 安装node [node下载地址] https://nodejs.org/en/download/prebuilt-installer 选择LTS的版本进行下载 下载后直接双击点击&#xff0c;选择自己想要安装到的目录一直点下一步即可&#xff08;建议不要安装到c盘&#xff09; 安装完成后配置环境变量&am…

Uber 提升 Presto 集群稳定性的 GC 调优方法

Presto at Uber Uber 利用开源的 Presto 查询各种数据源&#xff0c;无论是流式还是归档数据。Presto 的多功能性赋予我们做出基于数据的明智商业决策的能力。我们在两个地区运行了大约20个 Presto 集群&#xff0c;总共超过10,000个节点。我们有大约12,000个每周活跃用户&…

HIP的应用可移植性

Application portability with HIP — ROCm Blogs (amd.com) 许多科学应用程序在配备AMD的计算平台和超级计算机上运行&#xff0c;包括Frontier&#xff0c;这是世界上第一台Exascale系统。这些来自不同科学领域的应用程序通过使用Heterogeneous-compute Interface for Portab…

Socket编程学习笔记之TCP与UDP

Socket&#xff1a; Socket是什么呢&#xff1f; 是一套用于不同主机间通讯的API&#xff0c;是应用层与TCP/IP协议族通信的中间软件抽象层。 是一组接口。在设计模式中&#xff0c;Socket其实就是一个门面模式&#xff0c;它把复杂的TCP/IP协议族隐藏在Socket接口后面&#…

【Python报错】已解决ModuleNotFoundError: No module named ‘xxx‘ in Jupyter Notebook

解决Python报错&#xff1a;ModuleNotFoundError: No module named ‘xxx’ in Jupyter Notebook 在使用Jupyter Notebook进行数据分析或科学计算时&#xff0c;我们经常需要导入各种Python模块。如果你遇到了ModuleNotFoundError: No module named xxx的错误&#xff0c;这通常…

STM32F103C8T6基于HAL库移植uC/OS-III

文章目录 一、建立STM32CubeMX工程二、移植1、 uC/OS-III源码2、移植过程 三、配置相关代码1、bsp.c和bsp.h2、main.c3、修改启动代码4、修改app_cfg.h文件5、修改includes.h文件6、修改lib_cfg.h文件 四、编译与烧录总结参考资料 学习嵌入式实时操作系统&#xff08;RTOS&…

Django 里实现表格内容上传

先看效果图&#xff1a; 当没有添加数据&#xff0c;就按 提交 键就会出现报错 下面是操作步骤 1. 先在 views.py 文件里做添加 # 在 views.py class AssetModelForm(forms.ModelForm):#newField forms.CharField()class Meta:model models.AssetSet fields [name, pri…

基于zyyo主页与無名の主页合并二改,一款适合新手的个人主页

pengzi主页&#x1f64b; 项目地址 简洁的布局&#xff1a;主页应该有清晰的布局&#xff0c;包括一个简洁的导航菜单和易于浏览的内容区域。避免使用过多的花哨效果&#xff0c;保持页面简洁明了。 个人资料介绍&#xff1a;在主页上展示一段简短的个人介绍&#xff0c;包括…

电机专用32位MCU PY32MD310,Arm® Cortex-M0+内核

PY32MD310是一颗专为电机控制设计的MCU&#xff0c;非常适合用做三相/单相 BLDC/PMSM 的主控芯片。芯片采用了高性能的 32 位 ARM Cortex-M0 内核&#xff0c;QFN32封装。内置最大 64 Kbytes flash 和 8 Kbytes SRAM 存储器&#xff0c;最高48 MHz工作频率&#xff0c;多达 16 …

C++全栈聊天项目(21) 滚动聊天布局设计

滚动聊天布局设计 我们的聊天布局如下图 最外层的是一个chatview&#xff08;黑色&#xff09;&#xff0c; chatview内部在添加一个MainLayout&#xff08;蓝色&#xff09;&#xff0c;MainLayout内部添加一个scrollarea(红色)&#xff0c;scrollarea内部包含一个widget&…

西米支付:刷卡手续费进入高费率时代! 十多家支付机构公布最新收费标准

《非银行支付机构监督管理条例》自5月1日施行以来&#xff0c;越来越多支付机构落实收费透明化。 支付界注意到&#xff0c;日前&#xff0c;拉卡拉、银联商务两家持牌支付公司公布了新的收单业务收费标准。 拉卡拉在其官网公布了最新的“收费项目及收费标准公示”&#xff0…

GSS7000卫星导航模拟器结合RTKLIB 接收NTRIP网络RTCM数据以输出RS232

本文聚焦&#xff0c;使用GSS7000仿真GNSS NTRIP&#xff0c;利用开源工具RTKLIB 作为NTRIP Client 接受GSS7000仿真的RTCM数据&#xff0c; 并通过STRSVR将收到的RTCM数据通过USB-RS232数据线吐出&#xff0c;并转给DUT&#xff0c;让其获得RTK -FIXED 固定解。 废话不多说&a…

独享IP VS 原生IP,二者的区别与定义详解

原生IP&#xff1a;原生IP是指由Internet服务提供商&#xff08;ISP&#xff09;直接分配给用户的IP地址&#xff0c;这些IP地址通常反映了用户的实际地理位置和网络连接。原生IP是用户在其所在地区或国家使用的真实IP地址&#xff0c;与用户的物理位置直接相关。在跨境电商中&…

2024教资认定报名流程,点赞收藏!

2024年要进行教资认定的宝子们提早准备 &#x1f525;教资认定网上报名流程概览 一、进入教资认定网报入口 二、进行实名核验 三、申请网报时间查询 四、个人信息维护 五、认定申请报名 &#x1f525;教资认定所需材料 1⃣️身份证 2⃣️户口本&#xff0f;居住证&#xff0f;学…

基本 MOSFET 恒流源

恒流源在电路分析练习和网络定理中占有重要地位&#xff0c;然后它们似乎或多或少消失了。。。除非你是IC设计师。尽管在典型 PCB 设计中很少遇到&#xff0c;但电流源在模拟 IC 领域却无处不在。这是因为它们 1) 用于偏置&#xff0c;2) 作为有源负载。 偏置&#xff1a; 用作…

Docker搭建可道云

Docker搭建可道云&#xff08;存储&#xff09; 文章目录 Docker搭建可道云&#xff08;存储&#xff09;介绍资源列表基础环境一、安装Docker二、配置Docker加速器三、搭建可道云私有云盘3.1、编写Dockerfile3.2、上传资源到指定目录3.3、查看目录下所有资源 四、构建镜像五、…