查看: 3564|回复: 1

[原创] 【IRD-LPC1768-DEV】1. freeRTOS点灯

[复制链接]
  • TA的每日心情
    开心
    2024-6-13 14:18
  • 签到天数: 8 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    5

    主题

    88

    帖子

    1

    高级会员

    Rank: 4

    积分
    927
    最后登录
    2025-7-3
    发表于 2019-3-6 23:46:39 | 显示全部楼层 |阅读模式
           首先,感谢NXP社区组织的这次活动,幸运的拿到了LPC1768 DEMO板。收到板子也有几天,虽然工作比较忙,任务还是要完成的。先用freeRTOS来点个灯。
          开发平台选择常用的MDK,容易上手,要顺利使用freeRTOS在lp1768 demo板上点个灯,下图中的几个pack一定要安装。
    图1.png


    安装完后,新建工程,按提示来就好,CMSIS下面core勾上,freeRTOS勾上后,最下面的窗口会提示要勾选的项目,找到后都勾选,直到最下面窗口没有多余提示。


    图2.png


    图3.png


    完成后如下图
    图4.png


    后面编写main函数和LED驱动相关的文件
    //************************************************************************
    //config.h文件
    //************************************************************************


    #ifndef        __CONFIG__H
    #define __CONFIG__H


    #include "stdio.h"
    #include "LPC17xx.h"
    #include "FreeRTOS.h"
    #include "task.h"


    #include "GPIO_LPC17xx.h"
    #include "PIN_LPC17xx.h"
    #include "led.h"


    #endif

    //************************************************************************
    //led.h文件
    //************************************************************************

    #ifndef        __LED__H
    #define __LED__H


    //LED1
    #define LED1_PIN        7
    #define LED1_PORT        0
    #define LED1_Init()        do{        \
            GPIO_PortClock(1);        \
            PIN_Configure(LED1_PORT, LED1_PIN, PIN_FUNC_0, PIN_PINMODE_PULLDOWN, PIN_PINMODE_NORMAL);        \
        GPIO_SetDir(LED1_PORT, LED1_PIN, GPIO_DIR_OUTPUT);        \
        LED1_Off();        \
    }while(0)
    #define LED1_Off()        GPIO_PinWrite(LED1_PORT, LED1_PIN, 0)
    #define LED1_On()        GPIO_PinWrite(LED1_PORT, LED1_PIN, 1)




    //LED初始化
    extern void        LED_Init(void);


    #endif


    //************************************************************************
    //led.c文件
    //************************************************************************
    #include "config.h"




    void        LED_Init(void)
    {
            LED1_Init();
    }

    //************************************************************************
    //main.c文件
    //************************************************************************

    #include "config.h"


    //任务句柄
    static TaskHandle_t AppTaskCreate_Handle;
    static TaskHandle_t LED_Task_Handle;


    //任务堆栈
    static StackType_t AppTaskCreate_Stack[128];
    static StackType_t LED_Task_Stack[128];


    //任务控制块
    static StaticTask_t AppTaskCreate_TCB;
    static StaticTask_t LED_Task_TCB;


    //LED点灯的任务函数
    static void LED_Task(void* parameter);


    //创建任务
    static void AppTaskCreate(void)
    {
            taskENTER_CRITICAL(); //进入临界区
            LED_Task_Handle = xTaskCreateStatic((TaskFunction_t )LED_Task, //任务函数
            (const char*)"LED_Task",//任务名称
            (uint32_t)128, //任务堆栈大小
            (void* )NULL, //传递给任务函数的参数
            (UBaseType_t)4, //任务优先级
            (StackType_t*)LED_Task_Stack,//任务堆栈
            (StaticTask_t*)&LED_Task_TCB);//任务控制块
            if (NULL != LED_Task_Handle) /* 创建成功 */
            {
                    printf("LED_Task任务创建成功!\n");
            }
            else
            {
                    printf("LED_Task任务创建失败!\n");
            }
            vTaskDelete(AppTaskCreate_Handle); //删除AppTaskCreate任务
            taskEXIT_CRITICAL(); //退出临界区
    }


    static void LED_Task(void* parameter)
    {
            while(1)
            {
                    LED1_On();
                    vTaskDelay(100);
                    LED1_Off();
                    vTaskDelay(900);
            }
    }


    int main (void)
    {


            SystemCoreClockUpdate ();                  
            SysTick_Config(SystemCoreClock/100);     
            LED_Init();
            AppTaskCreate_Handle = xTaskCreateStatic((TaskFunction_t )AppTaskCreate,
            (const char* )"AppTaskCreate",        //任务名称
            (uint32_t )128,                                 //任务堆栈大小
            (void* )NULL,                                        //传递给任务函数的参数
            (UBaseType_t )3,                                 //任务优先级
            (StackType_t* )AppTaskCreate_Stack,
            (StaticTask_t* )&AppTaskCreate_TCB);
            if (NULL != AppTaskCreate_Handle)         // 创建成功
            {
                    vTaskStartScheduler();                         // 启动任务,开启调度
            }
            while (1) ;
    }





        以前用STM32时被坑到过,MDK升级后,更新pack版本,原来可以正常使用的工程出现一堆的错误,为解决这个问题,把工程里的文件整理一下,在项目目录下建立子目录,把相应的文件都复制过来,添加到项目里,再使用Manager Run-Time Environment工具把除CMSIS下的core以外的选项全部去掉。
    附上完整项目包:
    LPC1768-201903062344.rar (5.33 MB, 下载次数: 41)
    今天天气不错!签到!
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2025-7-11 08:53
  • 签到天数: 301 天

    连续签到: 2 天

    [LV.8]以坛为家I

    3868

    主题

    7472

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    39232
    最后登录
    2025-7-18
    发表于 2019-3-8 16:45:24 | 显示全部楼层
    谢谢分享,期待楼主有进一步的突破!
    qiandao qiandao
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-20 20:10 , Processed in 0.091978 second(s), 21 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表