RT-Thread Studio学习(一)新建工程
开发环境
- MCU:STM32F407VET6
- RT-Thread Studio: V2.1.5
- RT-Thread内核:V4.0.3
- STM32 CubeMX: V6.3.0
- KEIL: V5.35.0.0
- STM32 CubeMX firmware: STM32Cube FW_F4 V1.26.2
简介
本文将介绍如何使用RT-Thread Studio来新建项目,并结合STM32CubeMX完成使用外部时钟系统的配置。
新建RT-Thread项目
打开RT-ThreadStudio软件后,选择 文件
–>新建
–>RT-Thread项目
,然后根据自己的实际项目情况进行相应的设置。在Project name
后输入项目名称,比如rtt_demo。选择基于芯片
,RT-Thread版本为4.0.3
,厂商为STMicroelectronics
,系列为STM32F4
,子系列为STM32F407
,芯片为STM32F407VE
,控制台串口为UART1
,发送脚为PA9
,接收脚PA10
,调试器选择DAP-LINK
,接口为SWD
。配置完成后点击完成
按钮创建一个新的RT-Thread项目。如下图:
CubeMX配置
点击工程内CubeMX Settings
或者cubemx.ioc
,进入STM32CubeMX配置。
-
配置使用外部时钟:
-
配置下载方式:
-
配置串口:
-
配置时钟树:
选择Pinout&Configuration
–>左侧System Core
–>RCC
–>HSE
和LSE
–>选择Crystal/Ceramic Resonator
。STM32CubeMX的Clock Configuration
设置如下图:
注意APB1和APB2的Prescaler相同,也可以不相同。如果不相同,在使用timer时要留意不同timer挂在不同APB之下,会出现相同的代码不同的时钟频率。 -
配置工程
Project Manager
页面的Project
设置如下图:
注意:勾选Do not generate the main()
,避免与RTT的main冲突。
Project Manager
页面的Code Generator
设置如下图:
最后点击GENERATE CODE
生成KEIL工程及其代码。
设置RT-Thread Studio工程
编译工程,会出现很多错误,这是因为在STM32CubeMX中GENERATE CODE
后生成了很多无用的源码文件。写一个scon脚本文件进行额外的设置就可以解决了。
选择cubemx
文件夹,新建名称为SConscript的文件,如下图:
添加如下内容:
import os
from building import *
cwd = GetCurrentDir()
src = Glob('*.c')
# add cubemx drivers
src = Split('''
Src/stm32f4xx_hal_msp.c
Src/main.c
''')
path = [cwd]
path += [cwd + '/Inc']
group = DefineGroup('cubemx', src, depend = [''], CPPPATH = path)
Return('group')
右键选择更新软件包
,添加Scon到系统环境:
点击CubeMX生成的main函数,在main.c文件的main函数前面添加__weak
,如下图:
main.c
/*
* Copyright (c) 2006-2022, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2022-09-06 RT-Thread first version
*/
#include <rtthread.h>
#include "stm32f4xx.h"
#include <rtdevice.h>
#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>
int main(void)
{
int count = 1;
LOG_D("Project: f4v_daq 2024.7.2");
LOG_D("System CLock information");
LOG_D("SYSCLK_Frequency = %d", HAL_RCC_GetSysClockFreq());
LOG_D("HCLK_Frequency = %d", HAL_RCC_GetHCLKFreq());
LOG_D("PCLK1_Frequency = %d", HAL_RCC_GetPCLK1Freq());
LOG_D("PCLK2_Frequency = %d", HAL_RCC_GetPCLK2Freq());
LOG_D("SysTick->LOAD = %d", SysTick->LOAD);
LOG_D("Current tick = %d", rt_tick_get());
while (count++)
{
LOG_D("Hello RT-Thread!");
rt_thread_mdelay(1000);
}
return RT_EOK;
}
编译工程并下载: