ImageVerifierCode 换一换
格式:DOCX , 页数:18 ,大小:1.13MB ,
资源ID:9059561      下载积分:1 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-9059561.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(嵌入式系统课程设计报告.docx)为本站会员(b****0)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

嵌入式系统课程设计报告.docx

1、嵌入式系统课程设计报告NORTH CHINA UNIVERSITY OF SCIENCE AND TECHNOLOGY嵌入式系统课程设计报告学生姓名: 学 号: 学 院: 专业班级: 指导教师: 同组成员: 2016年 12 月 26 日一、课程设计目的本课程设计是在嵌入式系统原理与应用课程的基础上,通过软件编程及仿真调试的实践,进一步掌握嵌入式系统的原理和应用方法,是毕业设计前的一次重要实践,为今后从事嵌入式系统相关工作岗位打下良好的基础。二、设计题目及要求2.1 设计题目:基于STM32和uC/OS-II的多任务设计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指示灯组成流水灯(3)驱动蜂鸣器发出响声。(4)利用swd方式进行printf输出。三、设计原理说明3.1 硬件说明本次课程设计主要使用的是STM32 神舟 IV 号开发板为基

3、础进行课程设计的,本节将详细介绍神舟IV号开发板的各部分硬件原理与实现。 (1)开发板资源图(2)MCU开发板的处理器是STM32F107VCT6,该处理器基于ARM V7 架构的Cortex-M3 内核,主频72Mhz,内部含有256K字节的FLASH 和64K字节的SRAM,LQFP100 封装。(3)蜂鸣器开发板板载一个无源蜂鸣器,用于产品告警或声音提醒。蜂鸣器连接到了处理器的PA3管脚,当处理器的PA3管脚输出低电平时蜂鸣器开始鸣响,反之处理器的PA3管脚输出高电平时蜂鸣器停止鸣响.(4)指示灯开发板提供了1个电源指示灯和4路通用LED指示灯。电源指示灯指示3.3V电源是否正常。4路通

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

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

