[其他ST产品] STM32CubeMX 真的太好用了

[复制链接]
1907|41
 楼主| lalallalala 发表于 2022-1-28 15:43 | 显示全部楼层
第三步,完善发送数据接口。发送接口比较简单,经阅读 ST 对虚拟串口的实现了解到往 USB 发送数据,使用 CDC_Transmit_FS 接口即可,所以实现如下:
  1. int vSerialPutString(xComPortHandle xPort, signed char *pMessage, unsigned short len)
  2. {
  3.         xPort = xPort;

  4. retry:

  5.         if(0x00 != CDC_Transmit_FS(pMessage, len))
  6.         {
  7.                 osDelay(10);
  8.                 goto retry;
  9.         }

  10.         return 0x00;
  11. }
 楼主| lalallalala 发表于 2022-1-28 15:45 | 显示全部楼层
请放过不要吐槽这里的 goto,哈哈哈,这里一定要去检查 CDC_Transmit_FS 接口的返回值,刚开始我只检查了,没有动作,后面发现会漏字符,后面才把 retry 加上去的,然后就使用了 goto,我觉的这样很简洁也好理解,当然加上超时机制就更好了,这里勉强先这样吧
 楼主| lalallalala 发表于 2022-1-28 15:46 | 显示全部楼层
第四步,对接数据接收。这里稍微有点麻烦,CDC 的数据是在 CDC_Receive_FS 以 callback 的方式传上来的,应该是使用中断接收,我们串口终端是一个线程通过 xSerialGetChar 接口来获取数据的,这里当然首先想到的就是使用 FreeRTOS 提供的 queue 功能了,但最后发现 queue 只能一个个入列,效果很不理想,会漏字符,如果只传递数据的指针过来的话,又要不停的 malloc 和 free 内存我想效率也不会太高,这里索性搬出来我经常使用的一个 fifo 实现,配合 FreeRTOS 任务通知功能,也算是达到预期吧,最终它们的实现如下:
 楼主| lalallalala 发表于 2022-1-28 15:47 | 显示全部楼层
  1. static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
  2. {
  3.         /* USER CODE BEGIN 6 */
  4.         extern TaskHandle_t xConsoleHandle;
  5.         uint32_t count = 0x00;
  6.         BaseType_t xHigherPriorityTaskWoken;
  7.                
  8.         USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
  9.         USBD_CDC_ReceivePacket(&hUsbDeviceFS);
  10.        
  11.         count = kfifo_put(&cdcRxFifo, Buf, *Len);
  12.        
  13.         if(        count != *Len)
  14.         {
  15.                 CDC_Transmit_FS((uint8_t*) "cdc rx buffer full!!!", strlen("cd rx buffer full!!!"));
  16.         }
  17.        
  18.         if(NULL != xConsoleHandle)
  19.         {
  20.                 vTaskNotifyGiveFromISR(xConsoleHandle, &xHigherPriorityTaskWoken);
  21.        
  22.                 if(xHigherPriorityTaskWoken)
  23.                 {
  24.                         taskYIELD();
  25.                 }
  26.         }
  27.        
  28.         return (USBD_OK);
  29.         /* USER CODE END 6 */
  30. }

  31. int xSerialGetChar(xComPortHandle xPort, signed char *cRxedChar, int timeout)
  32. {
  33.         static uint32_t i = 0x00;

  34.         xPort = xPort;

  35.         if(i == 0x00)
  36.         {
  37.                 ulTaskNotifyTake(pdTRUE, timeout);

  38.                 i = kfifo_len(&cdcRxFifo);
  39.         }

  40.         if(0x01 == kfifo_get(&cdcRxFifo, cRxedChar, 0x01))
  41.         {
  42.                 i--;
  43.         }

  44.         return pdPASS;
  45. }
 楼主| lalallalala 发表于 2022-1-28 15:47 | 显示全部楼层
到这里就介绍完啦,最终串口终端效果图如下:

8737061f39fa18bb6d.png
 楼主| lalallalala 发表于 2022-1-28 15:48 | 显示全部楼层
想玩的朋友赶紧去试试吧,欢迎向我留言提问,如果想获取完整工程请到如下链接获取:

https://github.com/Lingminzou/STM32CubeMX-example




版权声明:本文为CSDN博主「潜水企鹅」的原创**,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jxgz_leo/article/details/88600995
10299823 发表于 2022-2-20 13:27 | 显示全部楼层
STM32CubeMX可以用的库有几种
sanxingnote7 发表于 2022-2-20 15:40 | 显示全部楼层
用STM32CubeMX怎么配置串口的接收中断
selongli 发表于 2022-2-21 15:40 | 显示全部楼层
stm32cubemx 怎么设置debug
pl202 发表于 2022-2-21 16:05 | 显示全部楼层
为什么stm32cubemx中没有集成emwin
pentruman 发表于 2022-2-21 16:33 | 显示全部楼层
用STM32CubeMx创建的FreeRTOS可以运行多少个实例
janewood 发表于 2022-2-21 17:01 | 显示全部楼层
STM32CubeMX5.3只能用最新的库吗?
laocuo1142 发表于 2022-2-21 17:06 | 显示全部楼层
能不能一次发完
xiaoyaodz 发表于 2022-2-21 17:42 | 显示全部楼层
用过STM32CubeMX库
houjiakai 发表于 2022-2-21 18:14 | 显示全部楼层
大大缩短了我们的开发时间。
vivilyly 发表于 2022-2-21 18:46 | 显示全部楼层
STM32CubeMX安装后怎么有乱码
updownq 发表于 2022-2-21 19:18 | 显示全部楼层
stm32 cubemx 实例在哪个目录
mikewalpole 发表于 2022-2-21 20:14 | 显示全部楼层
stm32cubemx是开发软件还是嵌入式软件
claretttt 发表于 2022-2-21 21:07 | 显示全部楼层
如何把stm32cubemx的固件库更新
uiint 发表于 2022-2-21 21:34 | 显示全部楼层
如何利用STM32CubeMX进行STM32开发
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部