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

相关推荐
小亮亮虫1 小时前
LwIP UDP RAW
单片机·网络协议·udp
仰望星空的凡人2 小时前
【BUG排查】基于RH850F1KMS1的主控出现系统中断错误,调试FEIC的值为0x11
单片机·bug·rh850·renesas
螺丝钉的扭矩一瞬间产生高能蛋白2 小时前
STM32电机控制基础知识
stm32·单片机·嵌入式硬件·嵌入式软件·直流有刷电机控制·定时器互补输出·定时器死区控制刹车输入
沐欣工作室_lvyiyi3 小时前
基于腾讯云的物联网导盲助手设计与实现(论文+源码)
单片机·物联网·云计算·毕业设计·腾讯云·导盲杖
Blossom.1184 小时前
用一颗MCU跑通7B大模型:RISC-V+SRAM极致量化实战
人工智能·python·单片机·嵌入式硬件·opencv·机器学习·risc-v
hazy1k5 小时前
K230基础-录放音频
人工智能·stm32·单片机·嵌入式硬件·音视频·k230
SundayBear13 小时前
基于STM32的RT-Thread移植
单片机·嵌入式硬件
R6bandito_14 小时前
STM32中printf的重定向详解
开发语言·经验分享·stm32·单片机·嵌入式硬件·mcu
清风66666615 小时前
基于单片机的元胞自动机仿真系统设计
单片机·嵌入式硬件·毕业设计·课程设计
千千道15 小时前
利用keil +RASC给瑞萨RA8D1编译烧写程序
单片机·嵌入式硬件·mcu·物联网