6、CIR来设置系统时钟。GPIO挂在APB2总线上,可对APB2ENR寄存器设置来确定所用到的GPIO时钟。(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、APB2ENR、SysTICK_CTRL、SysTICK_LOAD、SysTICK_VAL、SysTICK

7、_CALIB3.3 STM32库函数使用说明设计中只用到时钟和GPIO相关的库函数。(1)直接配置寄存器开发,如果代码比较庞大,可读性差。ST针对STM32 封装好一个软件封装库,开发者可调用函数接口(API ,Application Program Interface)来完成相应的开发工作,配置寄存器的工作由接口函数完成,使开发人员脱离最底层的寄存器操作,易于阅读,维护成本低。库是架设在寄存器与用户驱动层之间的代码,向下处理与寄存器直接相关的配置,向上为用户提供配置寄存器的接口。库开发方式与直接配置寄存器的方式的区别:(2)库目录和文件简介Libraries文件夹下是驱动库的源代码及启动文件

8、。在使用库开发时,需要把libraries目录下的相关库函数文件添加到工程中。进入Libraries文件夹看到,关于内核与外设的库文件分别存放在CMSIS和STM32F10x_StdPeriph_Driver文件夹中。CMSIS(Cortex Microcontroller Software Interface Standard):ARM将所有Cortex芯片厂商的产品的软件接口标准化,制定了CMSIS 标准。CMSIS 层起着承上启下的作用,一方面该层对硬件寄存器层进行了统一的实现,屏蔽了不同厂商对Cortex-M 系列微处理器核内外设寄存器的不同定义,另一方面又向上层的操作系统和应用层提供

9、接口,简化了应用程序开发的难度。LibrariesCMSISCM3 文件夹下又分为CoreSupport 和DeviceSupport 文件夹。在CoreSupport 中的是M3核通用的源文件core_cm3.c 和头文件core_cm3.h,作用是为采用Cortex-M3核设计SOC的芯片商设计的芯片外设提供一个进入M3内核的接口。这两个文件在其它公司的Cortex-M3系列芯片也是相同的。我们只需把这个文件加进我们的工程文件即可。在DeviceSupport文件夹下的是启动文件、外设寄存器定义&中断向量定义层 的一些文件,由ST公司提供。system_stm32f10x.c文件的功能是设

10、置系统时钟和总线时钟,该文件中包含了stm32f10x.h 这个头文件。启动文件要选择startup_stm32f10x_cl.s。系统启动文件由汇编编写,不同的文件对应不同的芯片型号。启动文件是任何处理器在上电复位之后最先运行的一段汇编程序。在我们编写的c 语言代码运行之前,需要由汇编为c 语言的运行建立一个合适的环境,接下来才能运行我们的程序。所以我们也要把启动文件添加进我们的的工程中去,其作用相当于bootloader。STM32F10x_StdPeriph_Driver:该文件夹下有inc和src两个文件夹,都属于CMSIS的设备外设函数部分。src 里面是每个设备外设的驱动程序。sr

11、c 和inc 文件夹里的就是ST 公司针对每个STM32外设而编写的库函数文件,每个外设对应一个.c 和.h 后缀的文件。我们把这类外设文件统称为:stm32f10x_ppp.c 或stm32f10x_ppp.h 文件,ppp表示外设名称。如针对GPIO外设,在src文件夹下有一个stm32f10x_gpio.c 源文件,在inc 文件夹下有一个stm32f10x_gpio.h头文件,设计中用到了STM32的GPIO,则至少要把这两个文件包含到工程里。这两个文件夹中,还有一个很特别的misc.c文件,这个文件提供了外设对内核中的NVIC(中断向量控制器)的访问函数,在配置中断时,我们必须把这个

12、文件添加到工程中。在用库建立一个完整的工程时,还需要添加user目录下的stm32f10x_it.c、stm32f10x_it.h、stm32f10x_conf.h 这三个文件。stm32f10x_it.c用来编写中断服务函数;stm32f10x_conf.h用来配置使用了什么外设的头文件,用这个头文件我们可以很方便地增加或删除外设驱动函数库。库文件直接包含进工程即可,丝毫不用修改,而有的文件就要我们在使用的时候根据具体的需要进行配置。(3)用到的库函数:SystemInit、RCC_APB2PeriphClockCmd、SysTick_Config、GPIO_Init 、GPIO_SetBi

13、ts、GPIO_ResetBits。 3.4 uC/OS-II任务管理函数使用说明设计中用到的任务管理函数包括任务堆栈的建立、任务的创建和uC/OS-II的初始化和任务的启动。 (1)UCOSII的前身是UCOS,最早出自于1992 年美国嵌入式系统专家Jean J.Labrosse把UCOS 的源码发布在BBS 上。目前最新的版本是UCOSIII,但是现在使用最为广泛的还是UCOSII。UCOSII是一个可裁减的、抢占式、实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器,已经移植到近40多种处理器体系上,涵盖了从8位到64位各种CPU(包括DSP)。UCOSII(V2.91版本)

14、体系结构如下图所示:(2)uC/OS-II操作系统内核的主要工作就是对任务进行管理和调度,任务的执行代码通常是一个无限循环结构。从程序设计的角度来看,一个uC/OS-II任务的代码就是一个C语言函数,任务的参数是一个void类型的指针,但是这些函数是由主函数main()来负责创建和启动,然后由操作系统负责调度和运行,而不是调用的关系。OSTaskCreate()为创建任务的函数,OSStart()为启动任务的函数。使用OSStart()之后,任务就交由操作系统来管理和调度。 每个任务都必须具有一个唯一的优先级别,每一个级别都用一个数字来表示,比如数字为0255.在存储器中按数据“后进先出”的原

15、则组织的连续存储空间称为堆栈,为了满足任务切换和响应中断时保存CPU寄存器中的内容及存储任务私有数据的需要,每个任务都应该配有自己的堆栈。任务堆栈是任务的重要组成部分。使用数据类型OS_STK来定义任务堆栈,即定义一个OS_STK类型的数组。 在使用uC/OS-II的所有服务之前,必须调用uC/OS-II的初始化函数OSInit(),对uC/OS-II自身的运行环境进行初始化。为了能使用习惯的方法来使任务延时,uC/OS-II提供了一个可以用时、分、秒为参数的任务延时函数OSTimeDlyHMSM(),比如延时1秒可用OSTimeDlyHMSM(0,0,0,1000).(3)需要用到的任务管理

16、函数:OSInit、OSTaskCreate、OSStart、OSTimeDlyHMSM四、软件设计(含流程图、带注释的程序清单)系统上电开始运行初始化创建任务TASK_1创建任务TASK_4创建任务TASK_3创建任务TASK_2执行OSSTART()函数后开始STM32执行相应任务执行OSSTART()函数后开始STM32执行相应任务执行OSSTART()函数后开始执行相应任务执行OSSTART()函数后开始执行相应任务/*main.c*/#include includes.h#include stm32f10x.h#include stm32f10x_rcc.h #include std

17、io.hconst uint32_t SystemFrequency = 72000000; #define RCC_GPIO_LED RCC_APB2Periph_GPIOD #define GPIO_LED GPIOD #define DS1_PIN GPIO_Pin_4 #define ITM_Port8(n) (*(volatile unsigned char *)(0xE0000000+4*n) #define ITM_Port16(n) (*(volatile unsigned short*)(0xE0000000+4*n) #define ITM_Port32(n) (*(vol

18、atile unsigned long *)(0xE0000000+4*n) #define DEMCR (*(volatile unsigned long *)(0xE000EDFC) #define TRCENA 0x01000000 GPIO_InitTypeDef GPIO_InitStructure; #define TASK_1_PRIO 5 #define TASK_2_PRIO 6#define TASK_3_PRIO 7#define TASK_4_PRIO 8#define TASK_1_STK_SIZE 100#define TASK_2_STK_SIZE 100#def

