嵌入式技术william hill官网
直播中

张莉

7年用户 1276经验值
私信 关注
[经验]

在STM32F407 Disc1上使用RT-Thread CDC的步骤教程

1 测试环境

2 新建工程
2.1 新建设置

由于STM32F407-Disc1 UART1默认的PA9,PA10已经被其他外设占用,改成PB6,PB7
使用板载ST-Link下载调试
后面更新系统时钟会用到
2.2 编译测试
编译没有问题

控制台

1.3 本地git仓库追踪
LT@DESKTOP-Win10 MINGW64 /e/WorkSpaces/RT_Thread_Studio/STM32F407_CDC (master)
$ git lg
* a95a8f1 - (HEAD -> master) chore: creat the default project with RT-Studio (26 seconds ago)
3 CubeMX 配置
打开工程下的CubeMx Setting
3.1 配置外部高速时钟

3.2 使能 UART1

3.3 使能USB Device

这里不需要使能默认的USB FS interrupt,drv_u***d.c里会实现
3.4 配置CLK

注意: intput frequency 要选择板子上实际的8MHz,一开始没注意使用了默认的25MHz, 枚举一直不成功
3.5 Project Manager
直接Generate code就可以了

IDE 选择默认的EWARM就行,这个在工程里不使用,会被排除编译!
4 工程的调整
因为新生成的cubemx文件夹源码会被自动加入工程编译,而且头文件位置不会自动加入,所以不调整工程配置的话,编译会出现很多问题。

方法一: 手动调整,比较麻烦,而且后面每次保存RT-Thread Setting,都会更新scons update,导致手动配置的被去掉,除非你自己在相应文件下添Sconscripts
方法二:关闭CubeMx, RT-studio 会自动帮你添加Sconscripts。这个方法也是刚刚发现的隐藏彩蛋!

在关闭前,先暂存了生成的刚刚生成的cubemx文件,关闭CubeMX后会发现RT_Thread_Studio偷偷做了不少事情

更新工程
生成的main函数加__WEAK修饰,避免冲突

更新drv_clk.c 使用CubeMX生成的SystemClock_Config

重命名 drivers/stm32f4xx_hal_conf.h -> drivers/stm32f4xx_hal_conf_bak.h,使用CubeMX生成的 drivers/stm32f4xx_hal_conf.h

贴心地自动增加了Sconsript配合工程管理,这样相应的path 和source就不需要我们手动配置了

这里说明一下, application/main.c 和 cubemx/Src/main.c虽然同名,但是路径不同,并不冲突。
这样我们就不需要像之前一样拷贝CubeMX生成的SystemClock_Config到board.c或者其他文件里了

编译一下,一次性通过:

总之一句话,RT_Thread_Studio这次配合最新的源码把人性化做到了极致,赞一个!
5 CDC 配置
首先看下board.h 中关于如何配置u*** device的提示,下面按照这些步骤逐步对一下!
5.1 USB driver framework
就是RT-Thread自带的USB框架了,需要在RT-Thread Setting开启一下,并选择我们需要的CDC协议

保存更新后,会发现component里已经新加了USB 内核 和 CDC协议类的编译

5.2 定义 u*** device相关的宏
在默认的RT-Thread Setting没有配置的情况下,需要手动打开board.h关闭的宏 BSP_USING_USBDEVICE

5.3 PCD 初始化
HAL_PCD_MspInit 定义在CubeMX生成的stm32f4xx_hal_msp.c中

5.4 SystemClock_Config
工程的调整章节已经说明,RT_Thread_Studio已经帮我们做好了。
5.5 HAL_PCD_MODULE_ENABLED
在配置了USB外设的情况下,CubeMX生成的 drivers/stm32f4xx_hal_conf.h里,宏HAL_PCD_MODULE_ENABLED默认已经打开。

5.6 编译测试
编译没有问题,MicroUSB连接PC,在设备管理器里出现了新的COM

就是枚举时间有些太久了,大概8s左右,不太能接受
再看下Console,u***device 和 vcom 线程任务正常运行

6 CDC ECHO测试
设备枚举正常,参考串口使用实例->串口接收不定长数据实现一个Echo测试一下效果。改动部分如下:
#define SAMPLE_UART_NAME                 "vcom"
/* 数据解析线程 */
static void data_parsing(void)
{
    char ch;
    char data[ONE_DATA_MAXLEN];
    static char i = 0;
    while (1)
    {
        ch = uart_sample_get_char();
      //  rt_device_write(serial, 0, &ch, 1);
        if(ch == DATA_CMD_END)
        {
            data[i++] = '
';
            data[i++] = '
';
            rt_device_write(serial,0,data,i);
            i = 0;
            continue;
        }
        i = (i >= ONE_DATA_MAXLEN-2) ? ONE_DATA_MAXLEN-2 : i;
        data[i++] = ch;
    }
}
再次编译测试:
1 在 vcom 设备枚举成功后,输入 uart_data_sample 命令测试
2 echo测试
我使用的是UartAssist(其他串口工具都行),打开设备并设置自动发生附加位0x0D('r'),也就是代码里的DATA_CMD_END

发送字符,echo成功


更多回帖

发帖
×
20
完善资料,
赚取积分