RT-Thread-v2.0.0移植到STM32及驱动LCD和测温

先简单记录下安装:

1. 安装 sourcery工具链或 keil都行
安装python 和 scons:
配置这些工具路径以及RT-Thread源码路径RTT_ROOT,添加到环境变量

2. 开始编译 bsp\stm32f10x工程,在编译以前需要稍微修改如下几个文件
rtconfig.py 此文件必须修改
rtconfig.h 此文件用于裁剪rt-thread(根据需要修改)
比如使用 keil工具来编译:
修改rtconfig.py,
CROSS_TOOL=‘keil‘
EXEC_PATH=‘D:\Keil_v5‘
cmd命令行 cd到bsp\stm32f10x:
D:\rt-thread\bsp\stm32f10x>scons
即可在 bsp\stm32f10x路径下生成 axf文件和bin文件
scons -c 清除编译出来的文件,如.o
scons -j4 多线程编译,2个线程/每个CPU核

主要在 rt-thread-v2.0.0\bsp\stm32f10x\ 下的文件进行修改和添加:

drivers\SConscript 添加驱动文件,

# add the general drivers.
src = Split("""
board.c
stm32f10x_it.c
led.c
LCD5110.c
sys.c
ds18b20.c
usart.c
""")

这些基本的驱动文件里的延时需要调试下。

其他文件不用怎么改,接下来在 applications\application.c 中创建自己的线程函数了,实现相关功能。

/*
application.c
2015.12.4 by Huangtao

 */

#include <board.h>
#include <rtthread.h>

#ifdef  RT_USING_COMPONENTS_INIT
#include <components.h>
#endif  /* RT_USING_COMPONENTS_INIT */

#ifdef RT_USING_DFS
/* dfs filesystem:ELM filesystem init */
#include <dfs_elm.h>
/* dfs Filesystem APIs */
#include <dfs_fs.h>
#endif

#ifdef RT_USING_RTGUI
#include <rtgui/rtgui.h>
#include <rtgui/rtgui_server.h>
#include <rtgui/rtgui_system.h>
#include <rtgui/driver.h>
#include <rtgui/calibration.h>
#endif

#include "led.h"
#include "LCD5110.h"
#include "ds18b20.h"

// Thread ID
static rt_thread_t led_id = RT_NULL;
static rt_thread_t lcd5110_id = RT_NULL;
static rt_thread_t ds18b20_id = RT_NULL;

#define CPU_USAGE_CALC_TICK    10
#define CPU_USAGE_LOOP        100

static rt_uint8_t  cpu_usage_major = 0, cpu_usage_minor= 0;
static rt_uint32_t total_count = 0;

static void cpu_usage_idle_hook()
{
    rt_tick_t tick;
    rt_uint32_t count;
    volatile rt_uint32_t loop;

    if (total_count == 0)
    {
        /* get total count */
        rt_enter_critical();
        tick = rt_tick_get();
        while(rt_tick_get() - tick < CPU_USAGE_CALC_TICK)
        {
            total_count ++;
            loop = 0;
            while (loop < CPU_USAGE_LOOP) loop ++;
        }
        rt_exit_critical();
    }

    count = 0;
    /* get CPU usage */
    tick = rt_tick_get();
    while (rt_tick_get() - tick < CPU_USAGE_CALC_TICK)
    {
        count ++;
        loop  = 0;
        while (loop < CPU_USAGE_LOOP) loop ++;
    }

    /* calculate major and minor */
    if (count < total_count)
    {
        count = total_count - count;
        cpu_usage_major = (count * 100) / total_count;
        cpu_usage_minor = ((count * 100) % total_count) * 100 / total_count;
    }
    else
    {
        total_count = count;

        /* no CPU usage */
        cpu_usage_major = 0;
        cpu_usage_minor = 0;
    }

}

/*void cpu_usage_get(rt_uint8_t *major, rt_uint8_t *minor)
{
    RT_ASSERT(major != RT_NULL);
    RT_ASSERT(minor != RT_NULL);

    *major = cpu_usage_major;
    *minor = cpu_usage_minor;
}*/

void cpu_usage_init()
{
    /* set idle thread hook */
    rt_thread_idle_sethook(cpu_usage_idle_hook);
}

/*
// led
ALIGN(RT_ALIGN_SIZE)
static rt_uint8_t led_stack[ 512 ];
static struct rt_thread led_thread;*/
static void led_thread_entry(void* parameter)
{
    rt_hw_led_init();

    while (1)
    {
        /* led1 on */
        rt_hw_led_on(0);

        // 顺便清屏
        ClearScreen();

        rt_thread_delay( 100 ); /* sleep 1 second and switch to other thread */

        /* led1 off */
        rt_hw_led_off(0);

        // 顺便清屏
        //ClearScreen();

        rt_thread_delay( 100 );

    }
}

