Keil移植uCOS-II到STM32开发板(STM32F107VCT6)

时间:2022-02-06 20:07:35

开发环境:Keil V4.60

STM32固件库:V3.5

操作系统:uCOS-II V2.92

开发板:金牛STM32开发板

 

《IAR移植uCOS-II到STM32开发板(STM32F107VCT6)》(http://blog.csdn.net/harborxing/article/details/8139495 

 

说明:此教程是参考野火uCOS移植教程完成移植后自我修改的!

 

1.从ST官网下载STM32F10x固件库代码(http://www.st.com/internet/com/SOFTWARE_RESOURCES/SW_COMPONENT/FIRMWARE/stm32f10x_stdperiph_lib.zip),,下载完成后解压待用;

2.从Micrium官网下载官方针对于STM32F107的移植代码(http://micrium.com/page/downloads/ports/st/stm32),须注册下载,下载完成后解压待用;

Keil移植uCOS-II到STM32开发板(STM32F107VCT6)

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),遇到下面提示框时,点否;

Keil移植uCOS-II到STM32开发板(STM32F107VCT6)

9.点击以下按钮,在出现的对话框中分别建立如下图所示工程目录;

Keil移植uCOS-II到STM32开发板(STM32F107VCT6)

Keil移植uCOS-II到STM32开发板(STM32F107VCT6)

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下的文件比较多,这里将其折叠起来了);

Keil移植uCOS-II到STM32开发板(STM32F107VCT6)

/*********************************************************************至此,工程文件建立已完成***********************************************************************************/

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将其注释),要注释的部分如下图所示;

Keil移植uCOS-II到STM32开发板(STM32F107VCT6)

Keil移植uCOS-II到STM32开发板(STM32F107VCT6)

Keil移植uCOS-II到STM32开发板(STM32F107VCT6)

13.打开os_dbg.h,将

#define  OS_COMPILER_OPT  __root

改为

#define  OS_COMPILER_OPT  //__root

(将__root注释掉,该操作与编译器有关);

14.打开os_cpu_a.asm,将

Keil移植uCOS-II到STM32开发板(STM32F107VCT6)

中的PUBLIC改为EXPORT,同时将

Keil移植uCOS-II到STM32开发板(STM32F107VCT6)

改为

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.最后,设置相关选项,依次点击并修改如下图:

Keil移植uCOS-II到STM32开发板(STM32F107VCT6)

Keil移植uCOS-II到STM32开发板(STM32F107VCT6)Keil移植uCOS-II到STM32开发板(STM32F107VCT6)

Keil移植uCOS-II到STM32开发板(STM32F107VCT6)

Keil移植uCOS-II到STM32开发板(STM32F107VCT6)

Keil移植uCOS-II到STM32开发板(STM32F107VCT6)

Keil移植uCOS-II到STM32开发板(STM32F107VCT6)

Keil移植uCOS-II到STM32开发板(STM32F107VCT6)

Keil移植uCOS-II到STM32开发板(STM32F107VCT6)

Keil移植uCOS-II到STM32开发板(STM32F107VCT6)

编译,通过J-Link烧到开发板,小灯闪烁,成功!!!哈哈!!

使用IAR移植uCOS-II到STM32后续更新!!!