当前位置:文档之家› 嵌入式实时时间显示

嵌入式实时时间显示


任务
OSStart();//启动系统
6
} //开始任务 void start_task(void *pdata) { OS_CPU_SR cpu_sr=0;
pdata = pdata; OS_ENTER_CRITICAL();//进入临界区(无法被中断打断) OSTaskCreate(led_task,(void *)0,(OS_STK*)&LED_TASK_STK[LED_STK_SIZE-1],LED_TASK_PRIO);// 创 建 LED 任务 OSTaskCreate(time_task,(void *)0,(OS_STK*)&TIME_TASK_STK[TIME_STK_SIZE-1],TIME_TASK_PRIO);// 创建时间任务 OSTaskSuspend(START_TASK_PRIO); //挂起开始任务. OS_EXIT_CRITICAL(); //退出临界区(可以被中断打断) } //指示灯任务 void led_task(void *pdata) { pdata = pdat初始化 系统初始化 创建开始任务
启动系统
开始任务 创建指示灯任务 创建显示任务 挂起开始任务
指示灯任务
显示任务 获取时间、温度
LED 取反 延时进行任务切换
得到日期 显示数据 延时进行任务切换
2、主要程序
//开始任务
#define START_TASK_PRIO 10 //开始任务的优先级设置为最低
RTC 由两个主要部分组成,第一部分(APB1 接口)用来和 APB1 总线相连。此 单元还包含一组 16 位寄存器,可通过 APB1 总线对其进行读写操作。APB1 接口 由 APB1 总线时钟驱动,用来与 APB1 总线连接。另一部分(RTC 核心)由一组可编 程计数器组成,分成两个主要模块。第一个模块是 RTC 的预分频模块,它可编程 产生 1 秒的 RTC 时间基准 TR_CLK。RTC 的预分频模块包含了一个 20 位的可编程 分频器(RTC 预分频器)。如果在 RTC_CR 寄存器中设置了相应的允许位,则在每 个 TR_CLK 周期中 RTC 产生一个中断(秒中断)。第二个模块是一个 32 位的可编程 计数器,可被初始化为当前的系统时间,一个 32 位的时钟计数器,按秒钟计算, 可以记录 4294967296 秒,约合 136 年左右,作为一般应用,这已经是足够了的。
四、设计原理
1、STM32 RTC 时钟简介 STM32 的实时时钟(RTC)是一个独立的定时器。STM32 的 RTC 模块拥有一组 连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。修改计数器的 值可以重新设置系统当前的时间和日期。RTC 模块和时钟配置系统(RCC_BDCR 寄 存器)是在后备区域,即在系统复位或从待机模式唤醒后 RTC 的设置和时间维持 不变。但是在系统复位后,会自动禁止访问后备寄存器和 RTC,以防止对后备区 域(BKP)的意外写操作。所以在要设置时间之前,先要取消备份区域(BKP)写保 护。RTC 的简化框图,如图所示:
RTC 正常工作的一般配置步骤如下: (1)使能电源时钟和备份区域时钟。 访问 RTC 和备份区域就必须先使能电源时钟和备份区域时钟。 RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP, ENABLE); (2)取消备份区写保护。 PWR_BackupAccessCmd(ENABLE); //使能 RTC 和后备寄存器访问 (3)复位备份区域,开启外部低速振荡器。 BKP_DeInit();//复位备份区域 RCC_LSEConfig(RCC_LSE_ON);//开启外部低速振荡器
RTC 还有一个闹钟寄存器 RTC_ALR,用于产生闹钟。系统时间按 TR_CLK 周期 累加并与存储在 RTC_ALR 寄存器中的可编程时间相比较,如果 RTC_CR 控制寄存 器中设置了相应允许位,比较匹配时将产生一个闹钟中断。
RTC 内核完全独立于 RTC APB1 接口,而软件是通过 APB1 接口访问 RTC 的预 分频值、计数器值和闹钟值的。但是相关可读寄存器只在 RTC APB1 时钟进行重 新同步的 RTC 时钟的上升沿被更新,RTC 标志也是如此。这就意味着,如果 APB1 接口刚刚被开启之后,在第一次的内部寄存器更新之前,从 APB1 上读取的 RTC 寄存器值可能被破坏了(通常读到 0)。因此,若在读取 RTC 寄存器曾经被禁止 的 RTC APB1 接口,软件首先必须等待 RTC_CRL 寄存器的 RSF 位(寄存器同步标 志位,bit3)被硬件置 1。
任务堆栈,就是存储器中的连续存储空间。为了满足任务切换和响应中断时 保存 CPU 寄存器中的内容以及任务调用其他函数时的需要,每个任务都有自己的 堆栈。在创建任务的时候,任务堆栈是任务创建的一个重要入口参数。
任务控制块 OS_TCB,用来记录任务堆栈指针,任务当前状态以及任务优先 级等任务属性。UCOSII 的任何任务都是通过任务控制块(TCB)的东西来控制的, 一旦任务创建了,任务控制块 OS_TCB 就会被赋值。每个任务管理块有 3 个最重 要的参数:1,任务函数指针;2,任务堆栈指针;3,任务优先级。
2
任务优先级,每个任务都有唯一的一个优先级。在 UCOSII 中,使用 CPU 的 时候,任务就绪表中总是优先级最高的任务获得 CPU 使用权,只有高优先级的任 务让出 CPU 使用权(比如延时)时,低优先级的任务才能获得 CPU 使用权。UCOSII 不支持多个任务优先级相同,也就是每个任务的优先级必须不一样。
1
(4)选择 RTC 时钟,并使能。 RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //选择 LSE 作为 RTC 时钟。 RCC_RTCCLKCmd(ENABLE); //使能 RTC 时钟 (5)设置 RTC 的分频,以及配置 RTC 时钟。 RTC_EnterConfigMode();// 允许配置 RTC_ExitConfigMode();//退出配置模式,更新配置 设置 RTC 时钟分频数,库函数是: void RTC_SetPrescaler(uint32_t PrescalerValue); 设置秒中断允许,RTC 使能中断的函数是: void RTC_ITConfig(uint16_t RTC_IT, FunctionalState NewState); RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能 RTC 秒中断 库函数中设置 RTC 计数值的方法是: void RTC_SetCounter(uint32_t CounterValue) (6)更新配置,设置 RTC 中断分组。 RTC_ExitConfigMode();//退出配置模式,更新配置 往备份区域写用户数据的函数是: void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data); 往 BKP_DR1 写入 0x5050,方法是: BKP_WriteBackupRegister(BKP_DR1, 0X5050); 读取备份区域指定寄存器的用户数据的函数是: uint16_t BKP_ReadBackupRegister(uint16_t BKP_DR); (7)编写中断服务函数。 最后要编写中断服务函数,在秒钟中断产生的时候,读取当前的时间值,并 显示到 TFTLCD 模块上。 2、UCOSII 简介 UCOSII 是一个可以基于 ROM 运行的、可裁减的、抢占式、实时多任务内核, 具有高度可移植性,特别适合于微处理器和控制器,是和很多商业操作系统性能 相当的实时操作系统 (RTOS)。UCOSII 构思巧妙,结构简洁精练,可读性强,同 时又具备了实时操作系统的全部功能,体系结构如图所示:
嵌入式实时时间显示
一、设计任务
1、要求利用嵌入式操作系统与 STM32 硬件设计一个实时时间的显示。
二、设计要求
1、利用 UCOS 系统作为嵌入式操作系统; 2、使用 STM32 开发板作为开发平台; 3、利用 STM32 内部 RTC 资源作为时钟源。
三、设计仪器
1、PC 机一台; 2、战舰 STM32 开发板; 3、KEIL MDK 软件。
3
权让给别的任务而使任务进入等待状态;中断服务状态:一个正在运行的任务一 旦响应中断申请就会中止运行而去执行中断服务程序,这时任务的状态叫做中断 服务状态。
UCOSII 任务的 5 个状态转换关系如图所示:
在 UCOSII 中,与任务相关的几个函数: (1)建立任务函数 OSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INTU prio)。 (2)任务删除函数 UCOSII 提供的任务删除函数原型为:INT8U OSTaskDel(INT8U prio); (3)请求任务删除函数 UCOSII 提供的请求删除任务函数原型为: INT8U OSTaskDelReq(INT8U prio); (4)改变任务的优先级函数 UCOSII 提供的任务优先级修改函数原型为: INT8U OSTaskChangePrio(INT8U oldprio,INT8U newprio); (5)任务挂起函数 UCOSII 提供的任务挂起函数原型为:INT8U OSTaskSuspend(INT8U prio); (6)任务恢复函数 UCOSII 提供的任务恢复函数原型为:INT8U OSTaskResume(INT8U prio);
五、硬件设计
本次设计用到的硬件资源: 1、指示灯
2、TFTLCD 模块
3、内部 RTC 资源 指示灯用于提示系统正在运行,TFTLCD 用于显示运行时间、实时时间、日 期、星期、温度以及其它一些信息。
六、软件设计
主要利用 UCOS 创建两个任务,一个任务进行指示灯的提示,另一个任务 进行 TFTLCD 内容的显示。
相关主题