19、ine TASK_3_STK_SIZE 100#define TASK_4_STK_SIZE 100OS_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 handle; ; FILE _stdout; FILE _stdin; /* 重写fputc函数*/int fputc(int ch, FILE *f)

20、 if (DEMCR & TRCENA) while (ITM_Port32(0) = 0); ITM_Port8(0) = ch; return(ch); void Task_1(void *arg) while (1) GPIO_ResetBits(GPIO_LED,DS1_PIN); /点亮LED3 OSTimeDlyHMSM(0,0,0,1000); GPIO_SetBits(GPIO_LED,DS1_PIN); /熄灭LED3 OSTimeDlyHMSM(0,0,0,1000); void Task_2(void *arg) while (1) GPIO_ResetBits(GPIO

21、_LED,GPIO_Pin_2); /点亮LED1 OSTimeDlyHMSM(0, 0,0,1500); GPIO_SetBits(GPIO_LED,GPIO_Pin_2); /熄灭LED1 GPIO_ResetBits(GPIO_LED,GPIO_Pin_3); /点亮LED2 OSTimeDlyHMSM(0, 0,0,1500); GPIO_SetBits(GPIO_LED,GPIO_Pin_3); /熄灭LED2 GPIO_ResetBits(GPIO_LED,GPIO_Pin_7); /点亮LED4 OSTimeDlyHMSM(0, 0,0,1500); GPIO_SetBits(G

22、PIO_LED,GPIO_Pin_7); /熄灭LED4 void Task_3(void *arg) while (1) GPIO_ResetBits(GPIOA,GPIO_Pin_3); /无源蜂鸣器响 OSTimeDlyHMSM(0,0,0,1000); GPIO_SetBits(GPIOA,GPIO_Pin_3); /无源蜂鸣器不响 OSTimeDlyHMSM(0,0,0,1500); void Task_4(void *arg) while (1) printf(hello,world!n); int main(void) SystemInit(); /配置系统时钟为72M SysT

23、ick_Config(SystemFrequency/OS_TICKS_PER_SEC); /使能SysTick定时器 RCC_APB2PeriphClockCmd(RCC_GPIO_LED | RCC_APB2Periph_GPIOA, ENABLE); /使能GPIOA和GPIOD的时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(

24、GPIO_LED , &GPIO_InitStructure); /LED灯相关的GPIO初始化 GPIO_Init(GPIOA , &GPIO_InitStructure); /无源蜂鸣器相关的GPIO初始化 GPIO_SetBits(GPIO_LED ,GPIO_Pin_All); /熄灭所有LED指示灯 GPIO_SetBits(GPIOA,GPIO_Pin_3); /让无源蜂鸣器不响 OSInit(); /操作系统初始化 OSTaskCreate(Task_1,(void *)0,&task_1_stkTASK_1_STK_SIZE-1, TASK_1_PRIO); /创建任务Task

25、_1 OSTaskCreate(Task_2,(void *)0,&task_2_stkTASK_2_STK_SIZE-1, TASK_2_PRIO); /创建任务Task_2 OSTaskCreate(Task_3,(void *)0,&task_3_stkTASK_3_STK_SIZE-1, TASK_3_PRIO); /创建任务Task_3 OSTaskCreate(Task_4,(void *)0,&task_4_stkTASK_4_STK_SIZE-1, TASK_4_PRIO); /创建任务Task_4 OSStart(); /启动操作系统 /*/ /* STM32DBG.INI:

26、 STM32 Debugger Initialization File */ /*/ / / /*/ /* This file is part of the uVision/ARM development tools. */ /* Copyright (c) 2005-2007 Keil Software. All rights reserved. */ /* This software may only be used under the terms of a valid, current, */ /* end user licence from KEIL for a compatible

27、version of KEIL software */ /* development tools. Nothing else gives you the right to use this software. */ /*/ FUNC void DebugSetup (void) / Debug MCU Configuration / DBG_SLEEP Debug Sleep Mode / DBG_STOP Debug Stop Mode / DBG_STANDBY Debug Standby Mode / TRACE_IOEN Trace I/O Enable / TRACE_MODE Tr

28、ace Mode / Asynchronous / Synchronous: TRACEDATA Size 1 / Synchronous: TRACEDATA Size 2 / Synchronous: TRACEDATA Size 4 / DBG_IWDG_STOP Independant Watchdog Stopped when Core is halted / DBG_WWDG_STOP Window Watchdog Stopped when Core is halted / DBG_TIM1_STOP Timer 1 Stopped when Core is halted / DBG_TIM2_STOP Timer 2 Stopped when Core is halted / DBG_TIM3_STOP Timer 3 Stopped when Core is halted / DBG_TIM4_STOP Timer 4 Stopped when Core is halted / DBG_CAN_STOP CAN Stopped when Core is halted / _WDWORD(0xE0042004, 0x00000027); / DBGMCU_CR _W

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2