基于STM32和uC OS II的多任务设计 嵌入式系统课程设计报告_第1页
基于STM32和uC OS II的多任务设计 嵌入式系统课程设计报告_第2页
基于STM32和uC OS II的多任务设计 嵌入式系统课程设计报告_第3页
基于STM32和uC OS II的多任务设计 嵌入式系统课程设计报告_第4页
基于STM32和uC OS II的多任务设计 嵌入式系统课程设计报告_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、NORTH CHINA UNIVERSIT Y OF SCIENCE AND TECHNOLOG Y嵌入式系统课程设计报告学生姓名: 学 号: 学 院: 专业班级: 指导教师: 司组成员:2016年 12月26日嵌入式系统课程设计报告、课程设计目的本课程设计是在嵌入式系统原理与应用课程的基础上,通过软件编程及 仿真调试的实践,进一步掌握嵌入式系统的原理和应用方法, 是毕业设计前的一 次重要实践,为今后从事嵌入式系统相关工作岗位打下良好的基础。、设计题目及要求2.1设计题目:基于STM3和uC/OS-ll的多任务设计2.2功能实现:使用uC/OS-II的任务管理函数和STM32库函数控制相应的寄

2、存器,完成 一个多任务设计。整个设计共有 4个任务,驱动一个LED指示灯闪烁、由3 个LED指示灯组成的流水灯、驱动蜂鸣器和利用 swd方式进行printf输出。2.3设计要求:理解和熟练使用KEIL软件、STM32寄存器、STM32库函数和uC/OS-II 任务管理函数,用KEIL软件完成编程和调试,下载到开发板中实现 4个设 定的任务,并完成课程设计报告。四个任务分别为:(1) 驱动1个LED指示灯闪烁、(2) 由3个LED指示灯组成流水灯驱动蜂鸣器发出响声。利用swd方式进行printf输出。、设计原理说明3.1硬件说明本次课程设计主要使用的是STM32神舟IV号开发板为基础进行课程设计

3、的,本节将详细介绍神舟IV号开发板的各部分硬件原理与实现。(1) 开发板资源图f戈3V电源转换芯片2Kh!f 24C0IEtP ROMgTSB OTG主从接口 JW RTC实时时钟电池1K邸电源输入f r电源选择歼关III)电源E| KVlflOAr 以太网芯片甘2音频插座丿音频芯片2.祀无线 二模块接口hJsD卡座F串口 1串口(默认)Z-可调电陨模数转换串口芯片.fm 曲 At”F-E- J p-fe -鲨曲fiShwClfiM bitSP FLASHU315M无线 模块接口1 丄Z.ii寸/3.2孑匸 III j.c n 触摸屏接口III i.inBEEF蜂鸣器2个DM2个ADC STM

4、32Flh7VC 启动 复症 个LEDCortex-MJ模式按趣I指示灯功能按犍(2) MCU开发板的处理器是STM32F107VCT6,该处理器基于ARM V7架构的Cortex-M3内核,主频72Mhz,内部含有256K字节的FLASH和64K字节的SRAM,LQFP100 封装。(3) 蜂鸣器开发板板载一个无源蜂鸣器,用于产品告警或声音提醒。蜂鸣器连接到了处理器的PA3管脚,当处理器的PA3管脚输出低电平时蜂鸣器开始 鸣响,反之处理器的PA3管脚输出高电平时蜂鸣器停止鸣响.(4) 指示灯开发板提供了 1个电源指示灯和4路通用LED指示灯。电源指示灯指示3.3V电源是否正常。4路通用LED

