打印
[其他ST产品]

STM32CubeMX 真的太好用了

[复制链接]
楼主: lalallalala
手机看帖
扫描二维码
随时随地手机跟帖
21
lalallalala|  楼主 | 2022-1-28 15:43 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
第三步,完善发送数据接口。发送接口比较简单,经阅读 ST 对虚拟串口的实现了解到往 USB 发送数据,使用 CDC_Transmit_FS 接口即可,所以实现如下:
int vSerialPutString(xComPortHandle xPort, signed char *pMessage, unsigned short len)
{
        xPort = xPort;

retry:

        if(0x00 != CDC_Transmit_FS(pMessage, len))
        {
                osDelay(10);
                goto retry;
        }

        return 0x00;
}

使用特权

评论回复
22
lalallalala|  楼主 | 2022-1-28 15:45 | 只看该作者
请放过不要吐槽这里的 goto,哈哈哈,这里一定要去检查 CDC_Transmit_FS 接口的返回值,刚开始我只检查了,没有动作,后面发现会漏字符,后面才把 retry 加上去的,然后就使用了 goto,我觉的这样很简洁也好理解,当然加上超时机制就更好了,这里勉强先这样吧

使用特权

评论回复
23
lalallalala|  楼主 | 2022-1-28 15:46 | 只看该作者
第四步,对接数据接收。这里稍微有点麻烦,CDC 的数据是在 CDC_Receive_FS 以 callback 的方式传上来的,应该是使用中断接收,我们串口终端是一个线程通过 xSerialGetChar 接口来获取数据的,这里当然首先想到的就是使用 FreeRTOS 提供的 queue 功能了,但最后发现 queue 只能一个个入列,效果很不理想,会漏字符,如果只传递数据的指针过来的话,又要不停的 malloc 和 free 内存我想效率也不会太高,这里索性搬出来我经常使用的一个 fifo 实现,配合 FreeRTOS 任务通知功能,也算是达到预期吧,最终它们的实现如下:

使用特权

评论回复
24
lalallalala|  楼主 | 2022-1-28 15:47 | 只看该作者
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
        /* USER CODE BEGIN 6 */
        extern TaskHandle_t xConsoleHandle;
        uint32_t count = 0x00;
        BaseType_t xHigherPriorityTaskWoken;
               
        USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
        USBD_CDC_ReceivePacket(&hUsbDeviceFS);
       
        count = kfifo_put(&cdcRxFifo, Buf, *Len);
       
        if(        count != *Len)
        {
                CDC_Transmit_FS((uint8_t*) "cdc rx buffer full!!!", strlen("cd rx buffer full!!!"));
        }
       
        if(NULL != xConsoleHandle)
        {
                vTaskNotifyGiveFromISR(xConsoleHandle, &xHigherPriorityTaskWoken);
       
                if(xHigherPriorityTaskWoken)
                {
                        taskYIELD();
                }
        }
       
        return (USBD_OK);
        /* USER CODE END 6 */
}

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

        xPort = xPort;

        if(i == 0x00)
        {
                ulTaskNotifyTake(pdTRUE, timeout);

                i = kfifo_len(&cdcRxFifo);
        }

        if(0x01 == kfifo_get(&cdcRxFifo, cRxedChar, 0x01))
        {
                i--;
        }

        return pdPASS;
}

使用特权

评论回复
25
lalallalala|  楼主 | 2022-1-28 15:47 | 只看该作者
到这里就介绍完啦,最终串口终端效果图如下:

使用特权

评论回复
26
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

使用特权

评论回复
27
10299823| | 2022-2-20 13:27 | 只看该作者
STM32CubeMX可以用的库有几种

使用特权

评论回复
28
sanxingnote7| | 2022-2-20 15:40 | 只看该作者
用STM32CubeMX怎么配置串口的接收中断

使用特权

评论回复
29
selongli| | 2022-2-21 15:40 | 只看该作者
stm32cubemx 怎么设置debug

使用特权

评论回复
30
pl202| | 2022-2-21 16:05 | 只看该作者
为什么stm32cubemx中没有集成emwin

使用特权

评论回复
31
pentruman| | 2022-2-21 16:33 | 只看该作者
用STM32CubeMx创建的FreeRTOS可以运行多少个实例

使用特权

评论回复
32
janewood| | 2022-2-21 17:01 | 只看该作者
STM32CubeMX5.3只能用最新的库吗?

使用特权

评论回复
33
laocuo1142| | 2022-2-21 17:06 | 只看该作者
能不能一次发完

使用特权

评论回复
34
xiaoyaodz| | 2022-2-21 17:42 | 只看该作者
用过STM32CubeMX库

使用特权

评论回复
35
houjiakai| | 2022-2-21 18:14 | 只看该作者
大大缩短了我们的开发时间。

使用特权

评论回复
36
vivilyly| | 2022-2-21 18:46 | 只看该作者
STM32CubeMX安装后怎么有乱码

使用特权

评论回复
37
updownq| | 2022-2-21 19:18 | 只看该作者
stm32 cubemx 实例在哪个目录

使用特权

评论回复
38
mikewalpole| | 2022-2-21 20:14 | 只看该作者
stm32cubemx是开发软件还是嵌入式软件

使用特权

评论回复
39
claretttt| | 2022-2-21 21:07 | 只看该作者
如何把stm32cubemx的固件库更新

使用特权

评论回复
40
uiint| | 2022-2-21 21:34 | 只看该作者
如何利用STM32CubeMX进行STM32开发

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则