// lcd5110
static void lcd5110_thread_entry(void* parameter)
{
    LcdInit();

    while(1)
    {
        DispString(15,0,"RT-Thread");
        DispString(0,1,"CPU:");
        DispNum(30,1,cpu_usage_major);
        DispChar(45,1,‘%‘);

        rt_thread_delay( 5 );

    }

}

// ds18b20
static void ds18b20_thread_entry(void* parameter)
{
    short temperature = 0;
    while(DS18B20_Init());

    while(1)
    {
        DispString(0,3,"Temp: ");
        temperature = DS18B20_Get_Temp();
        if(temperature<0)
        {
            DispChar(40,3,‘-‘);
            temperature=-temperature;
        }
        else
            DispChar(40,3,‘ ‘); 

        DispNum(48,3,((u16)temperature)/10);    //显示正数部分
        DispChar(60,3,‘.‘);
        DispNum(67,3,((u16)temperature)%10);    //显示小数部分 

        rt_thread_delay( 5 );
    }

}

void rt_init_thread_entry(void* parameter)
{
#ifdef RT_USING_COMPONENTS_INIT
    /* initialization RT-Thread Components */
    rt_components_init();
#endif

#ifdef  RT_USING_FINSH
    finsh_set_device(RT_CONSOLE_DEVICE_NAME);
#endif  /* RT_USING_FINSH */

    /* Filesystem Initialization */
#if defined(RT_USING_DFS) && defined(RT_USING_DFS_ELMFAT)
    /* mount sd card fat partition 1 as root directory */
    if (dfs_mount("sd0", "/", "elm", 0, 0) == 0)
    {
        rt_kprintf("File System initialized!\n");
    }
    else
        rt_kprintf("File System initialzation failed!\n");
#endif  /* RT_USING_DFS */

#ifdef RT_USING_RTGUI
    {
        extern void rt_hw_lcd_init();
        extern void rtgui_touch_hw_init(void);

        rt_device_t lcd;

        /* init lcd */
        rt_hw_lcd_init();

        /* init touch panel */
        rtgui_touch_hw_init();

        /* find lcd device */
        lcd = rt_device_find("lcd");

        /* set lcd device as rtgui graphic driver */
        rtgui_graphic_set_device(lcd);

#ifndef RT_USING_COMPONENTS_INIT
        /* init rtgui system server */
        rtgui_system_server_init();
#endif

        calibration_set_restore(cali_setup);
        calibration_set_after(cali_store);
        calibration_init();
    }
#endif /* #ifdef RT_USING_RTGUI */
}

int rt_application_init(void)
{
    rt_thread_t init_thread;

    /*
    rt_err_t result;
    // 静态创建 led 线程
    result = rt_thread_init(&led_thread,                // 线程控制块内存地址
                            "led",                      // 线程名称
                            led_thread_entry,           // 线程入口入口函数
                            RT_NULL,                    // 线程入口入口函数参数
                            (rt_uint8_t*)&led_stack[0], // 线程栈起始地址
                            sizeof(led_stack),          // 线程栈大小
                            20,                         // 线程优先级
                            5);                         // 线程时间片大小
    if (result == RT_EOK)
    {
        rt_thread_startup(&led_thread);
    }
    */

    // 动态创建 led 线程
    led_id = rt_thread_create("led",            // 线程名称
                            led_thread_entry,   // 线程入口入口函数
                            RT_NULL,            // 线程入口入口函数参数
                            512,                // 线程栈大小
                            21,                 // 线程优先级
                            10);                // 线程时间片大小
    // 如果获得线程控制块,启动这个线程
    if (led_id != RT_NULL)
        rt_thread_startup(led_id);

    // 动态创建 lcd5110 线程
    lcd5110_id = rt_thread_create("lcd5110",        // 线程名称
                            lcd5110_thread_entry,   // 线程入口入口函数
                            RT_NULL,                // 线程入口入口函数参数
                            2048,                   // 线程栈大小
                            20,                     // 线程优先级
                            20);                    // 线程时间片大小
    if (lcd5110_id != RT_NULL)
        rt_thread_startup(lcd5110_id);

    // 动态创建 ds18b20 线程
    ds18b20_id = rt_thread_create("ds18b20",        // 线程名称
                            ds18b20_thread_entry,   // 线程入口入口函数
                            RT_NULL,                // 线程入口入口函数参数
                            2048,                   // 线程栈大小
                            19,                     // 线程优先级
                            20);                    // 线程时间片大小
    if (ds18b20_id != RT_NULL)
        rt_thread_startup(ds18b20_id);

    // CPU %
    cpu_usage_init();

#if (RT_THREAD_PRIORITY_MAX == 32)
    init_thread = rt_thread_create("init",
                                   rt_init_thread_entry, RT_NULL,
                                   2048, 8, 20);
#else
    init_thread = rt_thread_create("init",
                                   rt_init_thread_entry, RT_NULL,
                                   2048, 80, 20);
#endif

    if (init_thread != RT_NULL)
        rt_thread_startup(init_thread);

    return 0;
}

/*@}*/