5、指示灯可以用于指示STM32开发板的状态。用户LED指示灯由GP10管脚控制LED灯的亮灭,当GPIO管脚输出低电平时,LED指示灯亮。反之,当GPIO管脚输出高电平时,LED指示灯灭。这四个LED指示灯分别由PD2、PD3、PD4和PD7控制。(5) JTAG仿真调试开发板提供标准的20针JTAG接口,可以直接和JLINK V8仿真器连接,下载程序,调试仿真;(6) 晶振电路STM32F10内部已经包含了 8MH高速内部R(振荡电路,但是其精准度 不是很高;为此在外部增加了 25MH的晶振电路,为系统的可靠工作提供 时序基准。(7) 设计中用到的管脚芯片引脚开发板模块PD2LED1PD3LE

6、D2PD4LED3PD7LED4PA3蜂鸣器3.2 STM32寄存器使用说明设计中,只用到时钟和GPIC相关的寄存器。(1) STM32F107VC共有 80个GPIQ 分成 A、B、C、D E五个组,每组有13-16个可用的I/O端口,每个GPim以自由编程。通过各个寄存器来控制 GPIO俞出高电平或者是低电平。每个GPIO有7个寄存器来控制,其中CR和CRH 用来确定I/O管脚的方向和速率以及何种驱动方式,BSR可直接修改某一个CPIC引脚的高低电平,BR可将GPIOS零。(2) 在使用配置GPI苗存器之前,都要先配置 GPIO勺时钟。通过RCC 寄存器当中的CR CFGI和CIR来设置系

7、统时钟。GPIO在APB总线上,可对 AP B2EN寄存器设置来确定所用到的GPIC时钟。(3) 卩C/OS-II用Cortex-M3的SysTick定时器产生操作系统需要的滴答 时钟,作为整个系统的根基。SysTick定时器的四个寄存器SysTick_CTRL SysTick_LOAD SysTick_VAL、SysTick_CALIB控制每隔一定时间产生一个中 断使卩C/OS-II系统能进行多任务控制。(3) 用到的寄存器:CRL CRH BRR BSRR CR CFGR CIR、AP B2ENR SysTICK_CTRL SysTICK_LOAD SysTICK_VAL SysTICK_

8、CALIB3.3 STM32库函数使用说明设计中只用到时钟和GPIO相关的库函数。(1) 直接配置寄存器开发,如果代码比较庞大,可读性差。ST针对STM32 封装好一个软件封装库,开发者可调用函数接口(API ,AppIicationProgram In terface )来完成相应的开发工作,配置寄存器的工作由接口函数完成,使开发人员脱离最底层的寄存器操作,易于阅读,维护成本低。库 是架设在寄存器与用户驱动层之间的代码,向下处理与寄存器直接相关的配 置,向上为用户提供配置寄存器的接口。库开发方式与直接配置寄存器的方 式的区别:调用库接口-19 -I nil I库开发方式 釈I直接配S寄存器方

9、式+(2) 库目录和文件简介Libraries文件夹下是驱动库的源代码及启动文件。在使用库开发时,需要把libraries目录下的相关库函数文件添加到工程中。进入Libraries文件夹看到,关于内核与外设的库文件分别存放在CMSIS和 STM32F10x_Std Perip h_Driver文件夹中。CMSIS ( Cortex Microco ntroller Software In terface Sta ndard ): ARI将 所有 Cortex 芯片厂商的产品的软件接口标准化,制定了CMSIS标准。CMSIS层起着承上启下的作用,一方面该层对硬件寄存器层进行了统一的实现,屏蔽了不

10、同厂 商对Cortex-M系列微处理器核内外设寄存器的不同定义,另一方面又向上 层的操作系统和应用层提供接口,简化了应用程序开发的难度。LibrariesCMSISCM3 文件夹下又分为 CoreSupport 和DeviceSupport 文 件夹。在CoreSupport中的是M3核通用的源文件core_cm3.c和头文件 core_cm3.h,作用是为采用Cortex-M3核设计SOC的芯片商设计的芯片外设提 供一个进入M3内核的接口。这两个文件在其它公司的 Cortex-M3系列芯片也 是相同的。我们只需把这个文件加进我们的工程文件即可。在DeviceS upport文件夹下的是启动文

11、件、外设寄存器定义 &中断向量定 义层 的一些文件,由ST公司提供。system_stm32f10x.C文件的功能是设置系 统时钟和总线时钟,该文件中包含了 stm32f10x.h这个头文件。启动文件要 选择startup_stm32f10x_cl.s系统启动文件由汇编编写,不同的文件对应不同 的芯片型号。启动文件是任何处理器在上电复位之后最先运行的一段汇编程 序。在我们编写的c语言代码运行之前,需要由汇编为c语言的运行建立一 个合适的环境,接下来才能运行我们的程序。所以我们也要把启动文件添加 进我们的的工程中去,其作用相当于 bootloader oSTM32F10x_StdPeriph_D

12、river :该文件夹下有inc和src两个文件夹,都 属于CMSIS的设备外设函数部分。src里面是每个设备外设的驱动程序。src和inc文件夹里的就是ST公司针对每个STM32外设而编写的库函数 文件,每个外设对应一个.c和.h后缀的文件。我们把这类外设文件统称为: stm32f10x_ppp.c 或stm32f10x_ppp.h 文件,ppp表示外设名称。如针对 GPIO 外设,在src文件夹下有一个stm32f10x_gpio.c源文件,在inc文件夹下有一 个stm32f10x_gpio.h头文件,设计中用到了 STM32的GPIO,则至少要把这两 个文件包含到工程里。这两个文件夹中

13、,还有一个很特别的misc.c文件,这个文件提供了外设对 内核中的NVIC(中断向量控制器)的访问函数,在配置中断时,我们必须把这 个文件添加到工程中。在用库建立一个完整的工程时,还需要添加user目录下的stm32f10x_it.c、 stm32f10x_it.h、stm32f10x_conf.h 这三个文件。stm32f10x_it.c用来编写中断 服务函数;stm32f10x_conf.h用来配置使用了什么外设的头文件, 用这个头文 件我们可以很方便地增加或删除外设驱动函数库。库文件直接包含进工程即可,丝毫不用修改,而有的文件就要我们在使用的时候根据具体的需要进行配置。(3)用到的库函数

14、:SystemInit、RCC_APB2PeriphClockCmd SysTick_Config、GPIO_lnit 、GPIO_SetBits、GPIO_ResetBits。3.4 uC/OS-ll任务管理函数使用说明设计中用到的任务管理函数包括任务堆栈的建立、任务的创建和 uC/OS-II的初始化和任务的启动。(1)UCOSI的前身是UCOS最早出自于1992年美国嵌入式系统专 家Jean J.Labrosse把UCOS的源码发布在BBS上。目前最新的版本是 UCOSIII,但是现在使用最为广泛的还是 UCOSIIoUCOSII是一个可裁减的、抢占式、实时多任务内核,具有高度可移植性,特

15、别适合于微处理器和控制器,已经移植到近40多种处理器体系 上,涵盖了从8位至U 64位各种CPU包括DSP)。UCOSII (V2.91版本) 体系结构如下图所示:(2) uC/OS-II操作系统内核的主要工作就是对任务进行管理和调度,任 务的执行代码通常是一个无限循环结构。从程序设计的角度来看,一个 uC/OS-II任务的代码就是一个C语言函数,任务的参数是一个 void类型的 指针,但是这些函数是由主函数 main ()来负责创建和启动,然后由操作系 统负责调度和运行,而不是调用的关系。OSTaskCreateO为创建任务的函数,OSStart ()为启动任务的函数。使 用OSStart

