STM32固件库3.5+uCOS2.86移植(转自暴走的工程师)

考了很多移植的资料和代码,终于移植好了。。。应该是完美移植吧~~哈哈哈~~
编译环境是IAR
工程适用于STM32F10X大容量产品,如果不是,请自行修改启动文件和工程配置
编译器优化等级最高。。。这个你们根据需要自己调整吧。。。

###############################################################################

1.Jean J.Labrosse与μCOS—II
μCOS—II是一个实时可剥夺型操作系统内核,该操作系统支持最多64个任务,但每个任务的优先级必须互不相同,优先级号小的任务比优先级号大的任务具
有更高的优先级,并且该操作系统总是调度优先级最高的就绪态任务运行。此内核的代码是美国人Jean
J.Labrosse用C语言编写的(花了一年时间),具有很好的可移植性,其2.52版本通过了美国航天航空管理局的安全认证,可靠性非常高。

2.准备工作
去micrium(uscos官网)和arm指令官网(为了汇编)找相应的appNote和源码
STM32F103ZE AN1913
arm指令。。随便给的,再找一找具体的

先把固件库先建立好。

下面进行移植。首先去官网下载ucos的最新版本2.86源码。还有2.86的keil的工程以及2.92IAR的工程(不知道为虾米,就是木有2.92的源码下载。。。)

把源码解压,在工程的根目录下新建文件夹uCOS_II,再在这个文件夹里面再新建两个文件夹Source和Ports

在Source文件夹里面放入如下文件

在工程里面把文件包含进去并设置好。

编译,肯定会出错。

提示:.\uCOS_II\Source\ucos_ii.h(44):
error:

#5: cannot open source
input file "app_cfg.h": No such file or directory

把2.86工程里面的app_cfg.h复制并放到APP文件夹下。再编译
评论:app_cfg.h只是一些配置文件,可以根据自己的需要剪裁

提示:.\uCOS_II\Source\ucos_ii.h(45):
error:  #5: cannot open source
input file "os_cfg.h": No such file or directory

把2.90源码里的os_cfg_r.h改名为os_cfg.h以及os_dbg_r.c改名为os_dbg.c后放入APP文件夹下。再编译

评论:os_cfg.h
和os_dbg.h也可以在\Micrium\Software\EvalBoards\ST\STM32F103ZE-SK\IAR\OS-Probe-LCD找到

提示:.\uCOS_II\Source\ucos_ii.h(46):
error:  #5: cannot open source
input file "os_cpu.h": No such file or directory

把2.92工程里的os_cpu.h和os_cpu.c,以及2.86工程的os_cpu_a.asm复制到ports文件夹下。(注意2.90版本新增的一个钩子函数)编译

评论:没遇到此类问题

提示:.\object\ucos_ii.axf: Error: L6218E: Undefined symbol App_TCBInitHook (referred from os_cpu_c.o).等等几个

把os_cfg.h里的OS_APP_HOOKS_EN设置为0。编译

无错误。

#################################################

注意:以下是2.90新增的钩子函数,如报错,请在os_cpu.c增加以下代码

########################################

但是还有很多事情要做。。。(以上仅供参考~)

新建文件夹BSP。用于放驱动层与应用层之间的BSP文件。

把2.86工程里面才bsp.c和bsp.h放进去,并进行适当的修改(自己斟酌。。。)。唯一要注意的是需要保留OS_CPU_SysTickClkFreq这个函数。

评论:以上这段要适量剪裁,其实OS_CPU_SysTickClkFreq在初始阶段没有编译哦,加不加无所谓

使用st V3.5.0 库中的startup_stm32f10x_hd.s 作为启动代码
需要修改的地方:
用OS_CPU_PendSVHandler 替换startup_stm32f10x_hd.s
中所有的PendSV_Handler
用OS_CPU_SysTickHandler 替换startup_stm32f10x_hd.s
中所有的SysTick_Handler
评论:st
v3.5.0的确实要替换这两个鬼东东,但是如果你用Micrium\Software\EvalBoards\ST\STM32-SK\IAR\OS-Probe-LCD\app_vect_v5.c
这个C程序的启动文件 完全不用更改

测试一下咯。。。 写一个串口驱动。。很简单

