1. 程式人生 > >Keil移植uCOS-II到STM32開發板(STM32F107VCT6)

Keil移植uCOS-II到STM32開發板(STM32F107VCT6)

開發環境:Keil V4.60

STM32韌體庫:V3.5

作業系統:uCOS-II V2.92

開發板:金牛STM32開發板

說明:此教程是參考野火uCOS移植教程完成移植後自我修改的!

3.建立工程資料夾(這裡為uCOSTest),進入該資料夾,依次建立App、BSP、Project、uCOS-II四個資料夾;

4.進入App資料夾,新建app.c、app.h、app_cfg.h、includes.h四個檔案,並將uCOS-II原始碼目錄\Micrium\Software\EvalBoards\Micrium\uC-Eval-STM32F107\IAR\OS-II下的os_cfg.h複製到該資料夾下;

5.進入BSP資料夾,新建CMSIS、FWLib兩個資料夾和bsp.c、bsp.h兩個檔案,並將\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template下的stm32f10x_it.c、stm32f10x_it.h和stm32f10x_conf.h三個檔案複製到該檔案下;同時將STM32韌體庫原始碼目錄\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport中的core_cm3.c、core_cm3.h兩個檔案和\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x下的startup資料夾以及system_stm32f10x.c、system_stm32f10x.h、stm32f10x.h三個檔案複製到CMSIS資料夾下;還要將\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver下的inc、src兩個資料夾複製到FWLib資料夾下;

6.進入uCOS-II資料夾,新建Source和Ports兩個資料夾,並將uCOS-II原始碼目錄C:\Documents and Settings\Administrator\桌面\Micrium\Software\uCOS-II\Source下的所有檔案複製到Source資料夾中;同時將\Micrium\Software\uCOS-II\Ports\ARM-Cortex-M3\Generic\IAR下的所有檔案複製到Ports資料夾下;

7.選擇工程目錄\uCOSTest\uCOS-II\Ports下的所有檔案選中,右鍵選屬性,將只讀前面的勾去掉,點確定;對\uCOSTest\BSP\CMSIS\startup\arm下的所有檔案也進行相同操作;這樣做的目的是為了後續步驟可以對這些檔案進行修改;

/*********************************************************************至此,所有的拷貝工作已完成***********************************************************************************/

8.開啟Keil uVision4,在\uCOSTest\Project下新建工程檔案(這裡工程名為uCOSTest),並選擇相應的CPU型號(這裡選擇的是STM32F107VC),遇到下面提示框時,點否;

9.點選以下按鈕,在出現的對話方塊中分別建立如下圖所示工程目錄;

10.在StartCode中將\uCOSTest\BSP\CMSIS\startup\arm下的startup_stm32f10x_cl.s(根據CPU具體型號來選擇啟動檔案)檔案新增進來,在CMSIS中將\uCOSTest\BSP\CMSIS下的core_cm3.c和system_stm32f10x.c新增進來,在FWLib中將\uCOSTest\BSP\FWLib\src下的所有檔案新增進來,在App中將\uCOSTest\App下的所有檔案新增進來(這裡也將標頭檔案新增進來了,為了在工程中修改檔案時開啟方便),在BSP中將\uCOSTest\BSP下的bsp.c、stm32f10x_it.c和stm32f10x_conf.h新增進來(新增標頭檔案作用同上),在uCOS-II/Ports中將\uCOSTest\uCOS-II\Ports下的所有檔案新增進來(不要遺漏了os_cpu_a.asm),在uCOS-II/Source中將\uCOSTest\uCOS-II\Source下的所有檔案新增進來,最後得到的工程樹結構如下圖(由於FWLib和uCOS-II/Source下的檔案比較多,這裡將其摺疊起來了);

/*********************************************************************至此,工程檔案建立已完成***********************************************************************************/

11.開始進行檔案修改,開啟os_cfg.h,進行系統裁剪,將OS_APP_HOOKS_EN(應用程式鉤子函式使能)、OS_DEBUG_EN(除錯使能)、OS_EVENT_MULTI_EN(多重事件控制使能)、OS_FLAG_EN(訊號量集使能)、OS_MBOX_EN(訊息郵箱使能)、OS_MEM_EN(動態記憶體管理使能)、OS_MUTEX_EN(互斥型訊號量使能)、OS_Q_EN(訊息佇列使能)、OS_SEM_EN(訊號量使能)、OS_TMR_EN(定時器使能)全部巨集定義改為0,儲存;

12.開啟os_cpu.h,將

void OS_CPU_SysTickHandler(void);
void OS_CPU_SysTickInit(INT32U  cnts);

