开发环境:IAR V5.3
STM32固件库:V3.5
操作系统:uCOS-II V2.92
开发板:金牛STM32开发板
《keil移植uCOS-II到STM32开发板(STM32F107VCT6)》(http://blog.csdn.net/harborxing/article/details/8102323)
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),须注册下载,下载完成后解压待用;
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.将STM32固件库源码目录\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template\EWARM下的stm32f10x_flash.icf复制到工程目录\uCOSTest\Project文件夹下;
8.选择工程目录\uCOSTest\uCOS-II\Ports下的所有文件选中,右键选属性,将只读前面的勾去掉,点确定;对\uCOSTest\BSP\CMSIS\startup\iar(注:这里是iar目录而不是arm目录,与keil不同)下的所有文件也进行相同操作;这样做的目的是为了后续步骤可以对这些文件进行修改;
/*********************************************************************至此,所有的拷贝工作已完成***********************************************************************************/
9.打开IAR Embedded Workbench,在\uCOSTest\Project下新建工程文件(这里工程名为uCOSTest);
10.右键Workspace窗口中的工程文件->Add->Add Group,依次添加StartCode、CMSIS、FWLib、App、BSP、uCOS-II/Ports、uCOS-II/Source七个文件夹,然后在StartCode中将\uCOSTest\BSP\CMSIS\startup\iar(注:这里是iar目录而不是arm目录,与keil不同)下的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.修改启动文件,打开startup_stm32f10x_cl.s,将文件中的PendSV_Handler全部用OS_CPU_PendSVHandler代替(将硬件中断向量入口指向uCOS-II系统中断服务例程);
15.编写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
16.打开stm32f10x_it.c,重写SysTick_Handler函数,如下;
void SysTick_Handler(void)
{
OSIntEnter(); /*进入中断*/
OSTimeTick(); /*执行系统时钟节拍函数*/
OSIntExit(); /*退出中断*/
}
17.打开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
/*********************************************************************至此,各文件修改已完成***********************************************************************************/
18.开始创建任务,让系统跑起来(这里以闪烁灯为例),打开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();
19.打开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
20.打开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毫秒*/
}
}
21.最后,设置相关选项,依次点击Project->Options并修改如下图:
以上Additional include directories设置如下:
$PROJ_DIR$\..\App
$PROJ_DIR$\..\BSP
$PROJ_DIR$\..\BSP\CMSIS
$PROJ_DIR$\..\BSP\CMSIS\startup\iar
$PROJ_DIR$\..\BSP\FWLib\inc
$PROJ_DIR$\..\uCOS-II\Ports
$PROJ_DIR$\..\uCOS-II\Source
编译,通过J-Link烧到开发板,像用keil移植一样,小灯闪烁,移植成功!