void uart_init(void)
{
u32 baudRate = 115200;//波特率
    float temp;
    u16 BRR_Value;
    u16 BRR_Mantissa;
    u16 BRR_Fraction;

    //定义时钟选择结构体
    RCC_ClocksTypeDef RCC_ClocksStatus;

    RCC_GetClocksFreq(&RCC_ClocksStatus);
    //选择PCLK2 为时钟 RCC设置里未分频,即72Mhz
    temp = (float)(RCC_ClocksStatus.PCLK2_Frequency)/(baudRate*16);

    BRR_Mantissa = (u32)temp;    //得到BRR[15:4]整数部分

    BRR_Fraction = (u32)(temp - BRR_Mantissa)*16;  //得到BRR[3:0]小数部分

    BRR_Mantissa<<=4;

    BRR_Value = BRR_Mantissa + BRR_Fraction;  //拼接整数和小数部分

    USART1->BRR = BRR_Value;  //设置波特比率

    USART1->CR1 |= 1<<13;    // Enable the USART by writing the UE bit in USART_CR1 register to 1

    USART1->CR1 |= 1<<2;    // Set the TE bit in USART_CR1 to send an idle frame as first transmission

    USART1->CR1 |= 1<<3;    //    Set the RE bit USART_CR1. This enables the receiver which begins searching for a start bit.

}
//我这个用库了。。不用库也一样。。没找到不用库的版本
void USART1_Puts(char * str)
{
    //USART_ClearFlag(USART1,USART_FLAG_TC); 清零TC用的,网上说法:“清除标志位,否则第1位数据会丢失”
    while(*str)
    {
        GPIO_ResetBits(GPIOF, GPIO_Pin_8);
        USART_SendData(USART1, *str++);

        while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
        {
        }
        GPIO_SetBits(GPIOF, GPIO_Pin_8);
    }
}

主程序来一下~
int  main (void)
{
   OSInit();                                                  

   OSTaskCreateExt(AppStartTask,
                    (void *)0,
                    (OS_STK *)&AppStartTaskStk[TASK_STK_SIZE-1],
                    TASK_START_PRIO,
                    TASK_START_PRIO,
                    (OS_STK *)&AppStartTaskStk[0],
                    TASK_STK_SIZE,
                    (void *)0,
                    OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);

    OSStart();
}
再来个task任务~别忘了声明啊static  void  AppStartTask (void *p_arg);

static  void  AppStartTask (void *p_arg)
{
    (void)p_arg;

     USART1_Puts("aaaaa!\r\n");

     while(1) {
        delay();
    }
}

下面就简单讲下ucos移植时各个文件的要点。

首先是source文件夹里面的源码,是用C写好的系统源码,这个不需要我们改,包括以下文件。

然后是Ports文件夹里面的,这个是与硬件平台有关的代码,有一部分用汇编写成。本来这一部分的编写是需要我们自己来的,但是既然官网都给我们了,不用是傻13。。。主要有以下文件:


a:os_cpu.h主要声明了与微处理器无关的常量、宏和声明。ucos为了可移植性,用INT32U代替了unsigned
int等等之类的,就是在此声明的。

B:os_cpu.c里的是与CPU相关的C函数和钩子函数。里面真正需要我们写的只有OSTaskStkInit()这个函数。这个函数主要用于任务堆栈的初始化。

C:os_cpu_a.asm主要是与处理器相关的汇编代码。占移植工作的70%。(不过我不写,哈哈哈)实现的是下面五个与处理器相关的函数。

1、OS_CPU_SR_Save();关中断函数
2、OS_CPU_SR_Restore();恢复中断函数
3、OSStartHighRdy();启动最高优先级任务运行
4、OSCtxSw();任务级任务切换
5、OSIntCtxSw();ISR中执行任务级任务切换

D:os_dbg.c主要是一些变量。不用写,把源码里的os_dbg_r.c改名为os_dbg.c即可

最后就是与应用层相关的配置文件了,都被我放进APP文件夹里了。主要有app_cfg.h和os_cfg.h两个文件。os_cfg.h直接把
os_cfg_r.h改名为os_cfg.h就可以了,主要是裁剪操作系统用的,里面是操作系统功能开关和配置。app_cfg.h是放APP层里面建立
任务的优先级和堆栈大小的。

差点忘了说了,移植时千万注意启动文件的修改。。。官方给的工程是自己写的启动文件,而且它自己写了中断服务控制,我习惯了直接调用中断,因此没有使用官
方这方面的源码,而且就速度说,多重的函数调用肯定比直接调用慢的。我直接使用了固件库的启动文件。之前就是因为没有修改好所以悲剧的。。。移植不难,难
的是移植过程一大堆你不知道解决方法的问题而已。不要认为看了我的这篇东西自己就可以移植了。哈哈,少年,你还不懂~

时间: 2024-10-08 10:21:28

