嵌入式实时时间显示

上传人:M****1 文档编号:563298694 上传时间:2023-06-03 格式:DOCX 页数:13 大小:56.76KB
返回 下载 相关 举报
嵌入式实时时间显示_第1页
第1页 / 共13页
嵌入式实时时间显示_第2页
第2页 / 共13页
嵌入式实时时间显示_第3页
第3页 / 共13页
嵌入式实时时间显示_第4页
第4页 / 共13页
嵌入式实时时间显示_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《嵌入式实时时间显示》由会员分享,可在线阅读,更多相关《嵌入式实时时间显示(13页珍藏版)》请在金锄头文库上搜索。

1、嵌入式实时时间显示一、设计任务1、要求利用嵌入式操作系统与STM32硬件设计一个实时时间的显示。二、设计要求1、利用UCOS系统作为嵌入式操作系统;2、使用STM32开发板作为开发平台;3、利用STM32内部RTC资源作为时钟源。三、设计仪器1、PC机一台;2、战舰STM32开发板;3、KEIL MDK 软件。四、设计原理1、STM32 RTC时钟简介STM32的实时时钟(RTC)是一个独立的定时器。STM32的RTC模块拥有一组 连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。修改计数器的 值可以重新设置系统当前的时间和日期。RTC模块和时钟配置系统(RCC.BDCR寄 存器)是在

2、后备区域,即在系统复位或从待机模式唤醒后RTC的设置和时间维持 不变。但是在系统复位后,会自动禁止访问后备寄存器和RTC,以防止对后备区 域(BKP)的意外写操作。所以在要设置时间之前,先要取消备份区域(BKP)写保 护。RTC的简化框图,如图所示:RTC由两个主要部分组成,第一部分(APB1接口)用來和APB1总线相连。此 单元还包含一组16位寄存器,可通过APB1总线对其进行读写操作。APB1接口 由APB1总线时钟驱动,用來与APB1总线连接。另一部分(RTC核心)由一组可编 程计数器组成,分成两个主要模块。第一个模块是RTC的预分频模块,它可编程 产生1秒的RTC时间基准TR.CLKo

3、 RTC的预分频模块包含了一个20位的可编程 分频器(RTC预分频器)。如果在RTC_CR寄存器中设置了相应的允许位,则在每 个TR.CLK周期中RTC产生一个中断(秒中断)。第二个模块是一个32位的可编程 计数器,可被初始化为当前的系统时间,一个32位的时钟计数器,按秒钟计算, 可以记录4294967296秒,约合136年左右,作为一般应用,这己经是足够了的。RTC还有一个闹钟寄存器RTC_ALR,用于产生闹钟。系统时间按TR_CLK周期 累加并与存储在RTC_ALR寄存器中的可编程时间相比较,如果RTC_CR控制寄存 器中设置了相应允许位,比较匹配时将产生一个闹钟中断。RTC内核完全独立于

4、RTC APB1接口,而软件是通过APB1接口访问RTC的预 分频值、计数器值和闹钟值的。但是相关可读寄存器只在RTC APB1时钟进行重 新同步的RTC时钟的上升沿被更新,RTC标志也是如此。这就意味着,如果APB1 接口刚刚被开启之后,在第一次的内部寄存器更新之前,从APB1上读取的RTC 寄存器值可能被破坏了(通常读到0)。因此,若在读取RTC寄存器曾经被禁止 的RTC APB1接口,软件首先必须等待RTC_CRL寄存器的RSF位(寄存器同步标 志位,bit3)被硬件置loRTC正常工作的一般配置步骤如下:(1)使能电源时钟和备份区域时钟。访问RTC和备份区域就必须先使能电源时钟和备份区

5、域时钟。RCC_APBlPeriphClockCmd(RCC_APBlPeriph_PWR|RCC_APBlPeriph_BKP,ENABLE);(2)取消备份区写保护。PWR_BackupAccessCmd (ENABLE) ;/使能 RTC 和后备寄存器访问(3)复位备份区域,开启外部低速振荡器。BKP_DeInit() ;/复位备份区域RCC_LSEConfig (RCC_LSE_0N) ; /开启外部低速振荡器(4) 选择RTC时钟,并使能。RCC_RTCCLKConfig (RCC_RTCCLKSource_LSE) ;/选择 LSE 作为 RTC 时钟。RCC_RTCCLKCmd

6、(ENABLE);/使能 RTC 时钟(5) 设置RTC的分频,以及配置RTC时钟。RTC_EnterConf igMode () ; / 允许配置RTC_ExitConf igMode () ;/退出配置模式,更新配置设置RTC时钟分频数,库函数是:void RTC_SetPrescaler(uint32_t PrescalerValue);设置秒中断允许,RTC使能中断的函数是:void RTC_ITConfig(uRTC_IT, FunctionalState NewState):RTC_ITConfig(RTC_IT_SEC, ENABLE) ;/使能 RTC 秒中断库函数中设置RTC

7、计数值的方法是:void RTC_SetCounter(uint32_t CounterValue)(6) 更新配置,设置RTC中断分组。RTC_ExitConfigMode () ;/退出配置模式,更新配置往备份区域写用户数据的函数是:void BKP_WriteBackupRegister(uintl6_t BKP_DR, uintl6_t Data):往BKP_DR1写入0x5050,方法是:BKP_WriteBackupRegister(BKP_DRl, 0X5050);读取备份区域指定寄存器的用户数据的函数是:uintl6_t BKP_ReadBackupRegister(uintl

8、6_t BKP_DR):(7) 编写中断服务函数。最后要编写中断服务函数,在秒钟中断产生的时候,读取当前的时间值,并 显示到TFTLCD模块上。2、UC0SII 简介UC0SII是一个可以基于ROM运行的、可裁减的、抢占式、实时多任务内核, 具有高度可移植性,特别适合于微处理器和控制器,是和很多商业操作系统性能 相当的实时操作系统(RTOS) o UC0SII构思巧妙,结构简洁精练,可读性强,同 时乂具备了实时操作系统的全部功能,体系结构如图所示:任务优先级,每个任务都有唯一的一个优先级。在UCOSII中,使用CPU的 时候,任务就绪表中总是优先级最高的任务获得CPU使用权,只有高优先级的任

