首页 开源:盘古STM32F103开发板移植uCOS-II教程

开源:盘古STM32F103开发板移植uCOS-II教程

举报
开通vip

开源:盘古STM32F103开发板移植uCOS-II教程 盘古 STM32 开发板移植 uCOS-II 详细说明 盘古 STM32F103 开发板移植 uCOS-II 详细说明 v1.0 硬件平台:盘古 UE-STM32F103 开发板 软件平台:RVMDK_v4.20 + uCOS-II_v2.86 + StmLib_v3.5 联系方式:WWW.UE-TECH.NET 淘宝店铺:UETECH.TAOBAO.COM 文档作者:合嵌电子科技有限公司   1 / 14  合嵌电子科技有限公司 盘古 STM32 开发板移植 uCOS-II...

开源:盘古STM32F103开发板移植uCOS-II教程
盘古 STM32 开发板移植 uCOS-II 详细说明 盘古 STM32F103 开发板移植 uCOS-II 详细说明 v1.0 硬件平台:盘古 UE-STM32F103 开发板 软件平台:RVMDK_v4.20 + uCOS-II_v2.86 + StmLib_v3.5 联系方式:WWW.UE-TECH.NET 淘宝店铺:UETECH.TAOBAO.COM 文档作者:合嵌电子科技有限公司   1 / 14  合嵌电子科技有限公司 盘古 STM32 开发板移植 uCOS-II 详细说明 移植准备 1. 建立工程所需的文件夹 z 建立文件夹 uCOS-II-Port :工程根目录 z 建立文件夹 uCOS-II-Port/App :存放用户应用程序相关 z 建立文件夹 uCOS-II-Port/Bsp :存放开发板初始化驱动文件 z 建立文件夹 uCOS-II-Port/Library z 建立文件夹 uCOS-II-Port/Library/CM3 :存放启动文件及内核支撑文件 z 建立文件夹 uCOS-II-Port/Library/CM3/startup z 建立文件夹 uCOS-II-Port/Library/STM32_Lib :存放 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 外设函数库文件 z 建立文件夹 uCOS-II-Port/OS-uCOSII z 建立文件夹 uCOS-II-Port/OS-uCOSII/core :存放 uCOS-II 源代码,无需修改 z 建立文件夹 uCOS-II-Port/OS-uCOSII/port :存放移植相关文件,需修改 z 建立文件夹 uCOS-II-Port/Project :存放工程相关文件 z 建立文件夹 uCOS-II-Port/Project/List z 建立文件夹 uCOS-II-Port/Project/Obj 此步骤完成以后,目录结构如下所示: 2. 移植源码包(光盘中附带): z STM32 标准外设驱动库 v3.5 此源代码的文件结构不再说明 z uCOS-II 系统源代码 v2.86 解压后文件结构如下: 具体文件结构说明如下图所示:   2 / 14  合嵌电子科技有限公司 盘古 STM32 开发板移植 uCOS-II 详细说明 3. 文件对号入座 通过之前的准备工作,我们需要把官方源码包中相应的文件,拷贝到我们建立的工程文件夹中, 首先进行库函数源代码搬移工作: z 打开 STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver 将其下的 inc 和 src 拷贝至 uCOS-II-Port\Library\STM32_Lib z 打开 STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3 其下有 CoreSupport 和 DeviceSupport 两个文件夹 ¾ 分别将 CoreSupport 下的 core_cm3.c 和 core_cm3.h 和 DeviceSupport\ST\STM32F10x 下的 stm32f10x.h、system_stm32f10x.c 和   3 / 14  合嵌电子科技有限公司 盘古 STM32 开发板移植 uCOS-II 详细说明 system_stm32f10x.h 拷贝至 uCOS-II-Port\Library\CM3,并去掉只读属性 ¾ 再将 DeviceSupport\ST\STM32F10x\startup\arm 下的 startup_stm32f10x_hd.s 拷贝至 uCOS-II-Port\Library\CM3\startup 注:盘古 UE-STM32F103 的主芯片的内部 flash 为 512K z 打开 STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template 将其下的 stm32f10x_conf.h、stm32f10x_it.c 和 stm32f10x_it.h 拷贝至 uCOS-II-Port\App 至此,库函数的源代码搬移工作已经完成,现在进行 uCOS-II 的源代码搬移工作: z 打开 Micrium\Software\uCOS-II\Source 将其下的所有文件拷贝至 uCOS-II-Port\OS-uCOSII\core z 打开 Micrium\Software\uCOS-II\Ports\ARM-Cortex-M3\Generic\RealView 将其下的所有文件拷贝至 ucos\uCOS-II-Port\OS-uCOSII\port z 打开 Micrium\Software\EvalBoards\ST\STM3210B-EVAL\RVMDK\OS-Probe 将其下的 os_cfg.h 拷贝至 ucos\uCOS-II-Port\App 至此,所有的可利用的文件已经搬移结束,不过仍然需要建立一些文件,这个工程的文件结构才算完 整,具体如下: z 打开 ucos\uCOS-II-Port\App 新建 app.c、app_cfg.h 和 includes.h 三个空文件 z 打开 ucos\uCOS-II-Port\Bsp 新建 bsp.c 和 bsp.h 两个空文件 到目前为止,我们所有的文件准备工作已经完成,我们可以了解一下 uCOS-II 的体系结构,如下所示: 4. 建立Keil工程 z 打开 Keil_v4.20,新建工程 UE-uCOS-II-Port 工程,并将其保存至 uCOS-II-Port\Project 在随后跳出的窗口中,选择芯片型号,盘古 UE-STM32F103 开发板的芯片为:STM32F103VET6 点击 OK,跳出对话框,是否自动添加启动文件,注意此处选择否,因为我们会自己添加。 z 右击项目窗口中 Target1,选择 Manage Components,在窗口中创建文件组,并在相应的组添加   4 / 14  合嵌电子科技有限公司 盘古 STM32 开发板移植 uCOS-II 详细说明 文件,具体如下: ¾ 将 Project Targets 中的 Target1 重命名为 UE-uCOS-II-Port ¾ 新建组 STM32F10x_StdPeriph_Driver,并将 uCOS-II-Port\Library\STM32_Lib\src 下的所 有文件添加到此组下 ¾ 新建组 STM32F10x_CM3,并将 uCOS-II-Port\Library\CM3 下所有文件添加到此组中(包括 C 文件、H 文件和 startup 下的文件) ¾ 新建组 APP,并将 uCOS-II-Port\App 下所有文件添加到此组中 ¾ 新建组 BSP,并将 uCOS-II-Port\Bsp 下所有文件添加到此组中 ¾ 新建组 uCOSII_core,并将 uCOS-II-Port\OS-uCOSII\core 下所有 C 文件添加到此组中 ¾ 新建组 uCOSII_port,并将 uCOS-II-Port\OS-uCOSII\port 下所有文件添加到此组中 具体操作结果,及各文件说明如下图所示: 5. 设置Option选项 z Device 选项卡 此步骤前面已经操作,即选择主芯片:stm32f103vet6 z Output 选项卡 设置工程输出文件至:uCOS-II-Port\Project\Obj   5 / 14  合嵌电子科技有限公司 盘古 STM32 开发板移植 uCOS-II 详细说明 z Listing 选项卡 设置工程 Listing 路径值 uCOS-II-Port\Project\List z C/C++选项卡 设置 H 文件的路径 z Debug 选项卡 在此选项卡中选择你所连接的 JLINK,并作相应配置 z Utilities 选项卡 作出如下选择操作 至此为止,工程已经建立完毕,接下来需要对相关文件进行修改移植。 6. 移植修改 以下移植步骤来自 Micrium\AppNotes\AN1xxx-RTOS\AN1018-uCOS-II-Cortex-M3\AN-1018.pdf z os_cpu.h 此文件定义数据类型、处理器相关代码、声明函数原型,下面为部分代码的解释说明。 /*全局变量*/ #ifdef OS_CPU_GLOBALS #define OS_CPU_EXT #else   6 / 14  合嵌电子科技有限公司 盘古 STM32 开发板移植 uCOS-II 详细说明 #define OS_CPU_EXT extern #endif /*数据类型*/ typedef unsigned char BOOLEAN; typedef unsigned char INT8U; typedef signed char INT8S; typedef unsigned short INT16U; typedef signed short INT16S; typedef unsigned int INT32U; typedef signed int INT32S; typedef float FP32; typedef double FP64; typedef unsigned int OS_STK; typedef unsigned int OS_CPU_SR; /*临界段*/ #define OS_CRITICAL_METHOD 3 //进入临界段的三种模式,一般选择第 3 种 #define OS_ENTER_CRITICAL() {cpu_sr = OS_CPU_SR_Save();} #define OS_EXIT_CRITICAL() {OS_CPU_SR_Restore(cpu_sr);} 为了实现资源共享,一个操作系统必须提供临界段擦作的功能。 uCOS-II 为了处理临界段代码需要关中断,处理完毕后再开中断。这使得 uCOS-II 能够避免同时 有其它任务或中断服务进入临界段代码。 微处理器一般都有关中断/开中断指令,用户使用的 C 语言编译器必须有某种机制能够在 C 中直 接实现关中断/开中断地操作。某些 C 编译器允许在用户的 C源代码中插入汇编语言的语句。这使得 插入微处理器指令来关中断/开中断很容易实现。而有的编译器把从 C 语言中关中断/开中断放在语言 的扩展部分。uCOS-II 定义两个宏(macros)来关中断和开中断,以便避开不同 C 编译器厂商选择不同 的方法来处理关中断和开中断。uCOS-II 中的这两个宏调用分别是:OS_ENTER_CRITICAL()和 OS_EXIT_CRITICAL()。 /*栈方向*/ #define OS_STK_GROWTH 1 Cotex-M3 的栈生长方向是由高地址向低地址增长的,因此 OS_STK_GROWTH 定义为 1 /*任务切换宏*/ #define OS_TASK_SW() OSCtxSw() /*开中断 关中断*/ #if OS_CRITICAL_METHOD == 3 OS_CPU_SR OS_CPU_SR_Save(void); void OS_CPU_SR_Restore(OS_CPU_SR cpu_sr); #endif 其 中 OS_CPU_SR_Save() 和 OS_CPU_SR_Restore()是用汇编代码写的,代码在 os_cpu_a.asm   7 / 14  合嵌电子科技有限公司 盘古 STM32 开发板移植 uCOS-II 详细说明 /*任务切换的函数*/ void OSCtxSw(void); //用户任务切换 void OSIntCtxSw(void); //中断任务切换函数 void OSStartHighRdy(void); //在操作系统第一次启动的时候调用的任务切换 void OS_CPU_PendSVHandler(void); //用户中断处理函数 void OS_CPU_SysTickHandler(void); //系统定时中断处理函数,时钟节拍函数 void OS_CPU_SysTickInit(void); //系统 SysTick 定时器初始化 INT32U OS_CPU_SysTickClkFreq(void);//返回 SysTick 定时器的时钟频率 关于任务切换,会涉及到异常处理,具体为 SVC(系统服务调用,亦简称系统调用)和 PendSV (可悬起系统调用),它们常用于在操作系统之上的软件开发中。 SVC 用于产生系统函数的调用请求。例如,操作系统不让用户程序直接访问硬件,而是通过提供 一些系统服务函数,用户程序使用 SVC 发出对系统服务函数的呼叫请求,以这种方法调用它们来间接 访问硬件。因此,当用户程序想要控制特定的硬件时,它就会产生一个 SVC 异常,然后操作系统提供 的 SVC 异常服务例程得到执行,它再调用相关的操作系统函数,后者完成用户程序请求的服务。SVC 异常通过执行”SVC”指令来产生,该指令需要一个立即数,充当系统调用代号。SVC 异常服务例程 稍后会提取出此代号,从而解释本次调用的具体要求,再调用相应的服务函数。 另一个相关的异常是 PendSV(可悬起的系统调用),它和 SVC 协同使用。一方面,SVC 异常是必 须立即得到响应的(若因优先级不比当前正处理的高,或是其它原因使之无法立即响应,将上访成硬 fault),应用程序执行 SVC 时都是希望所需的请求立即得到响应。另一方面,PendSV 则不同它是可 以像普通的中断一样被悬起的(不像 SVC 那样会上访)。OS 可以利用它“缓期执行”一个异常,直到 其它重要的任务完成后才执行动作。悬起 PendSV 的方法是:手工往 NVIC 的 PendSV 悬起寄存器中写 1。悬起后,如果优先级不够高,则将缓期等待执行。 具体异常处理相关知识,若想知其原理,请详细阅读《Cotex-M3 权威指南》。 在此处,我们需要对此文件进行修改: 1) void OS_CPU_PendSVHandler(void) 需替换成 void PendSV_Handler(void) 一般我们自己开发基于 stm32 芯片的软件,都会使用标准外设库 CMSIS 中提供的启动文 件,比如 startup_stm32f10x_hd.s,而 Micrium 官方没有用 ST 的标准启动文件,而且分开写成 了两个.s 文件,即 init.s 和 vectors.s(Micrium\Software\EvalBoards\ST\STM3210B-EVAL\RVMDK) init.s 负责进入 main(),vectors.s 设置中断向量 由于 OS_CPU_PendSVHandler 这个中断向量就是在 vectors.s 中被设置的,且我们使用的是 startup_stm32f10x_hd.s 作为启动文件的,而在 startup_stm32f10x_hd.s 文件中,PendSV 的中 断向量名为 PendSV_Handler,所以只需用 PendSV_Handler 替换掉相应文件的 OS_CPU_PendSVHandler,其中函数声明在 OS_CPU_C.h 中,具体的中断服务函数原型在 OS_CPU_A.ASM 中,后面也将对其进行修改。 这样子,替换后的 PendSV_Handler 函数在 OS_CPU_C.h 中有声明,在 OS_CPU_A.ASM 中有具 体的中断服务函数代码,与 startup_stm32f10x_hd.s 中的向量地址就对应上了。 2) 注释掉最后三个关于 SysTick 服务函数 void OS_CPU_SysTickHandler(void); void OS_CPU_SysTickInit(void); INT32U OS_CPU_SysTickClkFreq(void); 其中,OS_CPU_SysTickHandler 函数在 ST 标准库 stm32f10x_it.c 中已定义,此处不需要; 其中,OS_CPU_SysTickInit 定义在 os_cpu_c.c 中,依赖于 OS_CPU_SysTickClkFreq,用于初始   8 / 14  合嵌电子科技有限公司 盘古 STM32 开发板移植 uCOS-II 详细说明 化 SysTick 定时器,需注释掉;其中,OS_CPU_SysTickClkFreq 定义在官方 EvalBoards 的 BSP.c 中,需解除依赖,若需要,我们可以在 bsp.c 中实现。 修改后如下所示: SysTick 作为 OS 的“心跳”,可称为滴答时钟,本质上来说就是一个定时器,和 PendSV 中 断一样,在 startup_stm32f10x_hd.s 中 SysTick 的中断向量名为 SysTick_Handler,且因为 ST 标准库已经有相关库函数,所以我们只需作如下修改: 打开 os_cpu_c.c 文件,找到 void OS_CPU_SysTickHandler(void)的内容代码 OS_CPU_SR cpu_sr; OS_ENTER_CRITICAL(); OSIntNesting++; OS_EXIT_CRITICAL(); OSTimeTick(); OSIntExit(); 复制到 stm32f10x_it.c 文件中的 SysTick_Handler (void)函数内; void SysTick_Handler(void) { OS_CPU_SR cpu_sr; OS_ENTER_CRITICAL(); OSIntNesting++; OS_EXIT_CRITICAL(); OSTimeTick(); OSIntExit(); } 并且在文件头部添加:#include z os_cup_a.asm 根据前面的描述,OS_CPU_PendSVHandler 中断服务函数的原型在此文件中,我们需要用 PendSV_Handler 将其替换,以实现在 startup_stm32f10x_hd.s 中的中断向量的匹配。 1) 注释掉 EXPORT OS_CPU_PendSVHandler,并修改成 EXPORT PendSV_Handler,如下 所示: 2) 找到 OS_CPU_PendSVHandler 程序原型,并重命名为 PendSV_Handler   9 / 14  合嵌电子科技有限公司 盘古 STM32 开发板移植 uCOS-II 详细说明 这样 PendSV_Handler 中断服务函数就成功建立了,同时,我们需要注释掉 stm32f10x_it.h 和 stm32f10x_it.c 中的相关 PendSV_Handler 的声明和定义,以防止冲突,如下所示: z os_cpu_c.c 此文件需要由我们来写 10 个相当简单的 C 函数 OSInitHookBegin() OSInitHookEnd() OSTaskCreateHook() OSTaskDelHook() OSTaskIdleHook() OSTaskStatHook() OSTaskStkInit() OSTaskSwHook() OSTCBInitHook() OSTimeTickHook() 主要包括 9个钩子函数和 1 个负责建立任务堆栈的函数 OSTaskStkInit()。 所谓钩子函数,指那些插入到某些函数中为扩展这些函数功能而存在的函数。一般来说,钩 子函数是进行软件功能扩充的入口点。不仅如此,uCOS-II 中还提供有大量的钩子函数,用户不 需要修改 uCOS-II 的内核代码程序,而只需要向钩子函数添加代码即可拓展 uCOS-II 的功能,如 果要用到这些钩子函数,需要在 OS_CFG.H 中使能 OS_CPU_HOOKS_EN 为 1,即:#define OS_CPU_HOOKS_EN 1 同时关于 OSTaskStkInit,OSTaskCreate 和 OSTaskCreateExt 通过调用 OSTaskStkInt 来初 始化任务的堆栈结构,因此,堆栈看起来就像刚发生过中断并将所有的寄存器保存到堆栈中的情 形一样。一旦用户初始化了堆栈,OSTaskStkInit 就需要返回堆栈指针所指的地址,OSTaskCreate   10 / 14  合嵌电子科技有限公司 盘古 STM32 开发板移植 uCOS-II 详细说明 和 OSTaskCreateExt 会获得该地址并将它保存到任务控制块(OS_TCB)中,处理器的文档会告诉 用户堆栈指针会指向下一个堆栈空闲位置,还是会指向最后存入数据的堆栈单元位置。 下面进行文件的移植说明: 1) 把最后 OS_CPU_SysTickHandler(), OS_CPU_SysTickInit()这两个函数的内容代码注 释掉; 2) 禁用以下宏定义,因为他们涉及到上一步注释的 Systick 服务函数 #define OS_CPU_CM3_NVIC_ST_CTRL (*((volatile INT32U *)0xE000E010)) #define OS_CPU_CM3_NVIC_ST_RELOAD (*((volatile INT32U *)0xE000E014)) #define OS_CPU_CM3_NVIC_ST_CURRENT (*((volatile INT32U *)0xE000E018)) #define OS_CPU_CM3_NVIC_ST_CAL (*((volatile INT32U *)0xE000E01C)) #define OS_CPU_CM3_NVIC_ST_CTRL_COUNT 0x00010000 #define OS_CPU_CM3_NVIC_ST_CTRL_CLK_SRC 0x00000004 #define OS_CPU_CM3_NVIC_ST_CTRL_INTEN 0x00000002 #define OS_CPU_CM3_NVIC_ST_CTRL_ENABLE 0x00000001 z os_cfg.h 此文件为配置内核的头文件,在这个文件,我们可以禁用信号量、互斥信号量、邮箱、队列、信号量 集、定时器、内存管理,调试模式: #define OS_FLAG_EN 0 //禁用信号量集 #define OS_MBOX_EN 0 //禁用邮箱 #define OS_MEM_EN 0 //禁用内存管理 #define OS_MUTEX_EN 0 //禁用互斥信号量 #define OS_Q_EN 0 //禁用队列 #define OS_SEM_EN 0 //禁用信号量 #define OS_TMR_EN 0 //禁用定时器 #define OS_DEBUG_EN 0 //禁用调试 也可以禁用应用软件的钩子函数和多重事件控制 #define OS_APP_HOOKS_EN 0 #define OS_EVENT_MULTI_EN 0 这些所做的修改主要是把一些功能给去掉,减少内核大小,也利于编译调试。等用到的时候,再开启 相应的功能。 7 应用实例 至此,所有的移植已经完成,如需更详细的说明整个移植过程,请参考 AN-1018.pdf,接下来我 们将编写应用相关的代码,其中有一些入门知识需要说明,uCOS-II 可以管理多达 64 个任务,但保 留了优先级为 0、1、2、3、OS_LOWEST_PRIO-3、OS_LOWEST_PRI0-2,OS_LOWEST_PRI0-1 以及 OS_LOWEST_PRI0 这 8 个任务以被将来使用,用户可以有多达 56 个应用任务,必须给每个任务赋以不 同的优先级,优先级号越低,任务的优先级越高。 uCOS-II 的初始化流程为:在调用 uCOS-II 的任何其它任务之前,uCOS-II 要求用户首先调用系 统初始化函数 OSInit(),且多任务的启动是用户通过调用 OSStart()实现的。然而,启动 uCOS-II 之 前,用户至少要建立一个应用任务, 用户可以通过传递任务地址和其它参数到以下两个函数之一来建 立任务:OSTaskCreate() 或者 OSTaskCreateExt(),如以下所示: main() {   11 / 14  合嵌电子科技有限公司 盘古 STM32 开发板移植 uCOS-II 详细说明 ….. OSInit(); /* 初始化 uC/OS-II*/ …… OSTaskCreate()或 OSTaskCreateExt(); …… OSStart(); /*开始多任务调度!永不返回 */ } 在 UE-STM32F103 开发板上有 3 个 LED,我们将创建两个任务,分别控制这 3 个 LED,具体代码如下所 示: z app.c #include static OS_STK led1_task_stk[LED1_TASK_STK_SIZE]; //开辟任务堆栈 static OS_STK led2_task_stk[LED1_TASK_STK_SIZE ]; //开辟任务堆栈 static void systick_init(void); //函数声明 static void systick_init(void) { RCC_ClocksTypeDef rcc_clocks; RCC_GetClocksFreq(&rcc_clocks); //调用标准库函数,获取系统时钟。 SysTick_Config(rcc_clocks.HCLK_Frequency / OS_TICKS_PER_SEC); //初始化并使能 SysTick } static void led1_task(void *para) { para = para; while(1) { GPIO_SetBits(GPIOD, GPIO_Pin_7); OSTimeDlyHMSM(0,0,1,0); //1s 延时,释放 CPU 控制权 GPIO_ResetBits(GPIOD, GPIO_Pin_7); OSTimeDlyHMSM(0,0,1,0); //1s 延时,释放 CPU 控制权 } } static void led2_task(void *para) { para = para; while(1) { GPIO_SetBits(GPIOD, GPIO_Pin_5); GPIO_SetBits(GPIOD, GPIO_Pin_6); OSTimeDlyHMSM(0,0,0,500); //500ms 延时,释放 CPU 控制权 GPIO_ResetBits(GPIOD, GPIO_Pin_5); GPIO_ResetBits(GPIOD, GPIO_Pin_6); OSTimeDlyHMSM(0,0,0,500); //500ms 延时,释放 CPU 控制权 }   12 / 14  合嵌电子科技有限公司 盘古 STM32 开发板移植 uCOS-II 详细说明 } int main(void) { BSP_Init(); OSInit(); systick_init(); OSTaskCreate(led1_task, 0, &led1_task_stk[LED1_TASK_STK_SIZE - 1], LED1_TASK_PRIO); OSTaskCreate(led2_task, 0, &led2_task_stk[LED2_TASK_STK_SIZE - 1], LED2_TASK_PRIO); OSStart(); return 0; } z app_cfg.h /* task priority */ #define LED1_TASK_PRIO 4 #define LED2_TASK_PRIO 6 /* task stack size */ #define LED1_TASK_STK_SIZE 80 #define LED2_TASK_STK_SIZE 80 z Bsp.c #include static void BSP_LED_Init(void); void BSP_Init (void) { SystemInit(); BSP_LED_Init(); /* Initialize the LED */ } static void BSP_LED_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); //使能时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7; //LED_pin GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOD, &GPIO_InitStructure); } z Bsp.h #ifndef __BSP_H   13 / 14  合嵌电子科技有限公司 盘古 STM32 开发板移植 uCOS-II 详细说明 #define __BSP_H void BSP_Init(void); #endif 说明 本开发板可以以下几个模块配套使用,模块详情请登录官网查询,或直接进入店铺购买 „ 双路 RS485/422 转 RS232 模块 „ GPS 模块 „ GPRS 模块 „ Zigbee 模块 „ WIFI 模块 „ 陀螺仪模块(支持 MPU6050 加速度+陀螺仪、HMC5883 磁力计、BMP085 气压计) „ 7 寸液晶屏模块 合嵌电子提供良好电磁兼容性的嵌入式开发板,陆续将推出的嵌入式开发板如下: „ STM32F103 开发板、 „ STM32F407 开发板、 „ AT91SAM9260 开发板(ARM9 系列)、 „ LPC1768 开发板、 „ LPC1788 开发板 敬请关注,同时诚招各地加盟代理商,欢迎联系洽谈。 联系方式 电话:0550-3789700 店铺:UETECH.TAOBAO.COM 邮箱:UE_TECH@126.COM 网站:WWW.UE-TECH.NET WWW.UETECH.NET 地址:安徽省滁州市南谯区花园西路 82 号(科技创业中心 1 幢 302 室)   14 / 14  合嵌电子科技有限公司 盘古STM32F103开发板移植uCOS-II详细说明v1.0 移植准备
本文档为【开源:盘古STM32F103开发板移植uCOS-II教程】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_567580
暂无简介~
格式:pdf
大小:1MB
软件:PDF阅读器
页数:14
分类:互联网
上传时间:2013-02-04
浏览量:68