一步步建立 STM32 UCOS 模板
手把手教你移植uCOS-III到STM32
手把手教你移植uCOS-III到STM32作者:谭建裕时间:2015年8月27日1、建立工程文件夹1.1在uCOS-III中添加如下文件夹1.2在Libraries文件夹中放入STM32的库,这点不必多说了。
1.3在USER文件夹中放入2、复制文件2.1将Micrium(uCOS-IIIV3.03)\Software\uCOS-III\Cfg\Template里的os_app_hooks.c;os_app_hooks.h;os_cfg.h;os_cfg_app.h复制到Cfg文件夹。
2.2将Micrium(uCOS-IIIV3.03)\Software\uCOS-III\Ports\ARM-Cortex-M3\Generic\IAR里的os_cpu.h;os_cpu_a.s;os_cpu_c.c文件复制到Ports文件夹中。
2.3将Micrium(uCOS-IIIV3.03)\Software\uCOS-III\Source里面的所有文件复制到Source文件夹中。
2.4将Micrium(uCOS-IIIV3.03)\Software\uC-CPU里面的cpu_core.c;cpu_core.h;cpu_def.h复制到uC-CPU文件夹中。
2.5将Micrium(uCOS-IIIV3.03)\Software\uC-CPU\ARM-Cortex-M3\IAR文件夹中的cpu.h;cpu_a.s;cpu_c.c复制到uC-CPU文件夹中。
2.6将Micrium(uCOS-IIIV3.03)\Software\uC-CPU\Cfg\Template里的cpu_cfg.h复制到uC-CPU文件夹中。
2.7将Micrium(uCOS-IIIV3.03)\Software\uC-LIB里面的lib_ascii.c;lib_ascii.h;lib_def.h;lib_def.h;lib_math.c;lib_math.h;lib_mem.c;lib_mem.h;lib_str.c;lib_str.h复制到uC-LIB文件夹中。
stm32工程模板建立
STM32工程建立步骤Stm32的工程建立稍微有点复杂,所以写一个教程也是为了防止自己以后忘记了步骤而再次繁琐办事。
首先新建一个工程文件夹改名字打开Domo新建文件夹打开Libraries文件夹新建如下文件夹其实你会发现这都是官方库里面的文件夹,事实上就是拷贝过来的啦。
这是官方3.5版本库首先我们凑齐Libraries 文件夹里的四个子文件夹从官方库这个位置STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\Core Support\找到下面两个放到core文件夹内从官方库这个位置STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ ST\ STM32F10x把startup文件夹直接复制过来放在Libraries里,另外三个文件放在刚刚建的Devices文件夹里然后把startup打开再把arm文件夹里的文件都剪切出来放在startup文件夹里,其余文件删除。
从官方库的这个位置STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\ STM32F10x_StdPeriph_Driver拷贝inc、src这两个文件夹到这里我们新建的Libraries文件夹里的四个子文件夹就凑齐了,可见都是官方的库。
然后我们往Devices文件夹里添加一些文件从官方库的这个位置STM32F10x_StdPeriph_Lib_V3.5.0\ Project\ STM32F10x_StdPeriph_Template复制这五个文件放到Devices文件夹里你会发现这个文件重复了,是因为我们刚才已经放了三个文件其中一个就是它,一模一样随便处理了。
这个时候我们就可以打开Keil了新建工程菜单栏点击Project→New μVision Project会弹出窗口让我们选择位置和工程名我们定位到Project文件夹命名工程为Domo如图点击保存会弹出选择芯片的窗口这里我选择STM32F103RB点击OK弹出一个资料窗口直接点OK,干净的脸庞开始设置项点击选择Output再点击Select Folder…选择Output文件夹,如果需要生成HEX文件,就把Create HEX File勾选。
基于STM32F2xx库建立uCOS-II工程
基于STM32F2xx库建立uCOS-II工程的步骤1.1 前期准备基于STM32F2xx标准外设库建立uCOS-II工程需要准备的文件1.Micrium-ST-uCOS-II-LCD-STM32.exe,该文件是uCOS-II官方的ST Cortex-M3移植,下载地址:/page/downloads/ports/st/stm322.Keil RVMDK4.54 下载地址:https:///demo/eval/arm.htm3.STM32F2xx系列标准外设库,ST官方提供,版本V1.0.0,下载地址:/internet/com/SOFTWARE_RESOURCES/SW_COMPONENT/FIRMW ARE/ stm32f2xx_stdperiph_lib.zip1.1.1 准备工作1、新建一个文件夹,用来存放目的工程文件。
例如,笔者建立的工程文件名为STM32F205_UCOS2。
2、在工程文件夹中建立下面几个文件夹用来存放STM32F2xx库文件和UCOS-II源文件以及用户文件,这几个文件夹分别为CMSIS,Libraries,Output,uCOS-II,uCOS-II_BSP,USER。
1.1.2 复制uCOS-II文件Micrium-ST-uCOS-II-LCD-STM323、复制\Micrium\Software\EvalBoards\ST\STM3210E-EV AL\RVMDK\下的BSP文件夹到uCOS-II_BSP文件夹中,只保留BSP.c和BSP.h文件。
4、复制\Micrium\Software下所有文件夹到uCOS-II文件夹中。
1.1.3 复制STM32F2库文件STM32F2xx_StdPeriph_Lib_V1.1.05、复制\Libraries下的STM32F2xx_StdPeriph_Driver到Libraries文件夹中。
6、复制\Libraries\CMSIS下的Include文件夹到目标工程CMSIS文件夹中。
STM32上面运行UCOSII的步骤
STM32上⾯运⾏UCOSII的步骤1、移植 UCOSII要想 UCOSII 在 STM32 正常运⾏,当然⾸先是需要移植 UCOSII。
ALIENTEK 提供的 SYSTEM ⽂件夹⾥⾯的系统函数直接⽀持 UCOSII,只需要在 sys.h ⽂件⾥⾯将: SYSTEM_SUPPORT_UCOS 宏定义改为 1,即可通过 delay_init 函数初始化 UCOSII 的系统时钟节拍,为 UCOSII 提供时钟节拍。
2、编写任务函数并设置其堆栈⼤⼩和优先级等参数。
编写任务函数,以便 UCOSII 调⽤;设置函数堆栈⼤⼩,这个需要根据函数的需求来设置;堆栈字节对齐的问题,如果任务运⾏出现莫名其妙的错误(⽐如⽤到 sprintf 出错),请考虑是不是字节对齐的问题。
设置任务优先级,这个需要⼤家根据任务的重要性和实时性设置,记住⾼优先级的任务有优先使⽤ CPU 的权利。
3、初始化 UCOSII,并在 UCOSII 中创建任务调⽤ OSInit,初始化 UCOSII,通过调⽤ OSTaskCreate 函数创建我们的任务。
4、启动 UCOSII调⽤ OSStart,启动 UCOSII。
通过以上 4 个步骤, UCOSII 就开始在 STM32 上⾯运⾏了,这⾥还需要注意我们必须对os_cfg.h 进⾏部分配置,以满⾜我们⾃⼰的需要。
软件设计1、在⼯程源码下⾯加⼊ UCOSII ⽂件夹,存放 UCOSII源码(我们已经将 UCOSII源码分为三个⽂件夹:CORE、PORT和 CONFIG)。
打开⼯程,新建 UCOSII-CORE、 UCOSII-PORT 和 UCOSII-CONFIG 三个分组,分别添加UCOSII 三个⽂件夹下的源码,并将这三个⽂件夹加⼊头⽂件包含路径:UCOSII-CORE 分组下⾯是 UCOSII 的核⼼源码,我们不需要做任何变动。
UCOSII-PORT 分组下⾯是我们移植 UCOSII 要修改的 3 个代码,这个在移植的时候完成。
STM32建立工程模板
1 建立工程
1)新建
2)命名并保存在USER 文件夹里
3)选择单片机的型号
根据使用单片机的型号进行选择
2 创建工作组
1)点击工作组管理图标
2)添加工作
在现有工作组上双击即可改名字,单击左第一个图标可以添加新的工作组
3)添加c文件到各个工作组c文件
添加方法
添加下一个
A 启动代码
路径CMSIS/StaruptCode
B 添加内核文件
路径CMSIS
C STM32库文件
路径FWlib/src
D 用户编写的延时和一些宏定义
路径SYSTEM/delay
SYSTEM/sys
E 添加主函数
路径USER
3 添加头文件宏定义,头文件路径
1)将STM32F10X_HD,USE_STDPERIPH_DRIVER填入STM32F10X_HD 根据使用芯片容量要进行修改此内容STM32F10X_HD 大容量芯片
STM32F10X_MD 中容量芯片
STM32F10X_LD 小容量芯片
2)添加头文件路径
4 测试是否通过
编译没错即可。
STM32F407移植uCOS-II笔记
STM32F407在IAR环境下移植Ucos-II第一步:安装IAR for ARM。
第二步:建一个文件夹,最好用工程名命名。
第三步:在新建的文件夹下面建7个文件夹,分别是:app、bsp、libraries、Project、si、ucos-ii、user,建好的文件夹见下图(图一):图 1第四步:准备好STM32F4XX的固件库。
见图二、图三:图 2图 3第五步:准备好uCOS-II源码。
我的源码路径为:E:\项目文件\电阻焊控制器V2\参考资料\ucos源码\Micrium\Software\uCOS-II;见图4、图5、图6、图7、图8:图 4图 5图 6图7图8第六步:将第四步中准备好的stm32固件库里libraries下的文件拷贝到工程文件夹下的libraries文件夹里。
第七步:将第五步中准备好的uCOS-II源码文件夹里的Ucos-II文件夹中的ports、source两个文件夹拷贝到工程文件夹下的ucos-ii文件夹中。
图9第八步:打开IAR,file—new—workspace先建一个工作空间。
第九步:建立一个工程,project—create new project,在工程文件管理器中新建组,右键单击工程名—add—add group,并给每个组添加相应的文件(右键单击工程名—add—add file);添加好文件的窗口如下图:图10第10步:IAR配置,右键单击工程名—options,跳出如下图所示窗口:图111、在General Options项中的Device中选择芯片,其他项默认值OK;2、在library configuration页中的library选择Full,否则会编译会保错,将右下角的Use CMSIS勾上。
其他项保持默认值。
图123、在C/C++ Compiler项中的Preprocessor也中添加头文件路径($PROJ_DIR$\表示工程路径,$PROJ_DIR$\..\是工程路径的父目录),并添加宏定义(USE_STDPERIPH_DRIVER、STM32F10X_HD),添加好的窗口见下图:图134、在Linker项中的cofig页中☑Override default。
stm32利用固件库建立工程模板
神州Stm32学习笔记:一、工程模板的创建:为什么要创建工程模板?这是为了我们开发方便。
ST公司对cotex—M系类的处理器写了很多的库文件,我们只需在他们的库文件下进行开发,不需要对stm32的各个寄存器进行配置,st 公司对寄存器的操作已经帮我们弄好了。
我只要会用它提供的接口就ok 了。
我们字需要st提供的固件库上进行我们的项目开发即可。
这样我们如果自己先建立一个工程模板,把需要的文件都包含进来,只需要改我们的自己编写的文件即可。
官方固件库有三个文件夹:先建立自己的文件夹。
这里我建立的是文件夹是STM32工程模板:然后将stm32库解压:直接将library 拷到stm32工程模板文件夹下。
然后在stm32工程模板下建立三个文件夹:obj、user、project这三个文件我是分别用来存放中间目标文件,用户自定义文件。
和工程项目文件。
此时stm32文件下有然后再来看看这些文件夹下分别有什么?Library :其中:cmsis 主要包括三层:Core Peripheral Access Layer(内核外围接入层)、Device Peripheral Access Layer(硬件外围接入)、Access Functions for Peripherals(外围接口函数)。
在mdk的说明书上原文是这样的STM32F10x_StdPeriph_Driver:Z主要是外设接口的定义和实现部分。
其中CMSIS文件夹有这些文件:在CMSIS文件夹内容分布:Coresupport中放的是和内核有关的东西。
Devicesupport放的是有启动文件。
这是library下的主要的东西。
构建自己的工程模板时可以直接考过来即可。
然后是建立自己的文件。
打开keil然后新建工程放在:project文件夹下。
此时文件夹下存在然后建立user文件下的文件。
我们自己的main函数,中断函数还有自己的子程序文件都是放在user下面的。
使用IAR移植ucos到stm32的步骤
使用IAR移植ucos到stm32的步骤芯片型号stm32f103ve,编译器iarforarm6.3准备材料在st官网上浏览最新的固件库(现在就是v3.5.0),这个库促进作用非常小,可以帮忙我们快速研发出来想的功能,但是网上存有很多人说道这个库有漏洞,本人水平非常有限就不得而知了,这里轻易上地址。
在ucos官网上下载移植stm32移植版的ucosii代码,这个需要注册一下,不多说直接上接上地址创建工程首先建三个文件目录:cmsis用来存放cpu和系统的相关的文件、stm32f10x_stdperiph_driver用来存放cpu的硬件驱动、ucosii用来存放ucos的源代码。
复制固件库\\stm32f10x_stdperiph_lib_v3.5.0\\libraries\\cmsis\\cm3\\coresupport目录下的core_cm3.c和core_cm3.h到工程文件夹下的cmsis目录中。
激活固件库\\stm32f10x_stdperiph_lib_v3.5.0\\libraries\\cmsis\\cm3\\devicesupport\\st\\stm32f10x目录下的stm32f10x.h、system_stm32f10x.c、system_stm32f10x.h三个文件至工程文件夹下的cmsis目录中。
在固件库\\stm32f10x_stdperiph_lib_v3.5.0\\libraries\\cmsis\\cm3\\devicesupport\\st\\stm32f10x\\startup\\iar目录中挑选出适当的已经开始文件,这里我挑选出的就是startup_stm32f10x_hd.s导入到至工程文件夹下的cmsis目录中。
复制固件库\\stm32f10x_stdperiph_lib_v3.5.0\\project\\stm32f10x_stdperiph_template目录中的stm32f10x_conf.h、stm32f10x_it.c、stm32f10x_it.h三个文件到工程文件夹下的cmsis目录中。
STM32系列之新建工程模板(三)
STM32系列之新建⼯程模板(三)今天,我将记录STM32如何新建⼀个模板步骤第⼀步:⾸先先新建⼀个⽂件夹(英⽂命名的)——作为⼯程根⽬录第⼆步;在⽂件夹中新建⼀个名为USER的⼦⽬录⽂件第三步:点击 MDK 的菜单:Project –>New Uvision Project ,然后将⽬录定位到刚才建⽴的⽂件夹 Template 之下,在这个⽬录下⾯建⽴⼦⽂件夹 USER然后定位到 USER ⽬录下⾯,我们的⼯程⽂件就都保存到 USER ⽂件夹下⾯。
⼯程命名为 Template,点击保存。
第四步:接下来会出现⼀个选择 CPU 的界⾯,就是选择我们的芯⽚型号。
如图 3.3.3 所⽰,因为 ALIENTEK 战舰 STM32F103 所使⽤的 STM32型号为 STM32F103ZET6,所以在这⾥我们选择 STMicroelectronics STM32F1 Series STM32F103 STM32F103ZET6(如果使⽤的是其他系列的芯⽚,选择相应的型号就可以了。
点击 OK,MDK 会弹出 Manage Run-Time Environment 对话框,如图所⽰:这是 MDK5 新增的⼀个功能,在这个界⾯,我们可以添加⾃⼰需要的组件,从⽽⽅便构建开发环境,不过这⾥我们不做介绍。
所以在图 3.3.4 所⽰界⾯,我们直接点击 Cancel,即可得到如图所⽰界⾯:到这⾥,我们还只是建了⼀个框架,还需要添加启动代码,以及.c ⽂件等。
4) 现在我们看看 USER ⽬录下⾯包含 2 个⽂件夹和 2 个⽂件,如下图所⽰:第五步:接下来,我们在 Template ⼯程⽬录下⾯,新建 3 个⽂件夹 CORE, OBJ 以及 STM32F10x_FWLib。
CORE ⽤来存放核⼼⽂件和启动⽂件,OBJ 是⽤来存放编译过程⽂件以及 hex ⽂件,STM32F10x_FWLib ⽂件夹顾名思义⽤来存放 ST 官⽅提供的库函数源码⽂件。
初学STM32--建立工程
初学STM32--建立工程
本人学习stm32 有一段时间了,由于以前没有接触过,单是建立工程就花费
了我很长时间,下面是我建立工程的一般步骤,也是参考了前人的经验,写下
来希望对后面学习的人有所帮助。
libcmsisstartupuser.
其中lib 里面是src(源文件.c)和inc 文件(头文件.h)这里面都是stm32 所提
供的外设的源文件以及头文件,还有其他的。
cmsis 里面是底层文件,微控制器软件借口标准。
后面你慢慢会知道的,我也
不太懂的。
startup 是启动文件,后缀名为.s 根据不同容量的芯片区分:
startup_stm32f10x_ld.s/startup_stm32f10x_md.s/startup_stm32f10x_hd.s 分别适用于小容量/中容量/大容量的STM32 芯片,具体判断方法如下:
小容量:FLASH≤32K
中容量:64K≤FLASH≤128K
大容量:256K≤FLASH 在启动代码中
user 里面是用户文件,这里我放入的是main.c 和stm32f10x_it.cmain 函数是
自己写的,当用到中断是写入对应的中断。
好了,相应的文件介绍完了以后,我们可以开始建立工程了。
就像C 语言输
出的第一条语句”Hello World”一样,我们建立工程用来点亮LED。
具体步骤如。
stm32ucos详细教程
void led_init(void) { GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能 PA 端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //LED0-->PA.8 端口配置
3. 在 ucosii 文件下建立六个文件夹:○1 hardware(用来存放你以后建立的 外围硬件源文件还有头文件);○2 output(用来存放工程编译后的文件); ○3 stm32lib(用来存放 stm32 V3.5 库的文件);○4 ucosii(用来存放 ucosii 移 植 的 文 件 ) ; ○5 user( 用 来 存 放 你 的 工 程 还 有 main 文 件 ) 。
1.我使用的是 uCOS 的 2.86 版本,下载后可以看到 Micrium 文件夹,里面含 有三个文件夹:
文件名
说明
AppNotes
包含 ucosii 的说明文件,其中 Micrium\AppNotes\AN1xxx-RTOS\AN1018-uCOS-IICortex-M3\ AN-1018.pdf 是很重要的。这个文件对 uc/os 在 M3 内核移植过程中的代码做了详细的说 明。
ucosiiSTM32keil开发板移植修改版
2. 打开文件夹,在该文件夹建立一个 ucosii 文件夹(用来存放 ucosii 的文件) 3. 在 ucosii 文件夹下面建立 3 个文件夹 4. 从官方网站上下载支持 STM32F103ZE 的源码 5. 打开 Micrium -> Software -> uCOS-II ->Source 如图
#define Reload_1us SystemCoreClock/1000000 #define Reload_1ms SystemCoreClock/1000
#define OS_tick_ms 1000/OS_TICKS_PER_SEC 滴答时钟的初始化: void SysTickConfig(void) {
这三个函数屏蔽掉;
18.打开 os_cfg.h 文件
1. #define OS_APP_HOOKS_EN
1 改为 0
#define OS_ARG_CHK_EN
1 改为 0
#define OS_TMR_EN
1 改为 0
19.字节编写滴答时钟的初始化和中断服务函数;
20.屏蔽 stm32f10x_it.c 中的 PendSV_Handler 中断服务函数。
u32 OS_reload = 0; OS_reload = Reload_1ms*(1000/OS_TICKS_PER_SEC); if(SysTick_Config(OS_reload) == 1)
{ while(1);
} SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; }
把上面这两个文件复制到我们 STM32 工程中 ucosii –> config 下. 8.用 keil 打开我们的 STM32 工程:
uCOS-II在STM32上的移植步骤
uCOS-II在STM32上的移植步骤前言:说点废话,网上有很多关于uCOS-ii 移植的文章,好多都是千篇一律,理论性很强,分析了一大堆虚头巴脑的东西,真想问他们,你确定你分析的这些东西是需要你做的工作吗?实操性严重欠缺。
这方面我也走了很多弯路,下面就将自己的移植过程一步步的记录下来,也给大家做做参考。
首先,简单总结一下移植的大概过程:(1)去uC/OS-ii 官网下载你要移植芯片CPU 的相关案例,不一定完全对应,那就找相应系列吧。
(2)编程环境一般有两种,分别是IAR 和MDK,这个根据你自己的编程环境进行下载。
(3)本案例需要将uC/OS-II 移植到STM32F103ZET6 上,而我使用的编程环境是MDK,很遗憾,官网上提供的案例是基于IAR 的,所以要基于IAR 的案例进行更改。
(4)使用MDK 创建一个无操作系统的最简单程序,确保这个程序能够使用,这样做的目的是为了一步步的排查错误,假如无操作系统时,都有错误,移植过程中也肯定会有编译错误,那么在排查错误的时候也就增加了难度,不会写物操作系统的简单程序怎么办。
那就不要往下看了。
(5)移植的最大的改动主要有两部分,一个是一些头文件的增减,另外一个就是向量表中PendSV_Handler 和SysTick_Handler 的修改。
这里我要吐槽一下,网上说了一大堆关于什么OS_CPU.H 的更改还有各种函数的的分析,这都是扯淡。
这些根本就不用移植者去修改,官网提供的案例都已经提供了,除非你选择移植的CPU 是比较偏的,那么这些东西需要移植者自己去编写。
好了,下面就开始详细的记录怎么去移植。
一、创建一个无操作系统的简单裸板系统1.创建源文件工程文件夹,如下图所示:其中文件夹CMSIS 为内核的接口,包含的文件如下图文件夹STM32_StdPeriph 为固件驱动文件夹,这个把STM32 的固件全都添加进去即可。
文件夹User 为其他文件,如下图所示:文件夹Output 和。
在ucos上移植stm32
1.准备材料在st官网上下载最新的固件库(现在是v3.5.0),地址为:/internet/com/SOFTWARE_RESOURCES/SW_COMPONENT/FIRMWARE/stm32 f10x_stdperiph_lib.zip(地址仅为参考,以最新变更为准)解压后目录如下:在ucos官网上下载移植stm32移植版的ucosii代码,这个需要注册一下,下载地址为:/download/uCOSII-ST-STM32F103ZE-SK.exe(以最新变更为准)下载安装后目录如下:2.创建工程文件(以Template为例)创建一个文件夹,取名为Template,新建App,Bsp,Libraries,Project,Readme,uCos-II,Source insight 文件夹,如图:App:用于存放与应用程序有关的文件Bsp:用于存放与硬件有关的驱动程序Libraries:用于存放固件库和启动文件Project:存放项目工程文件Readme:存放一些说明性的文件Source Insight:存放Source insight项目文件uCOS-II:存放uCOS的相关文件。
接下来往各个文件夹下添加相应的文件(以下图的文件路径为例):(1)将路径E:\Micrium\Software\EvalBoards\ST\STM32-SK\IAR\OS-Probe-LCD下的app,app_cfg,includes,os_cfg 复制到App文件目录下,除os_cfg外其他三个文件中的内容可以删除或在应用时更改。
(2)将路径E:\Micrium\Software\EvalBoards\ST\STM32-SK\IAR\BSP下的bsp.c,bsp.h 复制到Bsp文件目录下,用户使用时可以根据项目需求重写或更改。
(3)在Libraries文件夹下新建CMSIS文件夹,并在CMSIS中新建startup文件夹,将路径E:\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries下的STM32F10x_StdPeriph_Driver文件夹复制到Libraries中,将路径E:\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport 下的core_cm3.c,core_cm3.h 、路径E:\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x 下stm32f10x.h,system_stm32f10x.c,system_stm32f10x.h文件复制到CMSIS中,将路径E:\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\start up\iar 下的startup_stm32f10x_hd.s(根据mcu型号选择)复制到startup文件夹下,将路径E:\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template\EWARM 下的stm32f10x_flash.icf 复制到startup 文件夹下。
IAR为STM32新建工程模板(最详细)
IAR为STM32新建⼯程模板(最详细)今天给⼩伙伴分享⼀篇给stm32新建⼯程模版1、⾸先打开IAR,就是这个样⼦2、再建⼀个⽬录⽂件夹3、建⽴⼀个⼯作空间,以及建好⼯作空间如右图所⽰4、接下来建⽴⼯程,Project--------Creat New Project点击Empty project-------------再点击OK选择你之前创建的⽬录⾥⾯,取个名字再保存就⾏了保存之后就是这个样⼦5、这个时候再点保存,就像下图,会跳出⼀个窗⼝(如图),这个是保存你的⼯作空间,取个名字(⽤原来的⼯程名字都⾏),点保存就⾏6、接下来添加分组7、我们要多多添加这样的⼏个分组,如下8、在我们之前的⽬录⾥⾯也创建如下的⽂件夹9、按图⽰操作把下载的库⽂件夹⾥的这部分复制到之前创建的⽂件夹⾥10、按照图⽰,把iar⽂件夹⾥的启动⽂件全部复制到Startup内11、再把这三个⽂件复制到Startup⽂件夹内12、继续复制⽂件,把标准库内(图⽰)⽬录下的三个⽂件复制到User⽬录下,之前少做了⼀件事要把Startup⽂件夹⾥⾯的stm32f10x.h移到User⽂件夹内,这样看的美观⼀些。
13、导⼊⽂件,之前少创建了⼀个分组,补上如图所⽰导⼊⽂件的如下(如图):这⾥要注意⼀点,startup_stm32f10x_md.s这个⽂件是需要根据你的单⽚机型号来定的,不同型号的单⽚机这个启动⽂件不⼀样,我这⾥是stm32f103c8t6单⽚机14、在App⾥⾯创建⼀个main.c14、接下来配置⼯程15、选择单⽚机的型号16、将库配置选成Full,再勾选下⾯的Use CMSIS17、将char类型改成有符号型18、接下来就是极为重要的⼀件事,添加group⾥⾯.c⽂件的路径,黄⾊框的⽂件都要点进去,再点确认添加完成的路径图⽚是这样的19、到这⾥,已经完成了七七⼋⼋,把⿏标点击到main.c,来编译⼀下,就是图中的图标这样编译会出现好多个错误,⼀看到这么错误肯定会慌不要慌不就是这样的错误么,英⽂意思是请选择你应⽤中的单⽚机型号的启动⽂件点击这个错误可以定位到这⾥也就是说⼯程⾥缺少 #if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD) && !defined (STM32F10X_HD_VL) && !defined (STM32F10X_XL) && !defined (STM32F10X_CL) 这么多宏⾥⾯的⼀个所以我的单⽚机stm32f103c8t6的启动⽂件是STM32F10X_MD,按下图所⽰,添加这个东西之后,再编译20、再编译之后是下图这也是有原因的,我们点击⼀个警告错误,这个是初学者可能不懂,再把这个 USE_STDPERIPH_DRIVER 添加进去你们肯定会疑问为什么要添加这个这个宏,如下图所⽰看红框⾥⾯的斜蓝⾊字体,意思⼤致就是“如果你不使⽤外设驱动,在这种情况下,这些驱动不会被包括并且这些应⽤代码会直接基于外设寄存器”,所以我们需要这样的宏,再编译就显⽰没有错误,没有警告。
在eclipse中建立STM32工程模板
除了在MDK中可以开发,在eclipse中照样可以进行开发工作首先创建一个新工程
在这里选择空项目,并且交叉编译工具选择ARM GCC
工程建立好后可以看到GUN的路径以及一些头文件然后在工程目录下建立两文件夹
然后将固件库也移植到对应的目录下
下面开始配置工程模板
首先将固件库中的
用文字表述就是:将
\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template 放到
USER目录下
第二个:
将
\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10 x\startup\TrueSTUDIO
目录下的启动文件
将后缀改成大写
BCE等分别代表VC,VZ
由于这里我们使用的是STM32 CB所以选择B
最后删除掉
STM32F10x_StdPeriph_Lib_V3.5.0文件夹下的Utilities和Project文件夹
按F5或者刷新工程
此时
接下来配置工程
表示使用中型内存的muc和外围固件
最后修改函数
编译过程中报了下面三个错误第二个错误:
要添加make工具
解决这些问题:进入ccore_cm3.c
找到这一行
修改
这样就修改完成了
最后保存刷新,刷新很重要
这样就完成了工程的建立
这样,一个在eclipse下建立的stm32工程就完成了。
基于STM32F2xx库建立uCOS-II工程
基于STM32F2xx库建立uCOS-II工程的步骤1.1 前期准备基于STM32F2xx标准外设库建立uCOS-II工程需要准备的文件1.Micrium-ST-uCOS-II-LCD-STM32.exe,该文件是uCOS-II官方的ST Cortex-M3移植,下载地址:/page/downloads/ports/st/stm322.Keil RVMDK4.54 下载地址:https:///demo/eval/arm.htm3.STM32F2xx系列标准外设库,ST官方提供,版本V1.0.0,下载地址:/internet/com/SOFTWARE_RESOURCES/SW_COMPONENT/FIRMW ARE/ stm32f2xx_stdperiph_lib.zip1.1.1 准备工作1、新建一个文件夹,用来存放目的工程文件。
例如,笔者建立的工程文件名为STM32F205_UCOS2。
2、在工程文件夹中建立下面几个文件夹用来存放STM32F2xx库文件和UCOS-II源文件以及用户文件,这几个文件夹分别为CMSIS,Libraries,Output,uCOS-II,uCOS-II_BSP,USER。
1.1.2 复制uCOS-II文件Micrium-ST-uCOS-II-LCD-STM323、复制\Micrium\Software\EvalBoards\ST\STM3210E-EV AL\RVMDK\下的BSP文件夹到uCOS-II_BSP文件夹中,只保留BSP.c和BSP.h文件。
4、复制\Micrium\Software下所有文件夹到uCOS-II文件夹中。
1.1.3 复制STM32F2库文件STM32F2xx_StdPeriph_Lib_V1.1.05、复制\Libraries下的STM32F2xx_StdPeriph_Driver到Libraries文件夹中。
6、复制\Libraries\CMSIS下的Include文件夹到目标工程CMSIS文件夹中。
ucos任务建立
基于stemf103 uc/os系统应用程序的建立一、UC/OS II多任务机制UC/OS II是一种基于优先级的可剥夺型多任务内核。
在单CPU的情况下,是不存在真正的多任务机制的,存在的只是不同的任务轮流使用CPU,所以本质还是单任务,但由于CPU执行速度非常之快,加上任务切换十分频繁,所以感觉好像有很多任务在同时运行,这就是所谓的多任务机制。
二、应用程序的基本结构每个UC/OS-II应用程序至少有一个任务,每个任务都必须写成无限循环的形式,下面代码是UC/OS-II推荐的基本结构void task(void *pdate){INT8U err;InirTimer();While(1){... //应用程序代码OSTimeDly(1); //可选}}系统运行时,UC/OS-II会为每一个任务保留一个堆栈空间。
系统在任务切换时要恢复上下文并执行一个返回指令,如果允许任务执行完并返回,那么很有可能会破坏系统的堆栈空间,从而给应用程序带来不确定性。
也就是说程序跑飞了。
所以没个任务都必须写成无限循环的形式。
但任务循环,但不代表任务永远占有CPU的使用权,任务通过ISR或者操作系统API(如任务挂起),使任务放弃对CPU 的使用权三、几个比较重要的API函数1 OSTaskCreate()函数该函数应在main()函数内调用一次,在OSnit()函数调用之后调用,它的作用就是创建一个任务。
2 OSTaskSupend()函数该函数可将指定的任务挂起。
如果挂起的是当前任务,那么还会引发系统执行任务先导函数OSShed()进行一次任务切换。
3 OSTaskResume()函数该函数和OSTaskSupend()函数正好相反,它正好将指定的的已经挂起的函数恢复为就绪状态。
如果恢复任务的优先级高于当前任务,那么还将引发一次任务切换,其参数类似于OSTaskSupend()函数。
该函数并不要求和OSTaskSupend()函数成对出现。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
uCOS学习随笔 StepbyStep‐1——构建模板(基于STM32控制的第四代圆梦小车)一、序基于第四代圆梦小车 —— FIRA 设计了一个使用STM32的控制板(详细介绍见项目中的说明: Introduction B ‐ Hardware of the Smart Car.pdf )。
既然硬件从51升级到ARM,软件也应该相应升级,似乎不能再编写那种简单的轮询调度程序,也应该相应升级到基于操作系统编程。
按STM32的规模和性能,以及小车的控制需求,实时多任务操作系统 uCOSII 应该是不二的选择,不论从其性能和功能考虑,还是从学习角度考虑,uCOSII 都很适合。
首先,它是开源的,有丰富的资源。
其次,它是可靠的,符合正式的工业控制、产品设计需求。
小车所面对的是那些学习相关专业的大学生,作为他们学习的辅助工具,趣味性只是为了降低学习的枯燥性,不是目的。
他们借助这个平台是为了积攒应付未来工作的能力,所以,学习内容的实用性是必须考虑的。
本人从未基于操作系统编写嵌入式程序。
开始使用 MCU的时候,MCU的内存太小,256字节 RAM ,2K字节 ROM,能勉强把程序装入就不错了,连 C语言都不敢选择。
而且,那时好像也没有 RTOS(Real Time Operation System),或者是由于信息交流渠道匮乏,不知道有 RTOS。
既然我提供了这个平台,也借此机会尝试一下,和大家一起学习使用 uCOSII。
(从单片机应用升级为嵌入式应用 ^_^)二、Step1想要得到什么?(需求分析)第一步我想得到的是:1)如何建立一个基于 uCOSII 的编程环境(目录、文件组织);2)如何基于IDE(IAR或RvMDK)建立一个工程,能够产生可以运行的程序;3)得到一个“干净的”、可以作为模板的uCOSII程序组(Project);4)通过上述过程初步理解在 uCOSII 下如何编写应用程序。
之所以要把“如何建立……”作为需求,而不是找一个现成的模板或示例程序修改、添加自己的功能,是因为看了许多这种程序,感觉“极不可靠”!因为程序中有太多的东西不知道为何而存在?不知道为何而被注释掉?似乎这些东西都像“定时炸弹”,早晚会给你的程序带来麻烦。
同时,也给自己理解程序的构成和运行机制带来困扰,既然是学习,就应该知其然、知其所以然,否则也谈不上“掌握”,更不敢在日后的工作中应用(如果是打工,也许还敢试试,如果是用自己的钱做产品、项目,我想你一定不敢用),如此则和做此事的初衷相悖了。
三、如何入手?uCOS的书有很多,也看了许多,但多数都是解析操作系统本身的,或者是如何移植,鲜有书籍、资料教你如何在操作系统下编程。
实际上,对于学习者,特别是初学者,更多需要的是学会如何在一个移植好的系统下编程,等到能基于操作系统实现自己的功能后,才会有心思去探究操作系统是如何在自己的 MCU上运行的(移植),以及那些神秘的系统功能是如何实现的(了解系统函数及运行机制)。
而且这种探究也是有选择性的,首先是自己用到的功能才有兴趣去研究,否则如坠云雾。
其次,取决于自己所扮演的角色,如果只是学习一下,那只需泛泛了解,有个定性的认识即可。
如果要用于产品,那可能要深究,吃透其源代码,以保证产品的可靠和高效。
所以,要想学习有效,学习的方式首先要“正确”。
在编程理念上,人们已经接受了“面向对象”的思维方式,并且承认了其优越之处。
可在学习方式上似乎并未接受,至少大多数书籍还是基于“过程”的,目前所倡导的“任务驱动”(或者称之为“项目驱动”)模式似乎未被响应,而所谓“任务驱动”我觉得从实质上讲类似于编程中的“面向对象”概念。
“面向对象”核心是将编程的关注点放在要实现的功能上,而非实现功能的方式。
“任务驱动”核心是将学习的关注点放在要完成的任务上,而非完成任务的技能。
“面向对象”的优点源于这种思维方式转变带来了逻辑关系的清晰,从而使程序易于理解,带来的所有好处我认为都源于“易于理解”,如可移植性、可靠性、便于多人合作等。
而“任务驱动”同样也是得益于“易于理解”!(使用OS编程也是为了“易于理解”) 以往的“教”和“学”都是先传授知识、技能,后让学生使用之。
可痛苦在于,这些知识、技能是前人为了解决某些问题而创建的,准确的说应该是解决问题后抽象出来的。
学生们却要先把抽象的“记住”、“理解”,“暂存”后再去找机会用。
想象一下,学的过程会有多“枯燥”,更可悲的是,到需要用时,“暂存”的东西找不到了 。
人通常对于明确目标的事情有较强的兴趣,而且目标越近,动力越大,越亢奋。
对于不知为何而做的事很难投入,通常是三心二意应付了之。
目前的大学多数是这个状况。
所谓“任务驱动”就是先明确目标,再去学习实现目的所需的知识和技能。
这样学生在整个学习过程中都会主动去思考,不断斟酌正在学的东西可以怎样帮助自己实现目标。
此时,你想让他走神都难。
所以,本学习过程尝试采用“任务驱动”方式。
首先要确定一个合适的目标作为学习的素材,目标要可行、能提起兴趣,否则无异于没有。
我所选择的目标是用 STM32去控制一个小车。
小车控制涵盖了数字输出输入、模拟输入、定时器应用、通讯应用等,应该说嵌入式控制常用的知识均已包含。
因为电机驱动,转动检测、电机电流检测、通讯等需求同时存在,而且这些任务都有响应时间要求,uCOS 的实时多任务特征正好可以得到应用。
小车可以扩展,控制板有I2C接口,很多传感器都带。
但那是在小车控制自如后的事了。
本系列文章就准备在这个基础上逐渐深入。
四、初步规划从03年开始关注 uCOSII ,买了邵老师的书。
真正开始看是08年,我的第二代小车推出STM32扩展版之后。
晕晕乎乎将书看完,结果还是无从下手,半途而废。
这次重新启动是因为第四代小车没有设计51的控制器,为了演示只能编写STM32的控制程序。
为避免再次夭折,强迫自己不再为了销售而编写不带系统的示例程序。
那样虽很快捷,借助于ST的库,初始化好硬件,直接使用原来基于51的C程序即可。
可如果那样,或许就没有动力和压力去“折磨”自己,尝试在uCOSII下编程了。
不过这次我决定更章易辙,从应用入手,不再纠缠于系统本身。
1)买一个移植成功的学习板作为参考(我买的是“奋斗STM32”),期望少走些弯路。
2)买了本《基于嵌入式实时操作系统的程序设计技术》,期待得到系统的指引。
3)从uCOS的官网(/page/home)下载最新的uCOS源程序及资料。
4)以驱动小车控制板上唯一的LED为任务,自己构建编程环境和工程,作为日后深入的基础。
因为51我是用Keil的,所以ARM决定还是用Keil,减小难度。
五、实施5.1 准备工作uCOS官网上有移植好的 Cortex‐M3 上的 uCOSII,程序包为:Micrium‐ST‐uCOS‐II‐LCD‐STM32.exe下载安装后,里面有uCOS源程序、ST库、基于ST学习板的示例程序、相应的说明。
看了若干资料,觉得最有价值莫过于从官网上下载的手册:AN1018 :µC/OSII and the ARM Cortex‐M3 Processors特别是其中的这张图:对照ReadMe 文件中的目录说明:结合“程序关系图”、“目录文件说明”,浏览一下相关内容,那张“程序关系图”最好能映射在脑中,对理解、构建程序极为有益!通过浏览,在脑中形成一个uCOS实现的框架,此时不必了解细节。
再把示例程序在IDE中打开编译、运行看看,因为我没有ST的学习板,就以奋斗STM32板的示例为参考。
这一步主要是为了验证IDE环境是否正确,因为示例的工程是正确的,如果此时有问题应出在IDE环境安装环节。
如果开始就建立自己的工程,出现障碍则无法判断。
这次看这些文件似乎有些感觉,不知道是不是那些似懂非懂的阅读从量变到质变了。
不过回想学计算机的经历,似乎每次学习新的东西都要有个“从混沌的积累到顿悟”的过程,或许这就是计算机知识的特征:每个概念都建立在一大堆概念之上,而且都是多因素网状关联,需要同时“拥有”才能得到“答案”。
5.2 动手实施示例程序还是比较“复杂”,因为它需要演示板上所有的功能。
以STM3210B‐EVAL为例,它上面有LCD、按钮、JoyStick、M25 Flash等外设,还支持了串口调试工具uC/Probe。
第一步我要的是一个“干净”的模板,只需要驱动一个LED,即一个IO口,因为这几乎是所有系统都会设计的。
通过这个模板,我希望理解uCOS下的程序是如何工作的。
至于调试用的 uC/Probe,相对于这一步所具备的水平,属于“奢侈品”,暂时还无法享用,所以暂不考虑,等日后程序功能多了,编程自如了,再“锦上添花”。
第一步:构建程序目录首先根据自己的需要构建一个目录。
因为我希望分步实现目标,将每一步都保留,而不是做完后只剩最后一步的内容,这样别人参考就比较容易,不会像uCOS附带的示例程序,内容太多,难以消化。
但不希望每一步的目录中都包含ST和uCOS的库文件,这样一是文件太大,二是如果库文件要升级会很麻烦。
为此,构建了以下目录结构:COMMON目录是基本不用修改的,其中内容来自:..\Micrium\Software\CPU\ST\STM32 STM32LIB..\Micrium\Software\uC‐CPU\ uC‐CPU..\Micrium\Software\uC‐LIB\ uC‐LIB..\Micrium\Software\uCOS‐II\ uCOS‐II..\Micrium\Software\uC‐Probe\ uC‐Probe虽然这一步不用 uC/Probe,但日后考虑会使用,故保留。
感到遗憾的是Micrium程序包中所附的ST库是2.0版的,本来打算自己更换为3.0版,但发现有些困难,初学乍练,不敢造次,就放弃了,留待日后升级吧。
学习目录目前只有 StepByStep‐1 一个,分为三个子目录:asp —— 用于存放应用程序,就是实现功能的程序。
工程文件在这个目录中。
bsp —— 用于存放相应的硬件驱动程序,用到什么添加什么。
out —— 存放所有编译、链接产生的文件,交流时这个目录内容可以不拷贝。
这样每做一步都建立一个目录,逐步丰富内容。
asp、bsp目录中的文件均以上述“uCOS程序关系图”中所描述的文件为基础。
第二步:构建自己的bsp文件我参考的是这个目录:..\Micrium\Software\EvalBoards\ST\STM3210B‐EVAL\RVMDK\BSP它包含以下文件:我不用LCD,所以去掉,bsp文件如下:注意:除删除了三个与LCD显示相关的文件外,bsp.h和bsp.c 也作了相应修改,主要是删除了不用的外设初始化和驱动程序,只保留了必须的驱动(详见程序清单)。