这些线程时间片和每个线程中的延时根据需要调整,不然出现屏幕显示异常。^_^

下面放张效果图:

时间: 2024-10-20 13:11:12

RT-Thread-v2.0.0移植到STM32及驱动LCD和测温的相关文章

STM32 USB 之从0开始移植笔记

STM32 USB 之从0开始移植笔记 -----------------------------------动机----------------------------------- 写在前面的话:最近逛淘宝无意间发现RC522居然只要10元左右就可以包邮买到,真是太便宜了,就忍不住买了个回来玩玩.到货移植到我的板子上OK 后突然发现我的USB口紧张了,一个用来给板子供电一个插jlink 一个插入usb转串口给RC522下命令.就想着将板子供电和RC522传输用一个USB接口来实现.这就是这次

CSoft.RGS.v10.0.0.003自动处理现场测量+SurvGNSS.2016.v2.0

CSoft.RGS.v10.0.0.003自动处理现场测量    该软件被设计用于自动处理现场测量,用于测量领域工作的专业人员(工程测量,施工,库存).该 程序是在大地测量公司的基础上发展的?rumb?,基于算法萨福诺夫(miigaik). CSoft.RGS.v10.0.0.003 StatSoft.STATISTICA.V10.0.1011.6.Enterprise整合数据分析 Zeataline.Projects.PipeData-PRO.v10.0.21 ASME管道数据查询软件 AUC

Mucad 3.703 Full-ISO 1CD+HiTec.Zang.RI-CAD.v2.2.0.Win32 1CD工艺流程图开发

Mucad 3.703 Full-ISO 1CD+HiTec.Zang.RI-CAD.v2.2.0.Win32 1CD工艺流程图开发 BRE BR&E ProMax 2.0.7047.0 工艺流程模拟软件ProMax\ RI-CAD是专为绘制标准兼容P&I工艺流程图开发的. 2015.11.08 CAMWorks 2016 SP0 Multilang for Solid Edge ST7-ST8 Win64 1DVD  CEI EnSight v10.1.6(b) Windows &

linux-3.0内核移植

1.新建kernel文件夹,用于存放内核文件 [[email protected] ~]$ mkdir kernel 2.进入kernel,上传压并解压压缩文件 [[email protected] ~]$cd kernel [[email protected] kernel]$ tar -xjf linux-3.0.tar.bz2 3.进入linux-3.0 cd linux-3.0 4.修改makefile,配置CPU类型和交叉编译器(195,196行) ARCH ?=arm CROSS_C

Selenium v2.45.0 发布,此版本现已提供下载:http://selenium-rele

Selenium v2.45.0 发布,此版本现已提供下载:http://selenium-release.storage.googleapis.com/2.45/selenium-server-standalone-2.45.0.jar.此版本支持 Firefox 36

闪电刷Q服务软件豪华版v2.0.0出锅了!

今天经过一上午的奋斗,我运用易语言以掌握的知识编写了最新的刀刀刷Q服务软件豪华版! 目前更新到v2.0.0版本,我正式更名刀刀刷Q服务软件豪华版更名闪电刷Q服务软件豪华版! 新版特性: 1.添加背景乐 2.添加功能大全 3.添加播放器 4.添加更新页面 更多详情请下载软件查看更新出的功能! 下载连接:http://www.400gb.com/file/68426721 闪电刷Q服务软件豪华版v2.0.0出锅了!,布布扣,bubuko.com

Ibatis 异常:Unable to open connection to &quot;oledb , provider V2.0.0.0 in framework .NET V2.0&quot;.

在实际项目中使用了ibatis,然后在开发过程中遇到一些问题,最严重的就是这个“Unable to open connection to "Microsoft SQL Server, provider V2.0.0.0 in framework .NET V2.0"错误了,因为在VS2010调试中或者在本机(Win7 X64)的安装执行过程中,都是没有问题的,但是安装到测试机器(Win7 X86)上就出现了这个问题(偶尔出现).  今天baidu一下,发现一篇文章,http://www

Git for Windows v2.11.0 Release Notes

homepage faq contribute bugs questions Git for Windows v2.11.0 Release Notes Latest update: December 1st 2016 Introduction These release notes describe issues specific to the Git for Windows release. The release notes covering the history of the core

网易云音乐 v2.2.0.190597 绿色便携版本

网易云音乐PC客户端现已更新至v2.2.0.190597,2.0版全新视觉设计,轻盈扁平风格,版本控们不妨更新吧,良心软件!网易音乐原生纯绿色,无碍眼广告和弹窗,拥有良好口碑和广大用户的肯定及赞赏. 网易云音乐,听见好时光!网易云音乐歌单数量大.种类全.320K高品质原生免费无限收听下载!百万曲库,首首CD音质:千位明星,亲自推荐音乐:社交关系,发现全新音乐:听音识曲,助你疯狂猜歌.网易云音乐专注于音乐发现与分享,依托专业音乐人.DJ.好友推荐及社交功能,打造全新的音乐生活. 网易云音乐让您免费