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

相关推荐
笨笨饿8 小时前
29_Z变换在工程中的实际意义
c语言·开发语言·人工智能·单片机·mcu·算法·机器人
xiangw@GZ9 小时前
低功耗应用:BUCK的输入与输出环路
嵌入式硬件
张同学0310 小时前
220V 转 12V/5V 电源输入电路设计笔记
笔记·嵌入式硬件·硬件工程
清风66666611 小时前
基于单片机的智能药物盒设计与实现
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
李永奉11 小时前
杰理芯片SDK-详细讲解AC695N/AC696N芯片SDK中APP模式流程
单片机·嵌入式硬件·物联网·语音识别
笨笨饿11 小时前
30_泰勒级数
c语言·stm32·嵌入式硬件·线性代数·机器学习·自动化·概率论
季鹏EthanJ12 小时前
VCC上电慢导致STM32无法复位
stm32·单片机·嵌入式硬件·上电复位故障·bor
点灯小铭12 小时前
基于单片机的太阳能12V蓄电池光控时控路灯智能控制器设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
LCG元12 小时前
STM32实战:基于STM32F103的智能体重秤(HX711+OLED)
stm32·单片机·嵌入式硬件
小白zlm13 小时前
预畸变双线性变换
单片机·嵌入式硬件·算法·电机控制