天天看点

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

开发环境: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"

#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();    

 SysTick_Init();  

}

并在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    

#define TASK_START_STK_SIZE    512   

#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);     

  }

}

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后续更新!!!

继续阅读