#|RT-Thread Studio联合STM32CubeMX进行开发


文章目录

  • RT-Thread Studio联合STM32CubeMX进行开发
    • 一、准备内容
      • 1.1硬件平台
      • 1.2软件环境
    • 二、新建工程
    • 三、CubeMX配置
    • 四、联合开发
    • 五、实验现象

RT-Thread Studio联合STM32CubeMX进行开发 一、准备内容 1.1硬件平台
使用正点原子STM32F4探索者
#|RT-Thread Studio联合STM32CubeMX进行开发
文章图片

使用到板载LED灯,原理图如下:
#|RT-Thread Studio联合STM32CubeMX进行开发
文章图片

1.2软件环境
STM32CubeMX软件平台 V6.2.1
RT-Thread Studio V2.10
二、新建工程 点击:文件 -> 新建 -> RT-Thread项目
#|RT-Thread Studio联合STM32CubeMX进行开发
文章图片

选择基于芯片的项目,填写工程名字,芯片类型(如果第一次使用RT-Thread,需要进入SDK管理器下载对应SDK包),控制台串口和下载器,控制台串口使用串口一,连接电脑方便进行Fish调试
#|RT-Thread Studio联合STM32CubeMX进行开发
文章图片

工程新建后左边的项目资源管理器会显示我们的工程,我们把他展开
#|RT-Thread Studio联合STM32CubeMX进行开发
文章图片

到此RT-Thread完整版工程就完成了
三、CubeMX配置 点击工程内CubeMX Setting配置键,进入STM32CubeMX配置
#|RT-Thread Studio联合STM32CubeMX进行开发
文章图片

配置使用外部时钟
#|RT-Thread Studio联合STM32CubeMX进行开发
文章图片

配置时钟树,1处填入晶振值,点击2、3处选择HSE和PLL锁相环,4处填入值按下Enter系统自动配置倍频系数
#|RT-Thread Studio联合STM32CubeMX进行开发
文章图片

配置串口1(RT-Thread终端串口必须配置)
#|RT-Thread Studio联合STM32CubeMX进行开发
文章图片

配置要使用到的LED灯IO口:PF9和PF10
#|RT-Thread Studio联合STM32CubeMX进行开发
文章图片

点击生成代码,生成选项中勾选生成单独.c和.h文件,其它保持默认
#|RT-Thread Studio联合STM32CubeMX进行开发
文章图片

代码生成后回到RT-Thread Studio工程,提示stm32f4xx_hal_conf.h改为stm32f4xx_hal_conf_bak.h备份文件,是因为conf内存储着stm32的hal库配置信息,RT-Thread做了一个备份,防止你新生成的配置不对,方便回溯,这里我们不用管
编译工程,一堆报错!不要慌,下面是重点:
不管是RT-Thread Studio内打开CubeMX还是外面打开CubeMX生成配置后添加到RTT工程,其中都有许多无用的文件,实际上我们使用的文件就下面几个
#|RT-Thread Studio联合STM32CubeMX进行开发
文章图片

所以我们需要添加一个scon脚本告诉Studio:我们只构建这几个工程文件,新建名称为SConscript的文件
#|RT-Thread Studio联合STM32CubeMX进行开发
文章图片

添加如下内容
import os from building import *cwd = GetCurrentDir() src= https://www.it610.com/article/Glob('*.c') # add cubemx drivers src = https://www.it610.com/article/Split(''' Src/stm32f4xx_hal_msp.c Src/main.c ''')path = [cwd] path += [cwd + '/Inc']group = DefineGroup('cubemx', src, depend = [''], CPPPATH = path)Return('group')

右键导航栏,更新软件包,添加Scon到系统环境:
#|RT-Thread Studio联合STM32CubeMX进行开发
文章图片

点击进入CubeMX生成的main函数,将main函数的main函数主体weak掉
#|RT-Thread Studio联合STM32CubeMX进行开发
文章图片

将hal生成初始化函数在application的main下调用,头文件添加各个外设的.h文件,main函数中调用初始化
#|RT-Thread Studio联合STM32CubeMX进行开发
文章图片

添加完成,点击构建,无报错
#|RT-Thread Studio联合STM32CubeMX进行开发
文章图片

四、联合开发 CubeMX配置基本完成了,下面我们写一个线程,然后从命令行启动(命令行YYDS)
main中直接替换成如下代码:
/* * Copyright (c) 2006-2021, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * DateAuthorNotes * 2021-06-20RT-Threadfirst version */#include #define DBG_TAG "main" #define DBG_LVL DBG_LOG #include #include "main.h" #include "gpio.h" #include "usart.h" #include "rtthread.h" #include "board.h"#define LED0 GET_PIN(F,9) #define LED1 GET_PIN(F,10)#define THREAD_PRIORITY25 #define THREAD_STACK_SIZE512 #define THREAD_TIMESLICE5/* 指向线程控制块的指针 */ rt_thread_ttid1 = RT_NULL; rt_thread_ttid2 = RT_NULL; int main(void) {MX_GPIO_Init(); MX_USART1_UART_Init(); LOG_D("Init Ok!"); int count = 1; while (count++) {rt_thread_mdelay(1000); }return RT_EOK; }void led0_entry(void* p) {rt_kprintf("LED0 Runing\r\n"); while(1) {rt_pin_write(LED0, 1); rt_thread_delay(1000); rt_pin_write(LED0, 0); rt_thread_delay(1000); } } void led1_entry(void* p) {rt_kprintf("LED1 Runing\r\n"); while(1) {rt_pin_write(LED1, 1); rt_thread_delay(1000); rt_pin_write(LED1, 0); rt_thread_delay(1000); } }void led0_start(void) {/* 创建线程1 */ tid1 = rt_thread_create("t11",led0_entry,RT_NULL,THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); if(tid1 != RT_NULL) rt_thread_startup(tid1); } void led1_start(void) {/* 创建线程1 */ tid2 = rt_thread_create("t22",led1_entry,RT_NULL,THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); if(tid2 != RT_NULL) rt_thread_startup(tid2); } MSH_CMD_EXPORT(led0_start, led0_task); MSH_CMD_EXPORT(led1_start, led1_task);

编译下载,无报错
#|RT-Thread Studio联合STM32CubeMX进行开发
文章图片

五、实验现象 【#|RT-Thread Studio联合STM32CubeMX进行开发】#|RT-Thread Studio联合STM32CubeMX进行开发
文章图片

    推荐阅读