参考嵌入式专周报告.docx
《参考嵌入式专周报告.docx》由会员分享,可在线阅读,更多相关《参考嵌入式专周报告.docx(20页珍藏版)》请在冰点文库上搜索。
![参考嵌入式专周报告.docx](https://file1.bingdoc.com/fileroot1/2023-5/29/d72c8078-b4f8-4d3d-8c81-f77c2f41d852/d72c8078-b4f8-4d3d-8c81-f77c2f41d8521.gif)
参考嵌入式专周报告
一、概述..........................................2
1.实验目的........................................2
2.实习内容与要求..................................2
二、嵌入式系统技术................................2
1.嵌入式系统技术简介..............................2
2.μC/OS-II操作系统简介...........................3
三、硬件设计......................................4
1.Cortex-M3芯片简介..............................4
a.芯片概述.....................................4
b.内核架构.....................................4
2.stm32简介......................................5
3.硬件电路模块...................................6
a.电路各模块图................................6
b.电路总原理图:
...............................8
c.电路PCB图...................................9
四、软件设计......................................9
1.Keil软件基本用法...............................9
25
.................................五、总结以及心得.
一、概述实验目的1.熟悉嵌入式系统的开工作原理和应用;系统地了解嵌入式系统的基本组成、1)发流程。
硬件体系结构。
学会阅读中文、英文技术文档,理解ARM2)
的设计、了解嵌入式系统硬件和软件开发的技术,熟悉电路原理图和PCB3)Keil软件的应用。
熟悉嵌入式系统硬件和软件的调试方法。
4)内操作系统内核的基本结构和移植方法;掌握将μC/OS-II5)了解μC/OS-IICortex-M3处理器上的方法和步骤。
核移植到6)综合应用所学过的专业知识。
2.实习内容与要求STM32F103以英文Datasheet,Cortex-M31)阅读处理器相关技术文档(中文、处理器的组成、工作原理,以及典型系统硬件的设计。
为主),理解ARM图。
的最小系统,得到电路原理图和PCB软件,设计2)用电路CADCortex-M3创建工程、软件基本操作、开发的方法,包括:
MDK5.14进行ARM熟悉3)Keil
ARM接口驱动程序库的使用方法。
调试方法、C/OS-II操作系统内核的基本结构和移植方法。
4)了解μ撰写报告。
5)二、嵌入式系统技术嵌入式系统技术简介1.嵌入式系统(Embeddedsystem),是一种“完全嵌入受控器件内部,为特定应用而设计的专用计算机系统”,根据英国电气工程师协会(U.K.
InstitutionofElectricalEngineer)的定义,嵌入式系统为控制、监视或辅助设备、机器或用于工厂运作的设备。
与个人计算机这样的通用计算机系统不同,嵌入式系统通常执行的是带有特定要求的预先定义的任务。
由于嵌入式系统只针对一项特殊的任务,设计人员能够对它进行优化,减小尺寸降低成本。
嵌入式系统通常进行大量生产,所以单个的成本节约,能够随着产量进行成百上千的放大。
.
国装置、工厂等大规模设备的系统。
嵌入式系统是用来控制或者监视机器、内普遍认同的嵌入式系统定义为:
以应用为中心,以计算机技术为基础,软硬格要求的专件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等严中的嵌入式处理ROM用计算机系统。
通常,嵌入式系统是一个控制程序存储在器控制板。
事实上,所有带有数字接口的设备,如手表、微波炉、录像机、汽车等,都使用嵌入式系统,有些嵌入式系统还包含操作系统,但大多数嵌入式系统都是由单个程序实现整个控制逻辑。
嵌入式系统的核心是由一个或几个预先编程好以用来执行少数几项任务的微处理器或者单片机组成。
与通用计算机能够运行用户选择的软件不同,嵌入式系统上的软件通常是暂时不变的;所以经常称为“固件”。
操作系统简介μC/OS-II2.μC/OS-II是一种基于优先级的抢占式多任务实时操作系统,包含了实时内核、任务管理、时间管理、任务间通信同步(信号量,邮箱,消息队列)和内存管理等功能。
它可以使各个任务独立工作,互不干涉,很容易实现准时而且无误执行,使实时应用程序的设计和扩展变得容易,使应用程序的设计过程大为减化。
μC/OS-II是一个完整的、可移植、可固化、可裁剪的抢占式实时多任务内核。
μC/OS-II绝大部分的代码是用ANSII的C语言编写的,包含一小部分汇编代码,使之可供不同架构的微处理器使用。
至今,从8位到64位,μC/OS-II已在超过40种不同架构上的微处理器上运行。
μC/OS-II已经在世界范围内得到广泛应用,包括很多领域,如手机、路由器、集线器、不间断电源、飞行器、医疗设备及工业控制上。
实际上,μC/OS-II已经通过了非常严格的测试,并且得到了美国航空管理局(FederalAviationAdministration)的认证,可以用在飞行器上。
这说明μC/OS-II是稳定可靠的,可用于与人性命攸关的安全紧要(safetycritical)系统。
除此以外,μC/OS-II的鲜明特点就是源码公开,便于移植和维护。
.
三、硬件设计1.Cortex-M3芯片简介a.芯片概述位的,寄存器是位处理器内核。
内部的数据路径是32Cortex-M3是一个32采用了哈佛结构,拥有独立的指令总线位的。
CM332位的,存储器接口也是32和数据总线,可以让取指与数据访问并行不悖。
这样一来数据访问不再占用指内部含有好几条总线接口,每令总线,从而提升了性能。
为实现这个特性,CM3条都为自己的应用场合优化过,并且它们可以并行工作。
但是另一方面,指令总线和数据总线共享同一个存储器空间(一个统一的存储器系统)。
换句话说,了。
不是因为有两条总线,可寻址空间就变成8GB提供一个可选的CM3比较复杂的应用可能需要更多的存储系统功能,为此小端BothCM3中,MPU,而且在需要的情况下也可以使用外部的cache。
另外在模式和大端模式都是支持的。
CM3内部还附赠了好多调试组件,用于在硬件水平上支持调试操作,如指令断点,数据观察点等。
另外,为支持更高级的调试,还有其它可选组件,包括指令跟踪和多种类型的调试接口。
b.内核架构
ARMCortex-M3采用哈佛结构,并选择了适合于微控制器应用的三级流水线,但增加了分支预测功能。
现代处理器大多采用指令预取和流水线技术,以提高处理器的指令执行速度。
流水线处理器在正常执行指令时,如果碰到分支(跳转)指令,由于指令执行的顺序可能会发生变化,指令预取队列和流水线中的部分指令就可能作废,而需要从新的地址重新取指、执行,这样就会使流水线“断流”,处理器性能因此而受到影响。
特别是现代C语言程序,经编译器优化生成的目标代码中,分支指令所占的比例可达10-20%,对流水线处理器的影响会的更大。
为此,现代高性能流水线处理器中一般都加入了分支预测部件,就是在处理器从存储器预取指令时,当遇到分支(跳转)指令时,能自动预测跳转是否会发生,再从预测的方向进行取指,从而提供给流水线连续的指令流,流水线就可以不断地执行有效指令,保证了其性能的发挥。
.
内核的预取部件具有分支预测功能,可以预取分支目标地址ARMCortex-M3的指令,使分支延迟减少到一个时钟周期。
首次在内核上集成了嵌Cortex-M3针对业界对ARM处理器中断响应的问题,(ARM7个时钟周期Cortex-M3的中断延迟只有12套向量中断控制器(NVIC)。
)back-to-back使得背靠背(个周期);Cortex-M3还使用尾链技术,需要24-42采用了Cortex-M3)。
(ARM7需要大于30个周期6中断的响应只需要个时钟周期基于栈的异常模式,使得芯片初始化的封装更为简单。
种功耗管理支持位处理器的内核低功耗模式,3Cortex-M3加入了类似于8中断退出时睡眠;深度睡眠。
使整个芯片模式:
通过一条指令立即睡眠;异常/的功耗控制更为有效。
2.stm32简介STM32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARMCortex-0内核(ST'sproductportfoliocontainsacomprehensiverange
ofmicrocontrollers,fromrobust,low-cost8-bitMCUsupto32-bit
ARM-basedCortex?
-M0andM0+,Cortex?
-M3,Cortex?
-M4Flash
microcontrollerswithagreatchoiceofperipherals.SThasalsoextended
thisrangetoincludeanultra-low-powerMCUplatform)。
按内核架构分为不同产品:
其中STM32F1系列有:
STM32F103“增强型”系列
STM32F101“基本型”系列
STM32F105、STM32F107“互联型”系列
增强型系列时钟频率达到72MHz,是同类产品中性能最高的产品;基本型时钟频率为36MHz,以16位产品的价格得到比16位产品大幅提升的性能,是32位产品用户的最佳选择。
两个系列都内置32K到128K的闪存,不同的是SRAM的最大容量和外设接口的组合。
时钟频率72MHz时,从闪存执行代码,STM32功耗36mA,是32位市场上功耗最低的产品,相当于0.5mA/MHz。
STM32平台采用核心板+外围板方式。
核心板主要包括STM32F103VET6最小系统、按键、LED灯、TF卡、串口和JTAG电路。
可以完成STM32内部资源的大部分开发应用。
外围板包括数码管电路、存储器电路、红外、光敏电阻、温度传感器、ULN2003电路、步进电机、蜂鸣器、DS1302时钟电路和CAN总线等电CAN总线、SPI单总线、、IIC同时又对的所有资源、STM32基本包括了路设计,
总线等协议进行了硬件设计。
可以说,如何将核心板和外围板调试完成,就掌STM32内容。
握了大部分的
核心板的资源有:
STM32F103VET6
CPU,为1.主USB通信实验MiniUSB插座,具有通信功能,可进行2.电源3.电源模块,可以为系统提供3.3V单片机最小系统,包括晶振,复位电路,去耦电容等4.
灯4个LED5.
个按键电路46.卡电路TF7.外围板的资源有:
个四路数码管21.1个步进电机1个ULN2003电路、2.
1个蜂鸣器3.
芯片1个24C024.
HX1838个红外检测芯片5.1个光敏电阻16.DS18B20温度检测芯片7.1个时钟芯片1个DS13028.
TJA1050
CAN通信芯片9.1个
3.硬件电路模块
a.电路各模块图
系统原理图Stm32.
b.电路总原理图:
PCBc.电路图
四、软件设计
1.Keil软件基本用法
1)在桌面新建文件夹,命名。
打开下载好的Keil软件,如图
_-2)桌面选择菜单栏(工程——新建工程),然后出现的对话框,保存在选——选择自己新建的文件夹打开,输入任意名字,点击保存,如图
3)然后出现如图所示,选择89c51,点击确定
4)选择文件——新件文件,输入程序,然后点击保存,出现对话框文件名后记如图所示。
.c得加.
点击鼠标SoueceGroup1文件夹展开,选择然后选择左方框中的Target15)Add右键,选择增加文件到组,打开如图所示,选择Text1.c,单击
6)然后选择左方框中的Target1文件夹,右击鼠标,打开选择目标Target1属性,在出现的对话框选择输出按钮下的E生成HEX文件前打钩,点击确定如图
7)文件已产生,如图HEX
2温度测量电路图
3.程序
#includestm32f10x.h
#includestring.h
#include%usart.h
#includedelay.h
#includeled.h
#includekey.h
#includecxx.h
#includeili93xx.h
#includeouch.h
#include%ucos_ii.h
#includeGUI.h
#includeapp_cfg.h
OS_STKStart_Task_Stk[START_TASK_STK_SIZE];
staticvoidLoad_Drive(void)
{
u8key;
Stm32_Clock_Init(9);
delay_init(72);
uart_init(72,9600);
LED_Init();
KEY_Init();
AT24CXX_Init();
GUI_Init();
tp_dev.init();
key=KEY_Scan(0);
if(key==1){
TP_Adjust();
}
}
intmain(void)
{
Load_Drive();
while
(1)
{
OSInit();
OSTaskCreate(Start_Task,
(void*)0,
&Start_Task_Stk[START_TASK_STK_SIZE-1],
START_TASK_PRIO);
OSStart();
return0;
}
}
6.2、app.c
#includeapp_cfg.h
#include%ucos_ii.h
#includeled.h
#includegui.h
OS_STKUCGUI_DEMO_Task_Stk[UCGUI_DEMO_TASK_STK_SIZE];
OS_STKLED_Task_Stk[LED_TASK_STK_SIZE];
OS_STKTOUCH_TEST_Task_Stk[TOUCH_TEST_TASK_STK_SIZE];
OS_STKLED1_Task_Stk[LED1_TASK_STK_SIZE];
staticvoidCreate_Task(void);
voidStart_Task(void*p_arg);
staticvoidUCGUI_DEMO_Task(void*p_arg);
staticvoidLED_Task(void*p_arg);
staticvoidLED1_Task(void*p_arg);
staticvoidTOUCH_TEST_Task(void*p_arg);
voidGUID(void);
staticvoidCreate_Task(void)
{
OSTaskCreateExt(UCGUI_DEMO_Task,
(void*)0,
&UCGUI_DEMO_Task_Stk[UCGUI_DEMO_TASK_STK_SIZE
-1],
UCGUI_DEMO_TASK_PRIO,UCGUI_DEMO_TASK_PRIO,
&UCGUI_DEMO_Task_Stk[0],
UCGUI_DEMO_TASK_STK_SIZE,
(void*)0,
OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);
OSTaskCreateExt(LED_Task,
(void*)0,
&LED_Task_Stk[LED_TASK_STK_SIZE-1],
LED_TASK_PRIO,LED_TASK_PRIO,
&LED_Task_Stk[0],
LED_TASK_STK_SIZE,
(void*)0,
OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);
OSTaskCreateExt(LED1_Task,
(void*)0,
&LED1_Task_Stk[LED1_TASK_STK_SIZE-1],
LED1_TASK_PRIO,LED1_TASK_PRIO,
&LED1_Task_Stk[0],
LED1_TASK_STK_SIZE,
(void*)0,
OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);
OSTaskCreateExt(TOUCH_TEST_Task,
(void*)0,
&TOUCH_TEST_Task_Stk[TOUCH_TEST_TASK_STK_SIZE
-1],
TOUCH_TEST_TASK_PRIO,TOUCH_TEST_TASK_PRIO,
&TOUCH_TEST_Task_Stk[0],
TOUCH_TEST_TASK_STK_SIZE,
(void*)0,
OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);
}
voidStart_Task(void*p_arg)
{
(void)p_arg;
Create_Task();
while
(1)
{
OSTimeDlyHMSM(0,0,0,500);
}
}
staticvoidUCGUI_DEMO_Task(void*p_arg)
{
(void)p_arg;
while
(1)
{
MainTask();
OSTimeDlyHMSM(0,0,0,10);
}
}
staticvoidLED_Task(void*p_arg)
{
(void)p_arg;
while
(1)
{
led_on(0);
OSTimeDlyHMSM(0,0,1,0);
led_off(0);
OSTimeDlyHMSM(0,0,1,0);
}
}
staticvoidLED1_Task(void*p_arg)
{
(void)p_arg;
while
(1)
{
led_on
(1);
OSTimeDlyHMSM(0,0,0,500);
led_off
(1);
OSTimeDlyHMSM(0,0,0,500);
}
}
staticvoidTOUCH_TEST_Task(void*p_arg)
{
(void)p_arg;
while
(1)
{
GUI_TOUCH_Exec();
OSTimeDlyHMSM(0,0,0,10);
}
}
MainTask.c6.3、#includeGUI.h
#includeutton.h
#includeDIALOG.h
#includedelay.h
BUTTON_HandlehButton;
BUTTON_HandlehButton1;
BUTTON_HandlehButton2;
intKey=0;
voidBUT(void);
voidESC(void);
voidMainTask(void)
{
GUI_Init();
BUT();
ESC();
Key=GUI_WaitKey();
while
(1)
{
if(Key!
=0)
{
switch(Key)
{
case{GUI_DispStringAt(Hello
1:
world!
113,70);
BUTTON_Delete(hButton);
BUTTON_Delete(hButton1);
BUTTON_Delete(hButton2);
GUI_DispDecAt(Key,140,140,4);
Key=3;}
break;
case2:
{GUI_DispStringAt(hehe!
113,70);
BUTTON_Delete(hButton1);
BUTTON_Delete(hButton1);
BUTTON_Delete(hButton2);
GUI_DispDecAt(Key,140,140,4);
Key=3;}
break;
case3:
{delay_ms(10);
BUT();}
break;
default:
break;
}
Key=0;
}
else
delay_ms(10);
}
}
voidESC(void)
{
GUI_SetColor(GUI_CYAN);
GUI_SetFont(&GUI_Font8x16);
hButton2=BUTTON_Create(20,140,80,30,3,
WM_CF_SHOW);
BUTTON_SetText(hButton2,ESC);
}
voidBUT(void)
{
GUI_SetColor(GUI_CYAN);
GUI_SetFont(&GUI_Font8x16);
GUI_DispStringHCenterAt(Clickonbutton...,
160,0);
hButton=BUTTON_Create(20,20,80,30,1,
WM_CF_SHOW);
BUTTON_SetText(hButton,Clickme...);
2,
30,80,80,BUTTON_Create(20,=hButton1
WM_CF_SHOW);