zoukankan      html  css  js  c++  java
  • GD32E507移植FreeRTOS

    一、准备工作

    硬件平台:一块GD32E507Z-EVAL评估板(MCU是GD32E507ZET6)

    软件开发环境:KEIL

    源码:GD32官方源码(标准库),FreeRTOS源码(FreeRTOSv202107.00)

    二、创建工程

    由于GD32提供的源码有多份例程,这些例程会共用相同的源码,比如CMSIS里的文件,Utilities里的文件和GD32E50x_standard_peripheral里的文件等。所以最好需要单独创建一个工程,把这些文件复制一份出来,用于这个工程。这里我复制的工程师跑马灯的工程。

     其中FreeRTOS是后期移植的,现在暂时可以不管这个文件夹。我们来看看其他文件夹里都有什么东西:

      ①   Application文件夹

     

      ②  CMSIS文件夹

    这个文件夹也是在GD32官方源码中复制过来的:

     

       ③  GD32E50x_standard_peripheral文件夹

    GD32E50x的标准库函数:

     

       ④  Utilities文件夹

     复制完成后,添加必须的文件到工程中:

     包含头文件路径:

     编译看有没有什么错误,并下载到板子上,如果LED可以根据需求运行起来,说明工程创建没问题,接下来就是移植FreeRTOS了。

    三、移植FreeRTOS

    创建一个FreeRTOS的文件夹,进入文件夹中再创建一个“source”文件夹和一个“portable”文件夹,“source”文件夹中再创建一个“src”文件夹和一个“inc”文件夹。

      ①  把FreeRTOS源码中的“Source”文件夹中的C文件复制到我们工程中的FreeRTOS->source->src

     

       ②   把FreeRTOS源码中的Source目录下的“include”文件夹中的内容全部复制到FreeRTOS->source->inc中:

       ③  把FreeRTOS源码中的“Source”目录中的“portable”文件夹整个复制到工程目录中的FreeRTOS目录下:

     把一些不重要的文件夹删除,只保留“Keil”、“MemMang”、“RVDS”三个文件夹即可:

     然后把一些源文件添加到工程中:

     再添加头文件路径:

     PS:RVDS文件夹中本来是没有ARM_CM33_NTZ这个文件夹的,这是我从FreeRTOS源码中复制过来的,路径如下图所示:

     里面包含的内容如下:

     暂时没了解这些文件的作用是什么,打算慢慢在实践的过程中去了解,毕竟总是学习理论知识也是很枯燥的。

    接着,我们编译一下,不出意外的话,一定会报错,而且跟“FreeRTOSConfig.h”这个头文件有关系,因为我们移植的时候并没有把它移植过来,所以现在需要去找到这个文件,把它移植过来。因为我们的MCU是Cortex-M33内核的,所以必须找这一款内核的例程来移植。我在官方的例程找到一个:

     这个例程的Config文件中就有这么一个头文件:

     复制到我们的工程中的某一个inc文件夹中,记得必须包含这个头文件路径,再编译一下,可能会出现很多报错,比如重定义,下面这三个函数在portasm.c中已经有定义,所以把此处的函数屏蔽掉即可。

     另外可能还有一些钩子函数的报错,这是FreeRTOSConfig.h中相关的宏定义被设置为非0数值,使能了却没有相应的函数来执行操作,所以把这些宏定义设置为0即可。

     可能还有其他的报错,一般都是修改FreeRTOSConfig.h中的宏定义就可以解决了。具体问题需要具体分析。

    接下来,开始编写代码:

    #include "gd32e50x.h"
    #include "systick.h"
    #include "FreeRTOSConfig.h"
    #include "FreeRTOS.h"
    #include "task.h"
    
    
    #define LED1_ON				gpio_bit_set(GPIOG, GPIO_PIN_10)
    #define LED1_OFF			gpio_bit_reset(GPIOG, GPIO_PIN_10)
    
    #define LED2_ON				gpio_bit_set(GPIOG, GPIO_PIN_11)
    #define LED2_OFF			gpio_bit_reset(GPIOG, GPIO_PIN_11)
    
    #define LED3_ON				gpio_bit_set(GPIOG, GPIO_PIN_12)
    #define LED3_OFF			gpio_bit_reset(GPIOG, GPIO_PIN_12)
    
    #define LED4_ON				gpio_bit_set(GPIOG, GPIO_PIN_13)
    #define LED4_OFF			gpio_bit_reset(GPIOG, GPIO_PIN_13)
    
    
    #define START_TASK_PRIO	  1	
    #define START_STK_SIZE		120
    TaskHandle_t Start_Task_Handler;
    
    #define LED_TASK_PRIO	  2	
    #define LED_STK_SIZE		120
    TaskHandle_t LED_Task_Handler;
    
    void start_task(void * parameter);
    void led_task(void * parameter);
    
    /*!
        rief      main function
        param[in]  none
        param[out] none
        
    etval     none
    */
    int main(void)
    {
        systick_config();
    
        /* enable the LEDs clock */
        rcu_periph_clock_enable(RCU_GPIOG);
        /* configure LEDs GPIO port */ 
        gpio_init(GPIOG, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13);
        /* reset LEDs GPIO pin */
        gpio_bit_reset(GPIOG, GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13);
    	
    		xTaskCreate(start_task,"start_task",START_STK_SIZE,NULL,START_TASK_PRIO,&Start_Task_Handler);
    	
    		vTaskStartScheduler();
        
        while(1){
    
        }
    }
    
    
    void start_task(void * parameter)
    {
    	xTaskCreate(led_task,"led_task",LED_STK_SIZE,NULL,LED_TASK_PRIO,&Start_Task_Handler);
    	vTaskDelete(NULL);
    }
    
    void led_task(void * parameter)
    {
    	while(1)
    	{
    		LED1_ON;
    		vTaskDelay(1000);
    		LED2_ON;
    		vTaskDelay(200);
    		LED3_ON;
    		vTaskDelay(200);
    		LED4_ON;
    		vTaskDelay(200);
    		LED4_OFF;
    		vTaskDelay(200);
    		LED3_OFF;
    		vTaskDelay(200);
    		LED2_OFF;
    		vTaskDelay(200);
    		LED1_OFF;
    		vTaskDelay(1000);
    
    	}
    }
    

      

    编译后下载到板子上,发现灯变化的速度很慢,经过调试,发现是FreeRTOSConfig.h中有一个宏定义的值小了,

     原来定义的是100,LED闪烁的频率很慢,修改为1000后频率正常。

  • 相关阅读:
    【ZOJ3195】Design the City-LCA算法
    【ZOJ3195】Design the City-LCA算法
    【POJ1330】Nearest Common Ancestors-LCA算法
    【POJ1330】Nearest Common Ancestors-LCA算法
    【POJ3237】Tree-树链剖分
    【POJ3237】Tree-树链剖分
    【SPOJ375】Query on a tree-树链剖分
    perl 回调必须是函数引用
    运行复制的ZooKeeper 部署
    运行复制的ZooKeeper 部署
  • 原文地址:https://www.cnblogs.com/young-dalong/p/15390059.html
Copyright © 2011-2022 走看看