STM32 printf 重定向到CAN

最近在调试一款电机驱动板 使用的是CAN总线而且板子上只有一个CAN

想移植Easylogger到上面试试easylogger的效果,先实现pritnf的重定向功能来打印输出

只需要添加以下代码即可实现

代码

c 复制代码
#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);
}
c 复制代码
/* 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 ;
#else
  uint32_t CAN_FRAME_DL = FDCAN_DLC_BYTES_64; /* FDCAN 默认使用64*/
#endif

  TxHeader.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;
#else
  frame_length = 64;
#endif

  transmission_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测试和应用的分离

c 复制代码
/**
 * @brief 输出日志任务
 * @param argument 
 */
void USER_LOG_Task(void *argument)
{
    for (;;)
    {
        #ifdef USER_LOG_ENABLE
        FDCAN_printf("\n Hellow world!\n");
        #endif
        osDelay(1000);

	
    }
}

实验效果

参考文章

STM32 printf 重定向到USB-CDC

相关推荐
嵌引工坊7 小时前
Proteus如何创建第一个工程
c语言·单片机·嵌入式硬件·测试工具·proteus
集和诚JHCTECH7 小时前
【案例分享】KMDA-7611-S001--高性能嵌入式电脑助力双臂轮式人形机器人应用
人工智能·嵌入式硬件·机器人
茯苓gao7 小时前
小孙学变频学习笔记(二)变频器的逆变电路
笔记·嵌入式硬件·学习
楼台的春风7 小时前
【Linux驱动开发 ---- 2.1_深入理解 Linux 内核架构】
linux·c++·人工智能·驱动开发·嵌入式硬件·ubuntu·架构
想搞嵌入式的小白8 小时前
STM32的串口通信
stm32·单片机·嵌入式硬件
、我是男生。9 小时前
STM32和树莓派的分工
stm32·单片机·嵌入式硬件
Wangshanjie_9810 小时前
【STM32】启动流程
stm32
Java小白,一起学习11 小时前
ESP32开发入门
单片机·物联网·iot
物联网嵌入式小冉学长14 小时前
12.UDP客户端
网络·单片机·网络协议·udp·嵌入式
Peter_Deng.14 小时前
单片机 - STM32软件模拟IIC通信中delay_us的使用规律全解析(含口诀与源码详解)
stm32·单片机·嵌入式硬件