nu-lb-nuc140 freertos 移植

22 篇文章 0 订阅

nu-lb-nuc140 freertos 外部按键 中断实验

参考实验代码为:
en.stm32cubef4\STM32Cube_FW_F4_V1.21.0\Projects\STM32F412G-Discovery\Applications\FreeRTOS\FreeRTOS_SemaphoreFromISR

1 用到的芯片和对应的BSP

https://www.nuvoton.com/hq/products/microcontrollers/arm-cortex-m0-mcus/nuc140-240-connectivity-series/nuc140ve3cn/?__locale=zh

https://www.nuvoton.com/hq/products/microcontrollers/arm-cortex-m0-mcus/nuc140-240-connectivity-series/nuc140ve3cn/?__locale=zh

这里写图片描述

NUC140VE3CN

2 移植用到的freertos 版本

FreeRTOSV8.2.3.zip

3 删掉用不到的文件

在Nu_LB_NUC140_BSP目录下面创建一个新的目录,
名字是ThirdParty
然后 ,解压FreeRTOSV8.2.3.zip ,
将其中的FreeRTOSV8.2.3\FreeRTOS 目录,
复制到Nu_LB_NUC140_BSP\ThirdParty 目录下面。

然后,将 Nu_LB_NUC140_BSP\ThirdParty\FreeRTOS\目录下面的
links_to_doc_pages_for_the_demo_projects 文件删掉
readme.txt文件删掉
ThirdParty\FreeRTOS\Demo 目录下面
除了
Common 目录
CORTEX_STM32F103_Keil目录
其他的目录都删除掉

ThirdParty\FreeRTOS\Source\portable 下面
除了
MemMang 目录
Keil目录
RVDS目录
都删除掉

4 制作模板工程

去掉 DEBUG_ENABLE_SEMIHOST
NUC140 不知道要使用 那个 bsp ,有点乱

在Nu_LB_NUC140_BSP\SampleCode\Nu-LB-NUC140\GPIO_LED 的基础上面
加入 uart0 串口输出功能。
修改方式如下:
keil—> options 里面 C/C++ 中 去掉 DEBUG_ENABLE_SEMIHOST

修改MCU_init.h:

//Define Clock source
#define MCU_CLOCK_SOURCE      
#define MCU_CLOCK_SOURCE_HIRC // HXT, LXT, HIRC, LIRC
#define MCU_CLOCK_FREQUENCY   50000000  //Hz


//Define MCU Interfaces
#define MCU_INTERFACE_UART0
#define UART_CLOCK_SOURCE_HIRC // HXT, LXT, PLL, HIRC
#define UART_CLOCK_DIVIDER     3
#define PIN_UART0_RX_PB0
#define PIN_UART0_TX_PB1

//Define MCU Interfaces

修改main函数

//
// GPIO_LED : GPIO output to control an on-board red LED
// 
// EVB : Nu-LB-NUC140
// MCU : NUC140VE3CN

// low-active output control by GPC12

#include <stdio.h>
#include "NUC100Series.h"
#include "MCU_init.h"
#include "SYS_init.h"

int main(void)
{
    SYS_Init();      
    UART_Open(UART0, 115200);
    printf("Hello World \r\n"); 

    GPIO_SetMode(PC, BIT12, GPIO_MODE_OUTPUT);



    while(1) {
      PC12 =0; // turn on LED
      CLK_SysTickDelay(100000);  // Delay 
      PC12 =1; // turn off LED
      CLK_SysTickDelay(100000);  // Delay           
        }
}

这样串口就能够输出内容了。

将GPIO_LED目录 复制一份,重命名为FreeRTOS_Templete

5 为FreeRTOS_Templete 工程添加文件

添加的文件名字为:
ThirdParty\FreeRTOS\Source
list.c
queue.c
tasks.c
timers.c

ThirdParty\FreeRTOS\Source\portable\RVDS\ARM_CM0
port.c

ThirdParty\FreeRTOS\Source\portable\MemMang
heap_2.c
这里写图片描述

6 为FreeRTOS_Templete 工程添加头文件include路径

option—> C/C++
这里写图片描述

……..\ThirdParty\FreeRTOS\Source\include
……..\ThirdParty\FreeRTOS\Source\portable\RVDS\ARM_CM0
……..\ThirdParty\FreeRTOS\Demo\Common\include

7 添加 FreeRTOSConfig.h文件

添加到main.c 所在目录下面
内容如下:

