【stm32】【CDC】printf重定向

Parameter

USB CDC Rx Buffer Size数据通信(接收)定义从PC接收数据的硬件缓冲区大小抗数据突发能力强,减少丢包风险,增加RAM占用节省RAM,但易因处理不及时导致缓冲区溢出、数据丢失
USB CDC Tx Buffer数据通信(发送)定义待发送到PC的数据的临时存储区大小能缓存更多待发送数据,提高发送吞吐率,增加RAM占用节省RAM,但可能导致发送API需等待或阻塞,降低实时性

cubemx直接生成即可。

  MX_GPIO_Init();
  MX_USB_DEVICE_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	CDC_Transmit_FS((uint8_t*)"hello", 5);
    HAL_Delay(1000);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

波特率可以自己设置。

注意:这个功能用cubemx实现几乎不用写任何代码,但是硬件上要做阻抗匹配,记得先检查D+口有没有1.5om上拉和D+D-串联22om,否则有可能出现无法识别设备,同时win10以下好像要去下载驱动,win10和win11无需驱动。

printf重定向

这部分代码放入usbd_cdc_if.c

#include <stdarg.h>

void usb_printf(const char *format, ...)
{
  va_list args;
  uint32_t length;

  va_start(args, format);
  length = vsnprintf((char *)UserTxBufferHS, APP_TX_DATA_SIZE, (char *)format, args);
  va_end(args);
  CDC_Transmit_HS(UserTxBufferHS, length);//这部分注意是不是transmit_fs或者hs
}

这样有一个问题就是不能连续发送。

修改版为阻塞发送。

int fputc(int ch, FILE *f)
{
    uint8_t byte = (uint8_t)ch;
    static uint32_t start_time;
    
    start_time = HAL_GetTick();
	USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDeviceFS.pClassData;
    while (hcdc->TxState != 0) {
        if (HAL_GetTick() - start_time > 1000) break;
        HAL_Delay(1);
    }
    
    CDC_Transmit_FS(&byte, 1);
    return ch;
}
// printf的典型调用链
printf("Hello") 
    → vfprintf(stdout, format, args)
        → _write(STDOUT_FILENO, buffer, length)
            → 底层驱动(你的实现)
高级函数: printf, fprintf, puts
        ↓
中级函数: fwrite, fputs  
        ↓
基础函数: fputc, putc, putchar
        ↓
系统调用: _write, write

有改_write也是同理。

usbd_cdc_if.h放入头文件即可。

usb_printf CDC_Transmit_HS同时使用会出现%s出现问题,可能原因是CDC_Transmit_HS正常使用要提前写length,过长或者过短就会导致问题。

  uint8_t UserTxBuffer[] = "here is usb_printf\r\n";

  while (1)
  {
	  
	  
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	usb_printf("%s nihao\r\n",UserTxBuffer);
	HAL_Delay(1000);
	  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值