打印

RT-Thread正式1.0+红牛stm32f103zet6开发板

[复制链接]
6563|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
stm32boy|  楼主 | 2012-1-10 16:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 stm32boy 于 2012-1-10 16:48 编辑

RTT终于都发放了1.0正式版了,原来的0.4rc1还是不太完整,这次1.0就规范了很多,下来之后打开就能在BSP的目录里找到对应的工程组了。之前的0.4rc1版本,RTGUI和触控驱动方面不完整,这次就OK了。对于stm32f103zet6现在市面上的开发板,RTT1.0都有移植好的工程组了,即使稍有差别,都可以很方便就配置好,看来RTT正朝着国际GUN规范发展,手头上的红牛开发板直接用MDK-ARM Pro 4.22 uVision就可以打开RTT移植好的工程组文件了。

跟之前的一样,对应板上有外加内存256Kb,就在board.h里面——
#define STM32_EXT_SRAM          1
#define STM32_EXT_SRAM_END      0x68040000
把两个宏定义略改一下,"1"表示启用板上外加内存片,另一个是定义多少Kb的。

再去rtconfig.h文件里——
/* Using Software Timer */
#define RT_USING_TIMER_SOFT
把上面这个宏定义的注释符去掉,启用"软时钟"计时,
另外还是先把
/* #define RTGUI_USING_HZ_FILE */ 这个宏定义先注释起来,暂时用不上。
沙发
stm32boy|  楼主 | 2012-1-10 16:32 | 只看该作者
本帖最后由 stm32boy 于 2012-1-10 21:27 编辑

略微修改一下application.c和led.c两个文件就可以上板跑一跑传说中的"跑马灯"程式了(这可是玩片的机本功——"点灯"工程)。

先改改application.c的内容——
        /* led1 on */
#ifndef RT_USING_FINSH
        rt_kprintf("led on, count : %d\r\n",count);
#endif
       for(count=0;count<5;count++)
        {
  rt_hw_led_on(count);
        rt_thread_delay( RT_TICK_PER_SECOND/2 ); /* sleep 0.5 second and switch to other thread */
        /* led1 off */
#ifndef RT_USING_FINSH
        rt_kprintf("led off\r\n");
#endif
        rt_hw_led_off(count);
        rt_thread_delay( RT_TICK_PER_SECOND/2 );
        }
按照红色的部分自己改一下

使用特权

评论回复
板凳
stm32boy|  楼主 | 2012-1-10 16:54 | 只看该作者
本帖最后由 stm32boy 于 2012-1-10 21:17 编辑

再将led.c里面的——
// led define
#ifdef STM32_SIMULATOR
#define led1_rcc                    RCC_APB2Periph_GPIOA
#define led1_gpio                   GPIOA
#define led1_pin                    (GPIO_Pin_5)

#define led2_rcc                    RCC_APB2Periph_GPIOA
#define led2_gpio                   GPIOA
#define led2_pin                    (GPIO_Pin_6)

#else

#define led1_rcc                    RCC_APB2Periph_GPIOF
#define led1_gpio                   GPIOF
#define led1_pin                    (GPIO_Pin_6)

#define led2_rcc                    RCC_APB2Periph_GPIOF
#define led2_gpio                   GPIOF
#define led2_pin                    (GPIO_Pin_7)

#define led3_rcc                    RCC_APB2Periph_GPIOF
#define led3_gpio                   GPIOF
#define led3_pin                    (GPIO_Pin_8)

#define led4_rcc                    RCC_APB2Periph_GPIOF
#define led4_gpio                   GPIOF
#define led4_pin                    (GPIO_Pin_9)

#define led5_rcc                    RCC_APB2Periph_GPIOF
#define led5_gpio                   GPIOF
#define led5_pin                    (GPIO_Pin_10)

#endif // led define #ifdef STM32_SIMULATOR

