GD32F303移植UCOSII

发布于:2022-12-05 ⋅ 阅读:(697) ⋅ 点赞:(0)

参考正点原子UCOSII的移植教程,在此基础上进行GD32F303的UCOSII移植,并将过程分享出来,希望可以帮助到大家。

1.首先需要一个GD32可以运行的工程文件,我在其中已经写好了一个串口与一个LED灯的初始化程序(方便观测移植是否成功)。

2.打开正点原子的UCOSII例程

将其中UCOSII复制到准备好的工程文件中,其中包含这三个文件夹。

 然后将其添加到工程中

 

再在编译界面添加三个文件夹

 

3.将正点原子的DELAY文件夹拷贝到工程里,并且添加相关路径。(这一点很重要,因为涉及到任务的切换以及滴答定时器的初始化,都在这里有现成的,我自己写不出来所以只能拷贝了)

3.1

在项目中添加文件夹并且添加相关文件

 3.2在工程中添加根目录

 3.3修改delay文件

 

修改时钟函数

 3.4在delay.h 中添加头文件

#include "gd32f30x.h"
#include "systick.h"

4 修改报错

4.1修改完DELAY后直接编译,编译出错,提示找不到stm32f10x.h 因为从正点原子例程中直接拷贝过来的,我们用的芯片是gd32f303,所以定位到错误地址,修改成 #include <gd32f30x.h>      

4.2注释gd32f30x.c中的 PendSV_Handler  SysTick_Handler 这两个函数

 5.主函数中创建任务,代码如下

#include "gd32f30x.h"
#include "systick.h"
#include <stdio.h>
#include "delay.h"
#include "includes.h"


//START ÈÎÎñ
//ÉèÖÃÈÎÎñÓÅÏȼ¶
#define START_TASK_PRIO            10  ///¿ªÊ¼ÈÎÎñµÄÓÅÏȼ¶Îª×îµÍ
//ÉèÖÃÈÎÎñ¶ÑÕ»´óС
#define START_STK_SIZE            128
//ÈÎÎñÈÎÎñ¶ÑÕ»
OS_STK START_TASK_STK[START_STK_SIZE];
//ÈÎÎñº¯Êý
void start_task(void *pdata);

//LED0ÈÎÎñ
//ÉèÖÃÈÎÎñÓÅÏȼ¶
#define LED0_TASK_PRIO            7
//ÉèÖÃÈÎÎñ¶ÑÕ»´óС
#define LED0_STK_SIZE            128
//ÈÎÎñ¶ÑÕ»
OS_STK LED0_TASK_STK[LED0_STK_SIZE];
//ÈÎÎñº¯Êý
void led0_task(void *pdata);

//LED1ÈÎÎñ
//ÉèÖÃÈÎÎñÓÅÏȼ¶
#define LED1_TASK_PRIO            6
//ÉèÖÃÈÎÎñ¶ÑÕ»´óС
#define LED1_STK_SIZE            128
//ÈÎÎñ¶ÑÕ»
OS_STK LED1_TASK_STK[LED1_STK_SIZE];
//ÈÎÎñº¯Êý
void led1_task(void *pdata);

int main(void)
{
  rcu_ahb_clock_config(RCU_AHB_CKSYS_DIV1);//ÉèÖÃÖ÷Ƶ120M(#define __SYSTEM_CLOCK_120M_PLL_HXTAL           (uint32_t)(120000000),8MÍⲿ¾§Õñ  (#define HXTAL_VALUE    ((uint32_t)8000000))
    delay_init();
    rcu_periph_clock_enable(RCU_AF); //AFʱÖÓʹÄÜ 
    delay_ms(1000);//µÈ´ý1000ms
    gpio_pin_remap_config(GPIO_SWJ_NONJTRST_REMAP, ENABLE);//ÏÂÔØ¿ÚNJTRSTÒý½Åµ±×öÆÕͨI/O¿Ú
    rcu_periph_clock_enable(RCU_GPIOB);//PBʱÖÓʹÄÜ
    gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_4);//PB4ÅäÖóÉÊä³ö
    
        OSInit();  //UCOS³õʼ»¯
    OSTaskCreate(start_task,(void*)0,(OS_STK*)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO); //´´½¨¿ªÊ¼ÈÎÎñ
    OSStart(); //¿ªÊ¼ÈÎÎñ
//    while(1)
//    {
//        delay_1ms(100);//µÈ´ý1000ms
//        gpio_bit_set(GPIOB, GPIO_PIN_4);//Êä³ö¸ß
//        delay_1ms(100);
//        gpio_bit_reset(GPIOB, GPIO_PIN_4);//Êä³öµÍ
//    }
    return 0;
}
//¿ªÊ¼ÈÎÎñ
void start_task(void *pdata)
{
    OS_CPU_SR cpu_sr=0;
    pdata=pdata;
    OSStatInit();  //¿ªÆôͳ¼ÆÈÎÎñ
    
    OS_ENTER_CRITICAL();  //½øÈëÁÙ½çÇø(¹Ø±ÕÖжÏ)
    OSTaskCreate(led0_task,(void*)0,(OS_STK*)&LED0_TASK_STK[LED0_STK_SIZE-1],LED0_TASK_PRIO);//´´½¨LED0ÈÎÎñ
    OSTaskCreate(led1_task,(void*)0,(OS_STK*)&LED1_TASK_STK[LED1_STK_SIZE-1],LED1_TASK_PRIO);//´´½¨LED1ÈÎÎñ
    //OSTaskCreate(float_task,(void*)0,(OS_STK*)&FLOAT_TASK_STK[FLOAT_STK_SIZE-1],FLOAT_TASK_PRIO);//´´½¨¸¡µã²âÊÔÈÎÎñ
    OSTaskSuspend(START_TASK_PRIO);//¹ÒÆð¿ªÊ¼ÈÎÎñ
    OS_EXIT_CRITICAL();  //Í˳öÁÙ½çÇø(¿ªÖжÏ)
}
 

//LED0ÈÎÎñ
void led0_task(void *pdata)
{
    while(1)
    {
    
     gpio_bit_set(GPIOB, GPIO_PIN_4);//Êä³ö¸ß
    
        delay_ms(500);
    }
}

//LED1ÈÎÎñ
void led1_task(void *pdata)
{
    while(1)
    {
    
        delay_ms(300);
     gpio_bit_reset(GPIOB, GPIO_PIN_4);//Êä³öµÍ
        delay_ms(300);
    }
}

PB4按程序逻辑正常闪烁,移植成功