16、()之后,任务就交由操作系统来管理和调度。 每个任务都必须 具有一个唯一的优先级别,每一个级别都用一个数字来表示,比如数字为0 255.在存储器中按数据“后进先出”的原则组织的连续存储空间称为堆栈, 为了满足任务切换和响应中断时保存 CPU寄存器中的内容及存储任务私有数 据的需要,每个任务都应该配有自己的堆栈。任务堆栈是任务的重要组成部 分。使用数据类型OS_STI来定义任务堆栈,即定义一个OS_ST1类型的数组。在使用uC/OS-ll的所有服务之前,必须调用uC/OS-ll的初始化函数OSInit 0,对uC/OS-II自身的运行环境进行初始化。为了能使用习惯的方法来使任务延时,uC/OS-

17、II提供了一个可以用时、 分、秒为参数的任务延时函数OSTimeDlyHMSM,比如延时 1秒可用OSTimeDlyHMSM(00, 0,1000).(3) 需要用到的任务管理函数:OSInit、OSTaskCreate OSStart、OSTimeDlyHMSM四、软件设计(含流程图、带注释的程序清单)系统上电开始运行/*mai n.c*/#in elude in cludes.h#in elude stm32f10x.h#in elude stm32f10x_rcc.h#i nclude stdio.hconst uin t32_t SystemFreque ncy= 72000000;#