void rt_hw_led_init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(led1_rcc|led2_rcc|led3_rcc|led4_rcc|led5_rcc,ENABLE);

    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Pin   = led1_pin;
    GPIO_Init(led1_gpio, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin   = led2_pin;
    GPIO_Init(led2_gpio, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin   = led3_pin;
    GPIO_Init(led3_gpio, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin   = led4_pin;
    GPIO_Init(led4_gpio, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin   = led5_pin;
    GPIO_Init(led5_gpio, &GPIO_InitStructure);
}

void rt_hw_led_on(rt_uint32_t n)
{
    switch (n)
    {
    case 0:
        GPIO_SetBits(led1_gpio, led1_pin);
        break;
    case 1:
        GPIO_SetBits(led2_gpio, led2_pin);
        break;
    case 2:
        GPIO_SetBits(led3_gpio, led3_pin);
        break;
    case 3:
        GPIO_SetBits(led4_gpio, led4_pin);
        break;
    case 4:
        GPIO_SetBits(led5_gpio, led5_pin);
        break;
    default:
        break;
    }
}

void rt_hw_led_off(rt_uint32_t n)
{
    switch (n)
    {
    case 0:
        GPIO_ResetBits(led1_gpio, led1_pin);
        break;
    case 1:
        GPIO_ResetBits(led2_gpio, led2_pin);
        break;
    case 2:
        GPIO_ResetBits(led3_gpio, led3_pin);
        break;
    case 3:
        GPIO_ResetBits(led4_gpio, led4_pin);
        break;
    case 4:
        GPIO_ResetBits(led5_gpio, led5_pin);
        break;
    default:
        break;
    }
}
按照红色部分改动和增加内容,然后编译工程,下到板子里,run一下看看。

使用特权

评论回复
地板
stm32boy|  楼主 | 2012-1-10 17:00 | 只看该作者
本帖最后由 stm32boy 于 2012-1-12 22:18 编辑

这就是RTT+STM32最让人感到亢奋的原因,虽然上面的程式多少显得冗余,但起码增加了可读性(熟练之后可以自行简化代码),哪怕你是个电子盲,都居然可以玩这么高级的MCU了。

然后再来尝试一下什么是"线程",方便起见,将楼下两层的原码覆盖到原来的工程文件中,编译后刷进片子里试试看。

RTT对动态线程和静态线程的构造都有固定格式,参考楼下的代码,就可以发现其区别,详细的说明可以去RTT的网站宕些资料看(都是免费的,GUN精神——人人为我,我为人人)。

就个人而言,经过这几年的发展,RTT+STM32相结合,稳定性和可靠性都是值得信赖的,市面上STM32的工控PLC产品也有成品推出了,两者的配合,性价比真的很有市场开发潜力。

使用特权

评论回复
5
stm32boy|  楼主 | 2012-1-12 17:37 | 只看该作者
本帖最后由 stm32boy 于 2012-1-12 17:40 编辑

把led.c里面的再覆盖一次——
/*
* File      : led.c
* This file is part of RT-Thread RTOS
* COPYRIGHT (C) 2009, RT-Thread Development Team
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rt-thread.org/license/LICENSE
*
* Change Logs:
* Date           Author       Notes
* 2009-01-05     Bernard      the first version
*/
#include <rtthread.h>
#include <stm32f10x.h>

// led define PF6 PF7 PF8 PF9 PF10
#ifdef RT_USING_DEVICE
#define led1_rcc                    RCC_APB2Periph_GPIOF
#define led1_gpio                   GPIOF
#define led1_pin                    (GPIO_Pin_6)

#define led2_rcc                    RCC_APB2Periph_GPIOF
#define led2_gpio                   GPIOF
#define led2_pin                    (GPIO_Pin_7)

#define led3_rcc                    RCC_APB2Periph_GPIOF
#define led3_gpio                   GPIOF
#define led3_pin                    (GPIO_Pin_8)

#define led4_rcc                    RCC_APB2Periph_GPIOF
#define led4_gpio                   GPIOF
#define led4_pin                    (GPIO_Pin_9)

#define led5_rcc                    RCC_APB2Periph_GPIOF
#define led5_gpio                   GPIOF
#define led5_pin                    (GPIO_Pin_10)

#endif

void rt_hw_led_init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(led1_rcc|led2_rcc|led3_rcc|led4_rcc|led5_rcc,ENABLE);

    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Pin   = led1_pin;
    GPIO_Init(led1_gpio, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin   = led2_pin;
    GPIO_Init(led2_gpio, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin   = led3_pin;
    GPIO_Init(led3_gpio, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin   = led4_pin;
    GPIO_Init(led4_gpio, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin   = led5_pin;
    GPIO_Init(led5_gpio, &GPIO_InitStructure);
}

void rt_hw_led_on(rt_uint32_t n)
{
    switch (n)
    {
    case 0:
        GPIO_SetBits(led1_gpio, led1_pin);
        break;
    case 1:
        GPIO_SetBits(led2_gpio, led2_pin);
        break;
    case 2:
        GPIO_SetBits(led3_gpio, led3_pin);
        break;
    case 3:
        GPIO_SetBits(led4_gpio, led4_pin);
        break;
    case 4:
        GPIO_SetBits(led5_gpio, led5_pin);
        break;
    default:
        break;
    }
}

void rt_hw_led_off(rt_uint32_t n)
{
    switch (n)
    {
    case 0:
        GPIO_ResetBits(led1_gpio, led1_pin);
        break;
    case 1:
        GPIO_ResetBits(led2_gpio, led2_pin);
        break;
    case 2:
        GPIO_ResetBits(led3_gpio, led3_pin);
        break;
    case 3:
        GPIO_ResetBits(led4_gpio, led4_pin);
        break;
    case 4:
        GPIO_ResetBits(led5_gpio, led5_pin);
        break;
    default:
        break;
    }
}

#ifdef RT_USING_FINSH
#include <finsh.h>
static rt_uint8_t led_inited = 0;
void led(rt_uint32_t led, rt_uint32_t value)
{
    /* init led configuration if it's not inited. */
    if (!led_inited)
    {
        rt_hw_led_init();
        led_inited = 1;
    }

    if ( led == 0 )
    {
        /* set led status */
        switch (value)
        {
        case 0:
            rt_hw_led_off(0);
            break;
        case 1:
            rt_hw_led_on(0);
            break;
        default:
            break;
        }
    }

    if ( led == 1 )
    {
        /* set led status */
        switch (value)
        {
        case 0:
            rt_hw_led_off(1);
            break;
        case 1:
            rt_hw_led_on(1);
            break;
        default:
            break;
        }
    }

    if ( led == 2 )
    {
        /* set led status */
        switch (value)
        {
        case 0:
            rt_hw_led_off(0);
            break;
        case 1:
            rt_hw_led_on(0);
            break;
        default:
            break;
        }
    }

    if ( led == 3 )
    {
        /* set led status */
        switch (value)
        {
        case 0:
            rt_hw_led_off(0);
            break;
        case 1:
            rt_hw_led_on(0);
            break;
        default:
            break;
        }
    }

    if ( led == 4 )
    {
        /* set led status */
        switch (value)
        {
        case 0:
            rt_hw_led_off(0);
            break;
        case 1:
            rt_hw_led_on(0);
            break;
        default:
            break;
        }
    }
}
FINSH_FUNCTION_EXPORT(led, set led[0 - 4] on[1] or off[0].)
#endif

红色部分为改动很大的地方。

使用特权

评论回复
6
stm32boy|  楼主 | 2012-1-12 17:42 | 只看该作者
本帖最后由 stm32boy 于 2012-1-12 21:57 编辑

再来改改application.c的内容——

/*
* File      : application.c
* This file is part of RT-Thread RTOS
* COPYRIGHT (C) 2006, RT-Thread Development Team
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rt-thread.org/license/LICENSE
*
* Change Logs:
* Date           Author       Notes
* 2009-01-05     Bernard      the first version
*/

/**
* @addtogroup STM32
*/
/*@{*/

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

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

#ifdef RT_USING_LWIP
#include <lwip/sys.h>
#include <lwip/api.h>
#include <netif/ethernetif.h>
#endif

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

#include "led.h"

void led2_thread_entry(void* parameter)
{
    unsigned int count;

    rt_hw_led_init();

    while (1)
    {
        /* led1-3 on */
#ifndef RT_USING_FINSH
        rt_kprintf("led on, count : %d\r\n",count);
#endif
        for(count=0;count<3;count++)
        {
                rt_hw_led_on(count);
        rt_thread_delay( RT_TICK_PER_SECOND/4 ); /* sleep 0.25 second and switch to other thread */

        /* led1-3 off */
#ifndef RT_USING_FINSH
        rt_kprintf("led off\r\n");
#endif
        rt_hw_led_off(count);
        rt_thread_delay( RT_TICK_PER_SECOND*3 );
        }        
    }        
}

void led1_thread_entry(void* parameter)
{
    unsigned int count;

    rt_hw_led_init();

    while (1)
    {
        /* led1-3 on */
#ifndef RT_USING_FINSH
        rt_kprintf("led on, count : %d\r\n",count);
#endif
        for(count=0;count<3;count++)
        {
                rt_hw_led_on(count);
        rt_thread_delay( RT_TICK_PER_SECOND*2 ); /* sleep 2 second and switch to other thread */

        /* led1-3 off */
#ifndef RT_USING_FINSH
        rt_kprintf("led off\r\n");
#endif
        rt_hw_led_off(count);
        rt_thread_delay( RT_TICK_PER_SECOND );
                }
    }        
}

ALIGN(RT_ALIGN_SIZE)
static rt_uint8_t led_stack[ 512 ];
static struct rt_thread led_thread;
static void led_thread_entry(void* parameter)
{
    unsigned int count;

    rt_hw_led_init();

    while (1)
    {
        /* led4-5 on */
#ifndef RT_USING_FINSH
        rt_kprintf("led on, count : %d\r\n",count);
#endif
        for(count=3;count<5;count++)
        {
                rt_hw_led_on(count);
        rt_thread_delay( RT_TICK_PER_SECOND/2 ); /* sleep 0.5 second and switch to other thread */

        /* led4-5 off */
#ifndef RT_USING_FINSH
        rt_kprintf("led off\r\n");
#endif
        rt_hw_led_off(count);
        rt_thread_delay( RT_TICK_PER_SECOND/2 );
                }
    }        
}

void rt_init_thread_entry(void* parameter)
{
/* Filesystem Initialization */
#ifdef RT_USING_DFS
        {
                /* init the device filesystem */
                dfs_init();

#ifdef RT_USING_DFS_ELMFAT
                /* init the elm chan FatFs filesystam*/
                elm_init();

                /* 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
        }
#endif

/* LwIP Initialization */
#ifdef RT_USING_LWIP
        {
                extern void lwip_sys_init(void);

                /* register ethernetif device */
                eth_system_device_init();

#ifdef STM32F10X_CL
                rt_hw_stm32_eth_init();
#else
        /* STM32F103 */
        #if STM32_ETH_IF == 0
                        rt_hw_enc28j60_init();
        #elif STM32_ETH_IF == 1
                        rt_hw_dm9000_init();
        #endif
#endif

                /* re-init device driver */
                rt_device_init_all();

                /* init lwip system */
                lwip_sys_init();
                rt_kprintf("TCP/IP initialized!\n");
        }
#endif

#ifdef RT_USING_RTGUI
        {
            extern void rtgui_startup();
            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();

                /* re-init device driver */
                rt_device_init_all();

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

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

                /* startup rtgui */
                rtgui_startup();
        }
#endif /* #ifdef RT_USING_RTGUI */
}

int rt_application_init()
{
        rt_thread_t init_thread;
        rt_thread_t led1_thread;
        rt_thread_t led2_thread;

        rt_err_t result;

    /* init led thread */
        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);
        }

#if (RT_THREAD_PRIORITY_MAX == 32)
        init_thread = rt_thread_create("init",
                                                                rt_init_thread_entry, RT_NULL,
                                                                2048, 8, 20);
       led1_thread = rt_thread_create("led1",
                                                                led1_thread_entry, RT_NULL,
                                                                2048, 15, 5);
        led2_thread = rt_thread_create("led2",
                                                                led2_thread_entry, RT_NULL,
                                                                2048, 16, 5);
#else
        init_thread = rt_thread_create("init",
                                                                rt_init_thread_entry, RT_NULL,
                                                                2048, 80, 20);
       led1_thread = rt_thread_create("led1",
                                                                led1_thread_entry, RT_NULL,
                                                                2048, 150, 5);
        led2_thread = rt_thread_create("led2",
                                                                led2_thread_entry, RT_NULL,
                                                                2048, 160, 5);
#endif

        if (init_thread != RT_NULL|led1_thread != RT_NULL|led2_thread != RT_NULL)
                rt_thread_startup(init_thread);
                rt_thread_startup(led1_thread);
                rt_thread_startup(led2_thread);

        return 0;
}

/*@}*/

红色部分为改动很大的地方。

使用特权

评论回复
7
stm32boy|  楼主 | 2012-1-12 17:48 | 只看该作者
本帖最后由 stm32boy 于 2012-1-12 22:10 编辑

可以观察LED1到LED5的闪烁频率,LED1-3是两个动态线程在相互"抢夺"控制权,LED4-5只有一个静态线程在控制;你可以自行修改动态线程的优先级时间轮片数来让RTT实时分配控制权,也可以修改LED点亮与熄灭的时间差来区分哪一个线程"抢"到了控制权。

闪到眼都花了,RTT线程最强大的功能——对占用同一个资源的使用时间分配,这才是RTT"多线程单任务实时控制"的精髓所在。

使用特权

评论回复
8
网络转接| | 2012-1-15 11:48 | 只看该作者
能不能在按的板子上 移植一下呢

使用特权

评论回复
9
yybj| | 2012-1-15 18:32 | 只看该作者
可以试一下

使用特权

评论回复
10
tomzxq| | 2012-5-23 09:47 | 只看该作者
没有代码吗?我很想要玩一下

使用特权

评论回复
11
kumosheng| | 2012-11-16 18:15 | 只看该作者
这是个好东西,得好好学习下下!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:for {;;}

0

主题

34

帖子

0

粉丝