/*
    FreeRTOS V7.4.0 - Copyright (C) 2013 Real Time Engineers Ltd.

    FEATURES AND PORTS ARE ADDED TO FREERTOS ALL THE TIME.  PLEASE VISIT
    http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.

*/


#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H

/*-----------------------------------------------------------
 * Application specific definitions.
 *
 * These definitions should be adjusted for your particular hardware and
 * application requirements.
 *
 * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
 * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
 *
 * See http://www.freertos.org/a00110.html.
 *----------------------------------------------------------*/

/* Ensure stdint is only used by the compiler, and not the assembler. */
#ifdef __ICCARM__
#include <stdint.h>
extern uint32_t SystemCoreClock;
#endif

#ifdef __ARMCC_VERSION
#include "NUC100Series.h"
#endif

#define configUSE_PREEMPTION            1
#define configUSE_IDLE_HOOK             0
#define configUSE_TICK_HOOK             0
#define configCPU_CLOCK_HZ              ( SystemCoreClock )
#define configTICK_RATE_HZ              ( ( portTickType ) 1000 )
#define configMAX_PRIORITIES            ( ( unsigned portBASE_TYPE ) 5 )
#define configMINIMAL_STACK_SIZE        ( ( unsigned short ) 50 )
#define configTOTAL_HEAP_SIZE           ( ( size_t ) ( 8 * 1024 ) )
#define configMAX_TASK_NAME_LEN         ( 10 )
#define configUSE_TRACE_FACILITY        1
#define configUSE_16_BIT_TICKS          0
#define configIDLE_SHOULD_YIELD         1
#define configUSE_MUTEXES               1
#define configQUEUE_REGISTRY_SIZE       8
#define configCHECK_FOR_STACK_OVERFLOW  0
#define configUSE_RECURSIVE_MUTEXES     1
#define configUSE_MALLOC_FAILED_HOOK    0
#define configUSE_APPLICATION_TASK_TAG  0
#define configUSE_COUNTING_SEMAPHORES   1
#define configGENERATE_RUN_TIME_STATS   0
#define configUSE_QUEUE_SETS            1

/* Co-routine definitions. */
#define configUSE_CO_ROUTINES       0
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )

/* Software timer definitions. */
#define configUSE_TIMERS                1
#define configTIMER_TASK_PRIORITY       ( 2 )
#define configTIMER_QUEUE_LENGTH        10
#define configTIMER_TASK_STACK_DEPTH    ( configMINIMAL_STACK_SIZE * 2 )

/* Set the following definitions to 1 to include the API function, or zero
to exclude the API function. */
#define INCLUDE_vTaskPrioritySet        1
#define INCLUDE_uxTaskPriorityGet       1
#define INCLUDE_vTaskDelete             1
#define INCLUDE_vTaskCleanUpResources   1
#define INCLUDE_vTaskSuspend            1
#define INCLUDE_vTaskDelayUntil         1
#define INCLUDE_vTaskDelay              1

/* Cortex-M specific definitions. */
#ifdef __NVIC_PRIO_BITS
/* __BVIC_PRIO_BITS will be specified when CMSIS is being used. */
#define configPRIO_BITS             __NVIC_PRIO_BITS
#else
#define configPRIO_BITS             4        /* 15 priority levels */
#endif

/* The lowest interrupt priority that can be used in a call to a "set priority"
function. */
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY         0xf

/* The highest interrupt priority that can be used by any interrupt service
routine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL
INTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER
PRIORITY THAN THIS! (higher priorities are lower numeric values. */
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY    5

/* Interrupt priorities used by the kernel port layer itself.  These are generic
to all Cortex-M ports, and do not rely on any particular library functions. */
#define configKERNEL_INTERRUPT_PRIORITY         ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!
See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */
#define configMAX_SYSCALL_INTERRUPT_PRIORITY    ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )

/* Normal assert() semantics without relying on the provision of an assert.h
header file. */
#define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); }

/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS
standard names. */
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler

#endif /* FREERTOS_CONFIG_H */

注意其中的

#ifdef __ARMCC_VERSION
#include "NUC100Series.h"
#endif


#define configUSE_IDLE_HOOK             0
#define configUSE_TICK_HOOK             0
#define configUSE_MALLOC_FAILED_HOOK    0

编译一下 ,应该是成功了。

8 main.c 添加 FreeRTOS 函数

首先添加如下内容,

#include "FreeRTOS.h"
#include "task.h"
#include "timers.h"
#include "semphr.h"

