数字时钟地嵌入式系统地设计Word文档下载推荐.docx
《数字时钟地嵌入式系统地设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《数字时钟地嵌入式系统地设计Word文档下载推荐.docx(10页珍藏版)》请在冰豆网上搜索。
本系统的功能是可调数字时钟,LED显示时间,通过键盘和触摸屏均可以校对时钟。
通过对本课题的设计达到如下目的:
1.熟悉ARM芯片cortex-m3定时/计数器,中断的应用。
2.掌握给予嵌入式操作系统us/os的编程方法。
3.熟悉时钟时,分,秒计时方法,掌握编程技巧。
4.掌握键盘的基本工作原理,键的识别,键抖动和重键问题的解决,键盘工作方法和键盘程序的编程。
5.掌握七段码LED的结构,七段码LED的工作方式和显示程序的编程。
二.软硬件的设计
1.设计要求
利用cortex-m3,uc/os,七段码LED,按键及常用外围器件,设计一个基于嵌入式操作系统的数字电子钟系统,具体要求如下:
(1).设计基于嵌入式操作系统的数字电子钟系统的硬件框图。
(2).设计定时程序。
(3).在LED上显示时间,通过按键切换,分别显示时,分,秒,设计显示程序。
(4).可用键盘进行校对时间,设计键盘程序。
2.硬件环境概述
嵌入式系统主要由嵌入式微处理器和操作系统组成。
硬件主要包括:
微处理器,ROM,DRAM,人机交互接口,A/D、D/A转换电路,触摸屏等。
嵌入式系统的核心部件是各种类型的嵌入式处理器,嵌入式开发硬件平台的选择主要是嵌入式处理器的选择。
在一个系统中使用什么样的嵌入式处理器内核主要取决于应用的领域、用户的需求、成本、开发的难易程度等因素。
确定了使用哪种嵌入式处理器内核以后,接下来就是综合考虑系统外围设备的需求情况一选择一款合适的处理器。
本系统采用基于ARM的S3C44B0X的微处理器,通过系统总线将CPU、电源管理模块、存储器、控制器、LCD控制器、中断控制器连接在一起,通过外设总线和A/D转换器、看门狗定时器、通过I/O控制器、PWM定时器等连接在一起。
S3C44B0X的160个引脚中,71个引脚可以通过编程的方法定义多功能输入/输出引脚。
I/O端口有两种编制方式,键盘模块输入数字型数据或选择控制设备的操作模式,LCD通过数据总线寄存器及使能信号与处理器连接实现触摸屏驱动X、Y通道连接。
硬件设计原理图如下:
STM32原理图如下图:
3.软件环境概述
嵌入式系统的软件一般由嵌入式操作系统和应用软件组成,编译过程是一起进行的。
而操作系统的软件又与硬件紧密相关,必须与具体应用相结合才能发挥其优势,即必须结合实际系统的需求进行合理的裁剪。
所以,如果能够建立相对通用的软硬件基础,然后在其上开发出需要的系统,是一种比较好的发展模式。
从某种程度上来说,嵌入式系统是指能够运行操作系统的软硬件综合体。
就实时嵌入式操作系统(operationsystem)而言,它可大致分为商用嵌入式OS与源码开放的嵌入式OS,前者如WindRiver公司的Vxworks、ISI公司的pSOS和Quantum公司的QNX等,后者如免费的嵌入式Linux,以及本文中所用到的uC/OSⅡ。
尽管这些嵌入式RTOS形式多样,但一般都具有以下特点:
1)可裁剪的微内核结构,高效的多任务优先级管理,μs级的中断处理(Windows下的中断最快是55μs/次),更加有利于工业控制效率的提高;
2)支持多处理器并行处理及任务间通信(这一点对于电力系统并行计算有可借鉴之处);
3)具有共享内存,有利于实时数据库的实现;
4)灵活的引导方式(支持从ROM/flash/本地盘/网络引导),引导操作系统事件更短,甚至可以一上电在秒级的时间内就跳转至用户程序处等等。
从这些特点可看出,在工业控制等领域以嵌入式RTOS作为软件平台将比Windows、UNIX、OS/2等商用操作系统更有其特殊的优势。
例如东北电网的SCADA与EMS中就采用了VXM实时操作系统。
目前国际上已有几百个成熟的实时嵌入式操作系统,而我国在这方面起步较晚。
这里将比较两种实时操作系统以说明选择uC/OS-Ⅱ的原因。
uCLinux是专为无MMU微处理器打造的嵌入式Linux操作系统。
它是由Linux2.0内核发展来的,内核代码小于512kb。
uC/OS-Ⅱ内核编译过后大约为6~10kb。
uC/OS-Ⅱ内核是针对实时系统的要求设计实现的,可以满足较高的实时性要求。
而uCLinux仅针对嵌入式处理器进行了改良,实时性不如uC/OS-Ⅱ优越。
uCLinux继承了Linux内核的特点,支持文件系统和网络能力,并提供了一些API接口函数,而uC/OS-Ⅱ只是一个实时内核,要建立一个实用的系统,还需要进行扩展。
由于该系统设计对实时性要求很高,所以本文选择uC/OS-Ⅱ内核进行移植。
嵌入式系统中,软件和硬件紧密配合,协调工作,共同完成系统预定的功能。
根据OSI的七层模型可以确定链路层和物理层有硬件实现,其他各层由软件实现。
(三)系统的实现
由于嵌入式应用软件是通过并发的任务来运作的,应用软件开发的系统设计将系统划分为多个并发执行的任务,通过相互间通信建立联系。
根据需求划分任务是比较重要的一步,通用部分可以划分为各个功能子模块。
本文中设计的保护测控系统,划分成数据采集、液晶操作、键盘处理、循环计算程序、保护量计算、继电器出口等任务,每一个任务根据相互之间的关系及数据流设置优先级以及执行频率,这些设置好之后都由内核实现调度和任务之间的通信。
同时还要根据实际情况设置中断的优先级。
在以uC/OS-Ⅱ为操作系统的项目中,系统可能要处理各种不同的中断请求,如果某个中断处理程序需要调用uC/OS-Ⅱ的各种Post函数向任务发出消息,那么uC/OS-Ⅱ中的中断服务程序的写法是:
1)保存全部CPU寄存器;
2)调用OSIntEnter或OSIntNesting直接加1;
3)执行用户代码做中断服务;
4)调用OSIntExit;
5)恢复所有CPU寄存器;
6)执行中断返回指令。
这种方式实际上是将这个中断处理加入了任务调度系统,也就是说这个中断可以引起任务的切换,也叫“标准中断”。
如果在中断处理中没有调用各种Post函数的话,则可以用原来没有操作系统时的写法:
1)保存中断处理程序需要用到的CPU寄存器;
2)执行中断处理;
3)恢复保存了的CPU寄存器;
4)执行中断返回指令。
按照这种方法定义的中断永远不会引起任务切换,称为“快中断”。
图2:
系统结构
主要软件设计如下:
1.主程序
主程序的主要功能是进行定时器/计数器初始化编程,然后通过反复调用子程序的方法,等待定时中断的到来。
流程框图如图3-1所示。
主程序如下:
#include"
stm32f10x.h"
SysParaSet.h"
KeyScan.h"
externu8KeySta,KeyChanFlag;
externu8TimeCountA,TimeCountB,Time3Flag;
externu8SecData,MinuData,SecDataPart[2],MinuDataPart[2];
u8CountA,KeyCountA;
u8LEDDispA,LEDDispB,LEDDispC,LEDDispD;
intmain(void)
{
inta=0,b=0,c=0,d=0;
NVIC_Configuration();
//初始化
GPIOConfiguration();
D3Off;
D4Off;
D5Off;
D6Off;
D7Off;
D8Off;
KeyCountA=0;
Time3Flag=0;
for(CountA=0;
CountA<
5;
CountA++)
{
D3On;
D4On;
D5On;
D6On;
D7On;
D8On;
delay_ms(1000);
D3Off;
D4Off;
D5Off;
D6Off;
D7Off;
D8Off;
}
EXTI9_5_Config();
EXTI15_10_Config();
TIMER3_Init();
ADInit();
while
(1)//主循环
{
KeyScan();
if(KeyChanFlag==0x01)
{
switch(KeySta)
{
case0x07:
KeyCountA++;
if(KeyCountA>
0x04)
{
KeyCountA=0;
}
while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_4)==0);
break;
default:
}
KeyChanFlag=0x00;
LEDDispA=0;
//LEDA显示0
LEDDispB=0;
//LEDB显示0
LEDDispC=0;
//LEDC显示0
LEDDispD=0;
//LEDD显示0
for(d=0;
d<
10;
d++)//在for循环下实现计数,d为秒
{
LEDDispA=a;
//LEDA显示a所对应的值
LEDDispB=b;
//LEDB显示b所对应的值
LEDDispC=c;
//LEDC显示c所对应的值
LEDDispD=d;
//LEDD显示d所对应的值
delay_ms(50);
//延时
/*实现60进制技术,即为秒的设计*/
if(d==9)//当d等于9时,进位,即c=c+1
{c=c+1;
if(c==6)//当c=6时,说明秒的部分已完成0-59的计数,先将秒的部分清零,再进位
{c=0;
d=0;
b=b+1;
//分的部分进一位
/*实现60进制技术,即为分的设计*/
if(b==10)//当b=10时,b已经完成0-9的计数,也是先清零,再进位
b=0;
a=a+1;
}
if(a==6)//当a=6时,说明分的部分已完成0-59的计数,全部清零
{a=0;
b=0;
c=0;
d=0;
}
2.定时中断程序
采用中断方式进行溢出次数累计,计满20次即到秒计时。
从秒到分,从分到时的计时,可通过数值比较实现。
流程框图如图3-2所示。
3.设计键盘子程序(KEY)
采用独立按键扫描法,设计键盘程序。
用软件方法解决按键抖动问题。
键盘程序框图如图3-3所示。
三、结束语
本系统中还有许多问题存在,由于我刚接触嵌入式系统,对其了解的不是很深,只是在老师原先给的数码管动态显示的那个程序的基础上改的。
我并没有用外部中断去实现计时器,而是在主程序中用C语言区实现,在主程序中写还是比较简单的,只是一开始要想好设计思路。
我的设计想法是整个计数在d的循环计数上实现的,所以整个分,秒的计数都是在for循环里实现的。
要注意的是,在秒已经完成0-59计数后是要先清零在进位,否则会0分59秒后会直接出现1分59秒,然后再出现1分00秒。
后面只要出现进位都要注意这个问题,否则计数系统会出现混乱。
到分的0-59计数完成后整个系统要清零。
我再编程时还遇到了下面两个问题需要重视。
LEDDispA=a;
数码管显示要在for循环之前,否则数码管显示也会有点小问题。
整个系统只要有一个延时就好了,否则系统在计时时会出现紊乱。
这个课题用外部中断完成会比较好,虽然我也完成了电子钟的实验,但是程序刷新时间会比较长,实际设计中不会采用在主程序内写代码的。
我相信通过今后的学习,我会掌握更多的单片机知识,能够让设计的程序更加简洁方便。