18、defi ne RCC_G PIO _LED#defi ne GPIO _LED#defi ne DS1 PINRCC_A PB2 Periph_GPIODGPIODGPIO Pin 4#defi ne ITM_Port8( n) (*(volatile un sig ned char *)(0xE0000000+4* n)#defi ne ITM _P ort16( n) (*(volatile un sig ned short*)(0xE0000000+4* n)#defi ne ITM_Port32( n) (*(volatile un sig ned long *)(0xE000000

19、0+4* n)#defi ne DEMCR (*(volatile un sig ned long *)(0xE000EDFC)#defi ne TRCENA0x01000000GP IO_I nitTyp eDef GPIO_ln itStructure;#defi neTASK_1 _P RIO5#defi neTASK_2 _P RIO6#defi neTASK_3_ PRIO7#defi neTASK_4_ PRIO8#defi neTASK_1_STK_SIZE100#defi neTASK_2_STK_SIZE100#defi neTASK_3_STK_SIZE100#defi n

20、eTASK_4_STK_SIZE100OS_STK task_1_stkTASK_1_STK_SIZE;OS_STK task_2_stkTASK_2_STK_SIZE;OS_STK task_3_stkTASK_3_STK_SIZE;OS_STK task_4_stkTASK_4_STK_SIZE;/定义堆栈 定义堆栈 定义堆栈 定义堆栈struct _FILE int han dle; ;FILE _stdout;FILE _stdi n;/* *重写fputc函数*/ int fputc(i nt ch, FILE *f)if (DEMCR & TRCENA)while (ITM_Por

21、t32(0) = 0);ITM_Port8(0) = ch;return(ch); void Task_1(void *arg) while (1)GPIO _ResetBits(G PIO _LED,DS1 _PI N); / OSTimeDlyHMSM(0,0,0,1000);GPIO _SetBits(G PIO _LED,DS1 _PI N);/OSTimeDlyHMSM(0,0,0,1000);点亮熄灭LED3LED3void Task_2(void *arg) while (1)/点亮LED1GP IO_ResetBits(G PIO_LED,G PIO_P in_2);OSTim

22、eDlyHMSM(0, 0,0,1500);GP IO_SetBits(G PIO_LED,G PIO_P in_2);/熄灭LED1GP IO_ResetBits(G PIO_LED,G PIO_P in_3);OSTimeDlyHMSM(0, 0,0,1500);GPIO _SetBits(G PIO_LED,G PIO_P in_3);/点亮熄灭LED2LED2GP IO_ResetBits(G PIO_LED,G PIO_Pin_7);OSTimeDlyHMSM(0, 0,0,1500);GP IO_SetBits(G PIO_LED,G PIO _P in_7);/点亮熄灭LED4L

23、ED4void Task_3(void *arg) while (1)GP IO_ResetBits(G PIOA,G PIO_P in_3); /OSTimeDlyHMSM(0,0,0,1000);GP IO_SetBits(G PIOA,G PIO_P in_3);OSTimeDlyHMSM(0,0,0,1500);无源蜂鸣器响/无源蜂鸣器不响void Task_4(void *arg)while (1)prin tf(hello,world!n); int main(v oid)配置系统时钟为72MSystemI ni t();/SysTick_Co nfig(SystemFreque

24、ncy/OS_TICKS _P ER_SEC);/ 使能SysTick定时器RCC_A PB2Perip hClockCmd(RCC_G PIO_LED | RCC_A PB2 Peri ph_GP lOA, ENABLE); / 使能 GPIOA和 GPIOD的时钟GPIO InitStructure.GPIO Pin = GPIO Pin All;GP IO_I ni tStructure.G PIO_Mode = GPIO_ Mode_O ut_PP;/LED灯相关GP IO_I ni tStructure.G PIO_S peed = GP IO_S peed_50MH z; GPIO