9、务让出CPU使用权(比如延时)时,低优先级的任务才能获得CPU使用权。UCOSII 不支持多个任务优先级相同,也就是每个任务的优先级必须不一样。任务堆栈,就是存储器中的连续存储空间。为了满足任务切换和响应中断时 保存CPU寄存器中的内容以及任务调用其他函数时的需要,每个任务都有自己的 堆栈。在创建任务的时候,任务堆栈是任务创建的一个重要入口参数。任务控制块OS.TCB,用来记录任务堆栈指针,任务当前状态以及任务优先 级等任务属性。UCOSII的任何任务都是通过任务控制块(TCB)的东西來控制的, 一旦任务创建了,任务控制块OS_TCB就会被赋值。每个任务管理块有3个最重 要的参数:1,任务函数

10、指针;2,任务堆栈指针;3,任务优先级。UCOSII的每个任务都是一个死循环。每个任务都处在以下5种状态之一的 状态下,这5种状态是:睡眠状态、就绪状态、运行状态、等待状态(等待某一 事件发生)和中断服务状态。睡眠状态:任务在没有被配备任务控制块或被剥夺了任务控制块时的状态 就;绪状态:系统为任务配备了任务控制块且在任务就绪表中进行了就绪登记, 任务己经准备好了,但由于该任务的优先级比正在运行的任务的优先级低, 还 暂时不能运行,这时任务的状态叫做就绪状态;运行状态;该任务获得CPU使用 权,并正在运行中,此时的任务状态叫做运行状态;等待状态:正在运行的任务, 需要等待一段时间或需要等待一个事

11、件发生再运行时,该任务就会把CPU的使用 权让给别的任务而使任务进入等待状态;中断服务状态:一个正在运行的任务一 旦响应中断申请就会中止运行而去执行中断服务程序,这时任务的状态叫做中断 服务状态。UCOSII任务的5个状态转换关系如图所示:在UCOSII中,与任务相关的儿个函数:(1) 建立任务函数OSTaskCreate(void(*task)(void*pd), void*pdata, OS_STK*ptos, INTU prio)o(2) 任务删除函数UCOSII提供的任务删除函数原型为:INT8U 0STaskDel(INT8U prio):(3) 请求任务删除函数UCOSII提供的请

12、求删除任务函数原型为:INT8U 0STaskDelReq(INT8U prio):(4) 改变任务的优先级函数UCOSII提供的任务优先级修改函数原型为:INT8U 0STaskChangePrio(INT8U oldprio, INT8U newprio):(5) 任务挂起函数UCOSII 提供的任务挂起函数原型为:INT8U 0STaskSuspend(INT8U prio):(6) 任务恢复函数UCOSII提供的任务恢复函数原型为:INT8U 0STaskResume(INT8U prio):(7) 任务信息查询了解任务信息,查询任务信息函数原型为:INT8U 0STaskQuery(

13、INT8U prio, OS_TCB *pdata);在STM32上面运行UCOSII的步骤:(1) 移植 UCOSII(2) 编写任务函数并设置其堆栈大小和优先级等参数。(3) 初始化UCOSII,并在UCOSII中创建任务(4) 启动 UCOSII五、硬件设计本次设计用到的硬件资源:1、指示灯2、TFTLCD 模块3、内部RTC资源指示灯用于提示系统正在运行,TFTLCD用于显示运行时间、实时时间、日 期、星期、温度以及其它一些信息。六、软件设计主要利用UCOS创建两个任务,一个任务进行指示灯的提示,另一个任务进行TFTLCD内容的显示。1、程序设计框图2、主要程序开始任务#deflne

14、START_TASK_PRIO 10 开始任务的优先级设置为最低#define START_STK_SIZE64 设置任务堆栈大小_align(8) static OS_STK START_TASK_STKSTART_STK_SIZE; 任务堆栈,8 字节对齐void start_task(void *pdata);任务函数其它的任务与开始任务的配置过程基本一致/main函数mt mam(void)system_imt();/硬件初始化OSIiiitQ;/系统初始化OSTaskCieate(start_task,(void*)0,(OS_STK*)&START_TASK_STKSTART_ST

15、K_SIZE-1 ,START_TASK_PRIO );创建开始 任务OSSta 口 ();/启动系统开始任务void stait_task(void *pdata)OS_CPU_SR cpii_si=0;pdata = pdata;OS_ENTER_CRITICAL();/进入临界区(无法被中断打断)OSTaskCieate(led_task,(void *)0,(OS_STK*)&LED_TASK_STKLED_STK_SIZE-1,LED_TASK_PRIO); 创建 LED任另OSTaskCieate(time_task,(void*)0,(OS_STK*)&TIME_TASK_STKTIME_STK_SIZE-1 ,TIME_TASK_PRIO);/ 创建时间任务OSTaskSuspend(START_TASK_PRIO); 挂起开始任务.OS_EXIT_CRITICALQ;退出临界区(可以被中断打断)指示灯任务void led_task(void *pdata)pdata = pdata;while(l)LEDO !=LED0; delav

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号