#define THREAD_TEST_STACK_SIZE  configMINIMAL_STACK_SIZE    
#define THREAD_TEST_PRIORITY    ( tskIDLE_PRIORITY + 1 )

void Thread_Task1( void *pvParameters );
void Thread_Task2( void *pvParameters );

void vStartThreadTasks( void )
{
    xTaskCreate( Thread_Task1, (const  char * ) "Th_Task1", THREAD_TEST_STACK_SIZE, NULL, THREAD_TEST_PRIORITY, ( xTaskHandle * ) NULL );
    xTaskCreate( Thread_Task2, (const  char * ) "Th_Task2", THREAD_TEST_STACK_SIZE, NULL, THREAD_TEST_PRIORITY, ( xTaskHandle * ) NULL );
}

void Thread_Task1( void *pvParameters )
{
    portTickType xLastTime1;

    /* Get current system TickCount. */
    xLastTime1 = xTaskGetTickCount();

    for( ;; )
    {
        /* Run a time every 400 milliseconds. */
        vTaskDelayUntil( &xLastTime1, 400 );

        printf("Task1 called-\n");
    }   
}

void Thread_Task2( void *pvParameters )
{
    portTickType xLastTime2;

    /* Get current system TickCount. */
    xLastTime2 = xTaskGetTickCount();   

    for( ;; )
    {
        /* Run a time every 800 milliseconds. */
        vTaskDelayUntil( &xLastTime2, 800 );
        printf("Task2 called--\n");
    }
}

然后在 main函数中,添加如下内容:

     vStartThreadTasks();

    vTaskStartScheduler();

完整的main.c内容如下:

//
// GPIO_LED : GPIO output to control an on-board red LED
// 
// EVB : Nu-LB-NUC140
// MCU : NUC140VE3CN

// low-active output control by GPC12

#include <stdio.h>
#include "NUC100Series.h"
#include "MCU_init.h"
#include "SYS_init.h"

#include "FreeRTOS.h"
#include "task.h"
#include "timers.h"
#include "semphr.h"

#define THREAD_TEST_STACK_SIZE  configMINIMAL_STACK_SIZE    
#define THREAD_TEST_PRIORITY    ( tskIDLE_PRIORITY + 1 )

void Thread_Task1( void *pvParameters );
void Thread_Task2( void *pvParameters );

void vStartThreadTasks( void )
{
    xTaskCreate( Thread_Task1, (const  char * ) "Th_Task1", THREAD_TEST_STACK_SIZE, NULL, THREAD_TEST_PRIORITY, ( xTaskHandle * ) NULL );
    xTaskCreate( Thread_Task2, (const  char * ) "Th_Task2", THREAD_TEST_STACK_SIZE, NULL, THREAD_TEST_PRIORITY, ( xTaskHandle * ) NULL );
}

void Thread_Task1( void *pvParameters )
{
    portTickType xLastTime1;

    /* Get current system TickCount. */
    xLastTime1 = xTaskGetTickCount();

    for( ;; )
    {
        /* Run a time every 400 milliseconds. */
        vTaskDelayUntil( &xLastTime1, 400 );

        printf("Task1 called-\n");
    }   
}

void Thread_Task2( void *pvParameters )
{
    portTickType xLastTime2;

    /* Get current system TickCount. */
    xLastTime2 = xTaskGetTickCount();   

    for( ;; )
    {
        /* Run a time every 800 milliseconds. */
        vTaskDelayUntil( &xLastTime2, 800 );
        printf("Task2 called--\n");
    }
}



int main(void)
{
    SYS_Init();      
        UART_Open(UART0, 115200);
        printf("Hello World \r\n"); 

    GPIO_SetMode(PC, BIT12, GPIO_MODE_OUTPUT);


      vStartThreadTasks();

    vTaskStartScheduler();

    while(1) {
      PC12 =0; // turn on LED
      CLK_SysTickDelay(100000);  // Delay 
      PC12 =1; // turn off LED
      CLK_SysTickDelay(100000);  // Delay           
        }
}

输出的内容:

Hello World 


Task1 called-


Task2 called--

Task1 called-


Task1 called-


Task2 called--

Task1 called-


Task1 called-


Task2 called--

启动FreeRTOS之后,LED灯不会闪烁了。

位置:
E:\Nu_LB_Nuc140\Nu_LB_NUC140_BSP\SampleCode\Nu-LB-NUC140\FreeRTOS_Templete

9 对应的硬件

对应的板子为Nu_LB_Nuc140
对应的LED为:
这里写图片描述

对应的UART为:
这里写图片描述

(稍后补充)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值