STM32固件库3.5+uCOS2.86移植(转自暴走的工程师)的相关文章

在IAR(EWARM)中移植STM32固件库

一.移植环境说明 (1).win10系统 (2).IAR(EWARM)7.7 (3).STM32标准固件库3.5.0 http://www.st.com/content/st_com/en/products/embedded-software/mcus-embedded-software/stm32-embedded-software/stm32-standard-peripheral-libraries/stsw-stm32054.html 二.移植步骤 (1).首先建立一个C语言的main工

STM32固件库详解

本文转自http://www.cnblogs.com/emouse/archive/2011/11/29/2268441.html 1.1 基于标准外设库的软件开发 1.1.1 STM32标准外设库概述 STM32标准外设库之前的版本也称固件函数库或简称固件库,是一个固件函数包,它由程序.数据结构和宏组成,包括了微控制器所有外设的性能特征.该函数库还包括每一个外设的驱动描述和应用实例,为开发者访问底层硬件提供了一个中间API,通过使用固件函数库,无需深入掌握底层硬件细节,开发者就可以轻松应用每一

第9章 初识STM32固件库—零死角玩转STM32-F429系列

第9章 ????初识STM32固件库 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/firege ? 本章参考资料:<STM32F4xx参考手册>.<STM32F4xx规格书>.<Cortex-M3权威指南>, STM32标准库帮助文档:<stm32f4xx_dsp_stdperiph_lib_um.chm>. 在上一章中,我们构建了几个控制GPIO外

第9章 初识STM32固件库

第9章     初识STM32固件库 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/firege 本章参考资料:<STM32F4xx参考手册>.<STM32F4xx规格书>.<Cortex-M3权威指南>, STM32标准库帮助文档:<stm32f4xx_dsp_stdperiph_lib_um.chm>. 在上一章中,我们构建了几个控制GPIO外设的

STM32 固件库与 CMSIS 标准如何理解?

一: STM32 固件库就是函数的集合,那么对这些函数有什么要求呢??这里就涉及到一个 CMSIS 标准的基础知识,这部分知识可以从<Cortex-M3 权威指南>中了解到,我们这里只是对权威指南的讲解做个概括性的介绍.经常有人问到 STM32 和 ARM 以及 ARM7是什么关系这样的问题,其实 ARM 是一个做芯片标准的公司,它负责的是芯片内核的架构设计,而 TI,ST 这样的公司,他们并不做标准,他们是芯片公司,他们是根据 ARM 公司提供的芯片内核标准设计自己的芯片.所以,任何一个做

从STM32固件库开始

STM32与一般单片机/ARM7最大的不同,则是它的寄存器特别多,而使用者又很难全部记下,因此,ST官方则根据规范提供了一套库函数源码,通过直接操作库函数达到对寄存器操作的目的. 固件库就是函数的集合,固件库函数的作用是向下负责与寄存器直接打交道,向上提供用户函数调用的接口(API). 在以前的51单片机开发中,我们常常直接对寄存器进行操作,如控制I/O口状态: P0 = 0x11: 而在STM32开发中,同样对寄存器操作: GPIOx->BRR = 0x0011; 控制BRR寄存器实现电平的控

Duanxx的STM32学习: STM32固件库命名规则

STM32固件库命名规则

1.系统文件名和源文件名以' stm32f10x_'的形式表示. 2.在单一文件中使用的常量在该文件中定义.在多个文件中使用的常量定义在头文件中.所有常量都以大写字母表示. 3.寄存器当做常量看待,同样以大写字母表示,多数情况下,在STM3210X参考手册中使用相同的缩写. 4.外围模块的功能函数的名字,需要有相应的外围模块缩写加下划线这样的前缀,每个单词的首字符要大写.例如SPI_SendData,在一个函数名中,只允许有一条下划线,用来区分外围模块缩写和剩下的函数名. 5.使用X_InitT

STM32 寄存器库和固件库

寄存器和固件库开发的差别和联系 固件库就是函数的集合,固件库函数的作用是向下负责与寄存器直接打交道.向上提供用户函数调用的接口(API). 在 51 的开发中我们经常的作法是直接操作寄存器,比方要控制某些 IO 口的状态,我们直 接操作寄存器: P0=0x11; 而在 STM32 的开发中,我们相同能够操作寄存器: GPIOx->BRR = 0x0011; 这样的方法当然能够,可是这样的方法的劣势是你须要去掌握每一个寄存器的使用方法.你才干正确使用 STM32,而对于 STM32 这样的级别的