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

相关推荐
Miuney_MAX5 小时前
【单片机】之HC32F460中断向量选择
单片机·嵌入式硬件
XINVRY-FPGA8 小时前
XC3S1000-4FGG320I Xilinx AMD Spartan-3 SRAM-based FPGA
嵌入式硬件·机器学习·计算机视觉·fpga开发·硬件工程·dsp开发·fpga
猫猫的小茶馆10 小时前
【ARM】ARM的介绍
c语言·开发语言·arm开发·stm32·单片机·嵌入式硬件·物联网
猫猫的小茶馆10 小时前
【PCB工艺】数模电及射频电路基础
驱动开发·stm32·单片机·嵌入式硬件·mcu·物联网·pcb工艺
点灯小铭10 小时前
基于单片机的智能药物盒设计与实现
数据库·单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
梓德原11 小时前
【基础】详细分析带隙型稳压电路的工作原理
单片机·嵌入式硬件·物联网
国科安芯12 小时前
航天医疗领域AS32S601芯片的性能分析与适配性探讨
大数据·网络·人工智能·单片机·嵌入式硬件·fpga开发·性能优化
小李做物联网12 小时前
【物联网毕业设计】60.1基于单片机物联网嵌入式项目程序开发之图像厨房监测系统
stm32·单片机·嵌入式硬件·物联网
贝塔实验室13 小时前
新手如何使用Altium Designer创建第一张原理图(三)
arm开发·单片机·嵌入式硬件·fpga开发·射频工程·基带工程·嵌入式实时数据库
@good_good_study13 小时前
STM32 ADC多通道采样实验
stm32·单片机·嵌入式硬件