兩個函式宣告註釋掉(後面我們自己編寫SysTick函式,因此這裡註釋掉);同樣開啟os_cpu_c.c檔案將有關SysTick的函式和宣告註釋掉(可用#if 0....#endif將其註釋),要註釋的部分如下圖所示;

13.開啟os_dbg.h,將

#define  OS_COMPILER_OPT  __root

改為

#define  OS_COMPILER_OPT  //__root

(將__root註釋掉,該操作與編譯器有關);

14.開啟os_cpu_a.asm,將

中的PUBLIC改為EXPORT,同時將

改為

AREA |.text|,CODE,READONLY,ALIGN = 2

THUMB

REQUIRE8

PRESERVE8

(AREA 選擇段 |.text| 程式碼段名稱 CODE 程式碼段 READONLY 只讀 ALIGN=n 2^n位元組對齊 若為IAR編譯器則此處不用改);

15.修改啟動檔案,開啟startup_stm32f10x_cl.s,將檔案中的PendSV_Handler全部用OS_CPU_PendSVHandler代替(將硬體中斷向量入口指向uCOS-II系統中斷服務例程);

16.編寫includes.h中的程式碼,開啟includes.h,寫入以下程式碼;

#ifndef __INCLUDES_H__
#define __INCLUDES_H__

/*韌體庫標頭檔案*/
#include "stm32f10x.h"
#include "stm32f10x_conf.h"

/*uCOS-II標頭檔案*/
#include "ucos_ii.h"

/*板級支援包和應用程式標頭檔案*/
#include "bsp.h"
#include "app.h"

#endif

17.開啟stm32f10x_it.c,重寫SysTick_Handler函式,如下;

void SysTick_Handler(void)
{
 OSIntEnter();  /*進入中斷*/
 OSTimeTick();  /*執行系統時鐘節拍函式*/
 OSIntExit();  /*退出中斷*/
}

18.開啟bsp.c檔案,新增以下程式碼:

#include "bsp.h"
#include "includes.h"

void SysTick_Init(void)
{
 SysTick_Config(SystemCoreClock/OS_TICKS_PER_SEC);  //使能並初始化SysTick定時器
}

void BSP_Init(void)
{
  SystemInit();    /*將系統時鐘初始化為72M*/
 SysTick_Init();   /*SysTick初始化函式*/
}

並在bsp.h中宣告BSP_Init函式,如下:

#ifndef __BSP_H__
#define __BSP_H__

void BSP_Init(void);

#endif

/*********************************************************************至此,各檔案修改已完成***********************************************************************************/

19.開始建立任務,讓系統跑起來(這裡以閃爍燈為例),開啟bsp.c,在檔案中加入以下程式碼:

void RCC_Config(void)
{
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
}

void GPIO_Config(void)
{
 GPIO_InitTypeDef GPIO_InitStructure;
 
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_7;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_Init(GPIOD, &GPIO_InitStructure);
}

並在BSP_Init()函式中加入

RCC_Config();
GPIO_Config();

20.開啟app_cfg.h,加入下面程式碼:

#ifndef __APP_CFG_H__
#define __APP_CFG_H__

#define TASK_START_PRIO        0     /*TaskStart任務的優先順序*/
#define TASK_START_STK_SIZE    512    /*TaskStart任務的任務堆疊大小*/

#endif

21.開啟app.c(也就是我們常說的main()所在的c檔案),加入以下程式碼:

#include "includes.h"

static OS_STK TASK_START_STK[TASK_START_STK_SIZE];   /*建立任務堆疊*/
void TaskStart(void *p_arg);    /*宣告任務函式*/

int main(void)
{
 BSP_Init();     /*初始化底層外設*/
 OSInit();     /*系統初始化*/
  
/*建立任務*/ 

OSTaskCreate(TaskStart,    /*任務函式指標*/
                            (void *)0,      /*傳給任務的引數*/
                           &TASK_START_STK[TASK_START_STK_SIZE - 1],     /*任務堆疊棧頂指標*/
                           TASK_START_PRIO      /*任務的優先順序*/

                          );
 
  OSStart();      /*啟動系統*/
}

void TaskStart(void *p_arg)
{
 INT32U tick = 0;
 
 (void)p_arg;
 
 while (1)
  {
  if(tick % 2 == 0)
  {
   GPIO_SetBits(GPIOD, GPIO_Pin_2 | GPIO_Pin_7);     /*燈亮*/
  }
  else
  {
   GPIO_ResetBits(GPIOD, GPIO_Pin_2 | GPIO_Pin_7);     /*燈滅*/
  }
  tick++;
  
  OSTimeDlyHMSM(0, 0, 0, 500);     /*延時500毫秒*/
  }
}

22.最後,設定相關選項,依次點選並修改如下圖:

編譯,通過J-Link燒到開發板,小燈閃爍,成功!!!哈哈!!

使用IAR移植uCOS-II到STM32後續更新!!!