25、_lni t(G PIO _LED , &GP IO_I ni tStructure);的GPIO初始化/无源蜂鸣器/熄灭所有LED/让无源蜂鸣器GPIO_ln it(G PlOA , &GP 10ni tStructure);相关的GPIO初始化GP IO_SetBits(G PIO_LED ,GPIO_P in_AII);指示灯GP IO_SetBits(G PIOA,G PIO_P in_3);不响/操作系统初始化OSIn it();OSTaskCreate(Task_1,(void *)0, &task_1_stkTASK_1_STK_SIZE-1, TASK_1 _PRIO);/ 创

26、建任务 Task_1OSTaskCreate(Task_2,(void *)0, &task_2_stkTASK_2_STK_SIZE-1,TASK_2_PRIO);/ 创建任务 Task_2OSTaskCreate(Task_3,(void *)0, &task_3_stkTASK_3_STK_SIZE-1,TASK_3_PRIO);/ 创建任务 Task_3OSTaskCreate(Task_4,(void *)0, &task_4_stkTASK_4_STK_SIZE-1,TASK_4_PRIO);/ 创建任务 Task_4OSStartO;/ 启动操作系统/* */ /* STM32D

27、BG.INI: STM32 Debugger In itializatio n File*/* */ / / /* */ /* This file is part of the uVisio n/ARM devel opment tools.*/ /* Co pyright (c) 2005-2007 Keil Software. All rights reserved.*/ /* This software mayonly be used under the terms of a valid, current.*/* end user lice nee from KEIL for a com

28、p atible versi on of KEILsoftware*/* devel opment tools. Noth ing else gives you the right to use this software. */ /* */FUNC void DebugSet up (void) / Debug MCU Co nfiguration/DBG_SLEE P vi Debug Slee p Mode/DBG_ST OPvi Debug Sto p Mode/DBG_STANDBY Debug Sta ndby Mode/TRACE_IOEN Trace I/O En able/

29、TRACE_MODE Trace Mode/ Asynchronous/ Syn chro nous: TRACEDATA Size 1/ Syn chro nous: TRACEDATA Size 2/ Syn chro nous: TRACEDATA Size 4/ DBG_IWDG_ST OP vi Indepen da nt Watchdog Stopped whenCore is halted/ DBG_WWDG_STOP vi WindowWatchdog Stopped when Coreis halted/vo1.10/DBG_TIM1_ST OPDBG TIM2 STOP/D

30、BG TIM3 STOP/dbg_tim4_st opDBG_CAN_STOPTimer 1 Stopped whe n Core isTimer 2 Stopped whe n Core isTimer 3 Stopped whe n Core isTimer 4 Stopped whe n Core ishaltedhaltedhaltedhalted CAN Sto pped whe n Core is halted/ _WDWORD(0xE0042004, 0x00000027); / DBGMCU_CR_WDWORD(0xE000ED08, 0x20000000); / Set up

31、 Vector Table Offset RegisterDebugSet up();/ Debugger Setup五、设计总结本学期为期一周的嵌入式课程设计在不知不觉中结束了,虽说这次课程 设计时间不是很长,但是感觉自己收获颇丰,不仅学习到了一些新知识,回 顾了以前的一些快要遗忘的知识点,而且使自己的学习目标更加明确,学习 方法更加完善,也体会到软件开发的趣味,更加清楚地认识到了自己在软件 开发及学习上的一些不足之处,课程设计是培养学生综合运用所学知识,发现, 提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能 力的具体训练和考察过程.随着网络在人们生活中的运用越来越广泛和嵌入 式技术在日常生活中的地位日益凸显。 这对我们这些学习有关网络以及计算 机专业

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论