RT-Thread Studio 配置使用详细教程
文章目录
- 一、新建工程
- 1.1 创建基于芯片的工程
- 1.1.1 选择创建的rtt版本
- 1.1.2 配置工程基本属性
- 1.1.3 初创工程目录结构
- 1.1.4 修改时钟配置
- 1.1.5 配置调试下载器
- 1.2 创建基于开发板的工程
- 二、配置内核
- 三、配置组件
- 四、配置软件包
- 五、适配配置
- 六、其它问题
一、新建工程
1.1 创建基于芯片的工程
1.1.1 选择创建的rtt版本
rt-thread有标准版和nano版两种版本,标准版支持丰富的软件包和各种组件,而nano版本仅支持msh shell功能,我们本次就创建标准版本的rtt工程,以便后面使用AT组件和mqtt软件包,选择rtt版本如图所示:
也可以使用图标来新建,如图所示:
1.1.2 配置工程基本属性
在上一步点击“RT-Thread项目”后,就进入了工程基本属性的配置界面,如图所示:
图中各项的作用描述如下表:
序号 | 名称 | 描述 |
---|---|---|
① | 工程名 | 指定新建工程的名称。如果不想让此工程保存在默认的工作空间内,可以将此栏下面的使用缺省位置去勾选然后指定工程的保存路径 |
② | 工程模板 | RT-Thread Studio支持两种模板,一种是基于芯片,另一种是基于开发板,基于芯片目前只有ST公司的处理器支持的很好;基于开发板则有很多厂家提供他们的rtt bsp sdk |
③ | RT-Thread内核版本 | 更新了RT-Thread Studio之后,选择最新版本即可 |
④ | 厂商 | RT-Thread Studio支持的芯片厂商,目前ST处理器支持的最好 |
⑤ | 芯片系列 | ST处理器有F1/F3/F4/F7/H7系列的MCU,根据实际情况选择 |
⑥ | 芯片子系列 | 当选择号了芯片系列之后,芯片子系列就会列出该系列芯片的子系列,比如STM32F103系列 |
⑦ | 芯片型号 | 根据芯片系列和芯片子系列就圈定了芯片型号的范围,我们在此范围内找到我们要开发的目标芯片,比如STM32F103ZE |
⑧ | 控制台串口 | 就是msh shell功能使用的串口,这里指向我们板卡上用于输出调试信息的或者其它信息的串口,百问网的调试串口使用的是USART1,引脚是PA9和PA10 |
⑨ | 调试器 | 调试芯片的工具,通常由j-link/st-link/daplink等,根据自己手里面的工具来选择 |
⑩ | 调试接口 | 有JTAG接口和SWD接口,根据板卡的实际设计来选择 |
根据这些信息和我们板卡的实际情况,我们的配置如下图所示:
然后点击完成,等待工程初创成功:
1.1.3 初创工程目录结构
工程初创成功后,得到如下图的工程,其目录结构如图所示:
每项对应的功能描述如下表:
序号 | 名称 | 描述 |
---|---|---|
1 | RT-Thread Settings | RTT Studio内置配置工具,可以配置内核、组件、软件包,并将配置保存生成到工程中 |
2 | CubeMX Settings | RTT Stduio内置STM32CubeMX工具,用以配置ST处理器的外设 |
3 | Includes | 其中展示了此工程包含使用的所有头文件 |
4 | applications | 其中包含了用户开发的应用层的源文件,默认包含了main.c,里面实现了main函数 |
5 | drivers | 里面包含了基于该芯片的外设驱动源文件和头文件,不一定所有的外设都支持,还有待持续维护开发。对于不支持的外设还是要用户自己去实现驱动函数 |
6 | libraries | 基于该芯片的库文件,一般是由厂商提供,RTT Studio将其整理打包放到了工程目录结构中。在ST芯片的工程中有CMSIS和STM32XXX_HAL_Driver,前者是存放CMSIS标准的头文件和库文件,后者是放STM32处理器的HAL库文件 |
7 | linkscripts | 存放该芯片编译时的链接文件 |
8 | rt-thread | rtt的内核文件和组件、软件包源文件,使用RT-Thread Settings配置的内核、组件和软件包对应的源代码会在这一级中生效 |
9 | rtconfig.h | rtt的配置文件,用以表明会用到哪些内核机制、组件和软件包,使用RT-Thread Settings配置后会覆盖之前的改动,所以不建议在rtt studio中手动修改此文件 |
1.1.4 修改时钟配置
在前面初创工程的时候有提示说:默认的时钟使用的是HSI
来配置系统时钟,如果要使用别的时钟源来配置系统时钟就要去修改drv_clk.c
,我们的开发板有使用精度更高的HSE
,所以我们先去修改时钟配置。
重点要关注的是这几行代码:
// 原本的代码使用的HSI
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2;
...
...
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL16;// 修改成HSI
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
...
...
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
如果不会自己配置系统时钟,就可以打开Studio中内置的CubeMX Settings去配置,然后生成工程。如何配置STM32CubeMX并且生成工程就不再多说了,我们说一说生成工程之后的事儿。
先来记录下生成工程前,我们的工程结构,特别是drivers下的文件,如图所示:
使用CubeMX配置完生成工程之后:
可以看到多出了cubemx文件夹,而且drivers下的stm32f1xx_hal_conf.h被备份成了stm32f1xx_hal_conf_bak.h,为了保证工程在studio中能够编译成功,我们需要做以下几件事:
-
将我们需要参考的配置源码复制到rtt studio工程中,比如我们现在想要做的事情就是利用cubemx配置系统时钟,然后我们这段代码复制到drv_clk.c中,如图所示:
我们可以将cubemx目录下main.c
中配置系统时钟函数中的所有内容复制到rtt工程的drv_clk.c
里面去,完成对时钟的配置。其它的外设配置,特别是rtt的drivers中没有支持的外设的驱动,我们就可以利用这个方法来快速完成初始化。 -
将我们需要的代码添加到rtt studio工程之后,为了能够编译通过,我们需要将cubemx settings生成的文件夹cubemx中的一些文件或者全部文件排除构建,比如main.c,一个工程不可能存在两个同名的.c源文件,还有新生的
stm32f1xx_hal_conf.h
,它是有可能缺省原本的rtt studio中使用的外设的,所以我们需要将其排除构建,为了方便,我建议是将cubemx整个目录都排除构建。如图所示:
对着cubemx目录右键,然后再资源配置那里选择排除构建。将某项排除构建后,该项就会从当前的工程目录被移除,但是还是存在工程文件夹中的,没有被删除掉。如果想要回复,可以去菜单栏打开“导航”,选择“打开资源”,如图所示:
然后点击左下角的“显示位置”,选择“C/C++项目”:
这样,在“项目资源管理器”的边上就有一个“C/C++项目”,如图所示:
可以看到外面之前选择排除构建的cubemx就出现了,图标上有个/,表示该项不会被构建,要恢复就鼠标右键此项,将此项选择加入构建,如图所示:
- 恢复hal配置头文件
在使用cubemx配置生成代码后,drivers下的stm32f1xx_hal_conf.h
变成了stm32f1xx_hal_conf_bak.h
,在cubemx目录下新生了一个stm32f1xx_hal_conf.h
文件,我们现在已经将cubemx目录排除构建了,现在需要将被备份的hal库配置文件还原,即重命名回来即可:
经过上面的配置,构建工程,查看是否有配置错误。构建成功,那么一个工程就新建好了,可以开始后面对具体外设、内核、组件和软件包的配置了。
1.1.5 配置调试下载器
在调试或者下载程序之前,需要先去配置调试下载器,如图所示:
点击图中红圈中的下拉图标进行配置,根据自己实际情况选择即可。
1.2 创建基于开发板的工程
基于开发板的和基于芯片的思路是一样的,只是基于开发板的会有更多厂商的芯片可以选择,不过他们对于驱动的支持可能没有ST那样好,很多驱动需要自己去完成。
二、配置内核
双击RT-Thread Settings进入配置界面:
点击红圈中的左拉箭头,进入细节配置:
在这里可以配置内核的参数,比如Tick频率、堆栈、线程通信、内存管理等等,按需配置,和FreeRTOS中修改FreeRTOSConfig.h类似的功能。
三、配置组件
还是使用RT-Thread Settings,打开后可以看到图形界面和细节配置,组件的配置既可以通过图形界面选择点击使用,也可以在细节配置中使能配置参数:
可以在这些组件中右键查看配置项,必须要先使能才能进入配置项:
这些同样是根据自己的内存、外设、中间组件选用等的实际需求来选择配置。
四、配置软件包
软件包可以在RT-Thread Settings的图形界面选择“添加软件包”进入软件包搜索添加界面:
这里可以搜索软件包也可以按分类查找软件包,比如我想要SPI OLED的软件包,但是我不知道有哪些软件包且属于哪一类,那我就搜索OLED,如图所示:
这里显示有3种,刚好我们使用的是SSD1306,我们就点进去看一下:
它说现在仅支持I2C,但是我们想要的是SPI接口的,不满足,所以就不添加软件包到工程,但是这个软件包依然有参考意义,看一下别人是如何实现RTT下的SSD1306驱动的,可以尝试移植,这时候我们就可以点击边上的“github”把源码clone下来参考。
我们同样也可以去细节配置里面的软件包去配置:
我们以paho mqtt为例,先使能这个软件包,然后去配置细节,比如模式、堆栈、是否使用示例等。
需要注意的是,使用软件包还需要关心它的依赖项:
点击“依赖项”它就会告诉我们它依赖的组件和应用层有哪些。
设置好RT-Thread Settings之后,按CTRL+S保存,就会将改动添加生效到工程中,在工程的packages和rt-thread下的components中可以看到文件变化:
在rtconfig.h中看到具体的参数配置变化。
五、适配配置
这里我们先对前面的mqtt进行适配,使能完 AT 客户端和 MQTT 示例后编译出错:
说明在工程中我们未定义BSP_USING_I2Cx
,一般BSP开头的为板级支持包,一般在 drivers/borad.h
中定义,所以我们需要到该文件下找到I2C相关定义进行配置:
其中有两个I2C接口,我们只需要使能其中一个,同时去找到板子相应I2C引脚,去修改引脚项即可:
再次编译,报错消失:
接下里是另一个适配配置:最后清空项目,然后重新构建,查看是否能变成通过,一般一开始都会有问题,需要查漏补缺一点一点的调整好。比如我在组件中使用了pwm,编译后提示了一堆找不到定时器相关的宏定义,且drv_pwm.c还有个红叉,如图所示:
类似这样的问题,先去hal_conf.h中看一下我们是否使能了芯片的定时器外设:
可以看到我们这里是没有放开的,将注释去掉之后重新编译,还是出错:
这种看提示看不出来什么,我们就去源文件看看具体情况:
可以看到是这个枚举类型因为没有前置宏定义变成了一个空枚举
,所以编译出错。而这些BSP_USING_XXX
预处理条件,有些是无法在RT-Thread Settings
里面设置的,需要手动进行宏定义,我们前面说过,最好不要手动去修改rtconfig.h
,所以我们将这些BSP_USING_XXX
宏定义放到board.h
里面宏定义,这样就避开了rtconfig.h
被RT-Thread Settings覆盖修改,如图所示:
可以看到在board.h里面由各个组件的配置项(没有也没关系),ST这里提供了示例,只有3路PWM,如果我们是其它的,就自己添加定义就好,比如PWM12(根据自己的设计选择,这里只是举例),如图所示:
然后保存重新构建工程,还是提示有个错误:
说是没有PWM12_CONFIG,我们去源文件看看:
我们一开始看到这个错误会一头雾水,不知道下面该怎么办了,这时候我们就可以参考官方给的例子,他不是给了三路PWM的宏定义示例吗,我们放开一路,比如PWM1:
然后保存构建(因为没有修改PWM12,所以肯定会报错):
结果PWM1也是一样的错误,这说明官方也没有支持PWM1,如果挨个的碰运气肯定不是好方法,其实我们可以去看看这个源文件用到了哪些头文件,因为这些配置肯定是在某个头文件中会定义或者声明的:
这里面和PWM配置最相似看着最有关联的应该就是drv_config.h
这个头文件了,我们把鼠标放在头文件名称上,按鼠标左键跳过去:
在这里看到了有个pwm_config.h,我们同样跳过去:
从这个文件中我们可以看到这些类似的PWMx_CONFIG配置,官方仅支持了PWM2/3/4/5,没有我们要使用的PWM12,那么我们就仿照这些格式,写我们自己的PWM12_CONFIG:
#ifdef BSP_USING_PWM12
#ifndef PWM12_CONFIG
#define PWM12_CONFIG \{ \.tim_handle.Instance = TIM2, \.name = "pwm12", \.channel = 12 \}
#endif /* PWM12_CONFIG */
#endif /* BSP_USING_PWM12 */
然后再保存构建工程(记得把PWM1还原):
我们双击这个错误跳过去看下:
这个意思就是说这个函数没有定义,这个函数的作用是初始化TIM PWM通道的引脚的。根据HAL库的开发经验,这个需要用户自定义,我们也可以使用cubemx配置参考下:
再次构建工程,就顺利通过了:
这是因为配置完cubemx后,stm32f1xx_hal_msp.c
文件中定义了HAL_TIM_MspPostInit
函数,完成了对pwm的初始化:
将开发板连接stlink烧录器并连接电脑,打开串口,点击烧录观察现象:
此时我们会发现在串口工具中敲回车没反应,是因为在main.c中将UART重新初始化了一次,所以我们需要注释掉几个初始化,但是我们会发现,每次使用cubemx配置后几个初始化会被重新打开,所以相比与cubemx生成的main.c,RTT中的main.c更为好用,但是drivers_clk中的时钟配置与main.c中的时钟息息相关,所以我们干脆将cubemx生成的main.c的时钟配置代码复制粘贴到driver_clk中,并将main.c排除构建,将RTT中的main.c添加构建:
同时将原先cubemx生成main.c的时钟配置函数在drivers_clk中的声明删除掉:
那么此时我们的烧录就需要展开一些工作:关掉开发板电源,将启动方式改成系统内部程序,即将红色boot的开关的on的1拨向另一端,然后打开电源,打开STM32Programmer工具,将连接方式改成UART,选择对应串口号(我这里是COM7),点击连接:
接着需要擦除程序,并断开连接,操作如下:
擦除并断开后界面如下:
重新将连接方式换成stlink,点击连接(在这里连接时,我发现一直连接不上stlink,我重新换了个stlink即可):
于是我们断开连接,烧录程序到开发板,同时打开串口观察现象:
这里串口会打印是因为切换到RTT的main.c,同时按下回车串口会换行
六、其它问题
我们在使用RT-Thread Studio中的CubeMX使时,由于将cubemx里面的一些文件排除了构建,特别是stm32f1xx_hal_conf.h
,但是使用cubemx后关掉它的话,每次都会将原本在drivers
下的stm32f1xx_hal_conf.h
备份创建新的stm32f1xx_hal_conf.h
,且时钟配置那里也会变成使用cubemx配置生成的SystemClock_Config
函数,所以如果要使用cubemx,最好的办法是将rtt studio中的applications
里面的main.c
排除构建,而cubemx里面讲main.c/stm32f1xx_hal_msp.c/Inc
文件夹添加构建,直接使用cubemx创建的代码: