RT-Thread Studio联合STM32CubeMX进行开发

RT-Thread Studio联合STM32CubeMX进行开发

一、准备内容

1.1硬件平台

使用正点原子STM32F4探索者

f4img

使用到板载LED灯,原理图如下:

20210208001111

1.2软件环境

STM32CubeMX软件平台 V6.2.1

RT-Thread Studio V2.10

二、新建工程

点击:文件 -> 新建 -> RT-Thread项目

20210620175643

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

20210620175511

工程新建后左边的项目资源管理器会显示我们的工程,我们把他展开

20210620175710

到此RT-Thread完整版工程就完成了

三、CubeMX配置

点击工程内CubeMX Setting配置键,进入STM32CubeMX配置

20210620180100

配置使用外部时钟

20210620180309

配置时钟树,1处填入晶振值,点击2、3处选择HSE和PLL锁相环,4处填入值按下Enter系统自动配置倍频系数

20210620181646

配置串口1(RT-Thread终端串口必须配置)

20210620180248

配置要使用到的LED灯IO口:PF9和PF10

20210620180541

点击生成代码,生成选项中勾选生成单独.c和.h文件,其它保持默认

20210620212110

代码生成后回到RT-Thread Studio工程,提示stm32f4xx_hal_conf.h改为stm32f4xx_hal_conf_bak.h备份文件,是因为conf内存储着stm32的hal库配置信息,RT-Thread做了一个备份,防止你新生成的配置不对,方便回溯,这里我们不用管

编译工程,一堆报错!不要慌,下面是重点:

不管是RT-Thread Studio内打开CubeMX还是外面打开CubeMX生成配置后添加到RTT工程,其中都有许多无用的文件,实际上我们使用的文件就下面几个

20210620212401

所以我们需要添加一个scon脚本告诉Studio:我们只构建这几个工程文件,新建名称为SConscript的文件

20210620183102

添加如下内容

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到系统环境:

20210620210644

点击进入CubeMX生成的main函数,将main函数的main函数主体weak掉

20210620211300

将hal生成初始化函数在application的main下调用,头文件添加各个外设的.h文件,main函数中调用初始化

20210620212641

添加完成,点击构建,无报错

20210620212757

四、联合开发

CubeMX配置基本完成了,下面我们写一个线程,然后从命令行启动(命令行YYDS)

main中直接替换成如下代码:

/*
 * Copyright (c) 2006-2021, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2021-06-20     RT-Thread    first version
 */

#include <rtthread.h>

#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>
#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_PRIORITY         25
#define THREAD_STACK_SIZE       512
#define THREAD_TIMESLICE        5

/* 指向线程控制块的指针 */
rt_thread_t  tid1 = RT_NULL;
rt_thread_t  tid2 = 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);

编译下载,无报错

20210620215859

五、实验现象

rtt

版权声明:本文为CSDN博主「嵌入式up笔记」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_45396672/article/details/118076336

生成海报
点赞 0

嵌入式up笔记

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

RT-Thread I/O设备模型及驱动框架解析(一)

目录 1. 概述 2. 原理解析 3. 源码解析 3.1. 创建设备 3.2.  注册到驱动框架 3.3. 注册到IO设备管理器 4. 小结 1. 概述 本着由简入繁的原则,分析源码以STM32平台的看门狗源码为例&#

基于STM32的室内环境监测系统

设计简介: 本设计是基于单片机的室内环境监测器,主要实现以下功能: 可实现LCD1602显示环境数据实时监测一氧化碳、甲烷、烟雾值空气质量大于各自限值报警,并通过TTS报警 标签&#x