基于STM32的智能万年历设计方案
STM32 RTC万年历设计

static uint8_t num; //接收计数 uint8_t temp=0; //查询是否发生了空闲中断 if(__HAL_UART_GET_FLAG(usart->huart,UART_FLAG_IDLE) != RESET && \
注意,这部分代码要写在 用户代码区之间,闹钟初始化的部分可以保留在外面,不需要加 入到条件判断语句里面。 到这里,如果断电,在恢复以后时间就可以正常走下去了吗?当然…… 是不可以的!!! 现象是:重新上电后,时分秒的时间是可以继续延续下去,但是日期变成了 2000-01-01 , 为什么??这就需要去追一下初始化的代码了。
如果在日期更新的时候,我们没有重新备份日期到备份寄存器中,那么我们上电读回来的时 间就是我们第一次备份的时间,例如,今天我们备份了日期,然后把板子停电 3 天,三天后 再开启的话,读回来的时间就是今天备份的日期,并不是三天后的日期。
对于这个问题,我们就需要在日期更新和设置日期的时候,都需要把新的日期备份到寄存器 中,做法是在日期更新函数中增加备份代码:
我们需要去查看一下 HAL_RTC_Init(&hrtc)这个函数的代码是实现了什么功能。
在函数结尾,我们看到了上面这一段代码,当调用这个函数的时候就会把日期设置成 2000-01-01 了,找到了原因,我们要怎么改呢?这一段初始化代码什么是规避不了的,那 么我们可以在他执行之后重新把日期设置一下,思路还是利用备份寄存器。 我们可以在初始化时,把日期写到备份寄存中,完善一下之前写的条件初始化程序的内容, 增加日期备份。在这里我们备份的日期仅仅是初始化当时配置的时间,上电后读回来的也是 这个时间,不一定就是正确的!!
基于STM32的智能万年历课程设计说明书

课程设计说明书设计题目:基于STM32的智能万年历专业:电气工程及其自动化班级:设计人:课程设计任务书学院电气信息系专业电气工程及其自动化一、课程设计题目:基于STM32的智能万年历专题名称:最小应用系统二、课程设计主要参考资料(1)刘火良,杨森.STM32库开发实战指南[M].北京:机械工业出版社.2013.5(2)ADS7943中文参考资料[M/CD].(3)ILI9320控制器中文参考资料[M/CD].三、课程设计应解决主要问题(1)最小应用系统:包括MCU、复位、启动、晶振、电源等。
(2)日历的显示和设置;(3)万年历的算法和实现;(4)定时闹钟功能;(5)无线设置功能。
四、课程设计相关附件(如:图纸、软件等)(1)软件:Keil μVision4(2)开发平台:神州Ⅱ号STM32嵌入式技术开发板五、任务发出日期:课程设计完成日期:指导教师签字:系主任签字:指导教师对课程设计的评语指导教师(签章):日期:摘要单片机应用技术飞速发展,从导弹的导航装置,到飞机上各种仪表的控制,从计算机的网络通讯与数据传输,到工业自动化过程的实时控制和数据处理,以及生活中广泛使用的各种智能IC卡、电子宠物等,从大到国家防卫,小到日常生活,方方面面都离不开单片机。
单片机是集CPU,RAM,ROM,定时,计数和多种接口于一体的微控制器。
它体积小,成本低,功能强,广泛应用于智能产业和工业自动化上。
二十一世纪的今天科技与经济迅速发展,人们的生活节奏变得越来越快,生活水平越来越高,对于生活的品味和质量的要求也更高。
人们不再满足于只能提供简单计时功能的时钟,希望在能保证计时精确的基础上能多添加一些其他功能,诸如日历、定时等。
本文主要介绍了以STM32F103VCT6开发板为核心部件来设计的一款万年历,以其内部的RTC时钟模块作为时钟,用TFTLCD液晶显示器作为显示模块,时钟电路能准确提供24小时制时间、平年闰年的判断以及定时。
基于单片机的万年历设计

一、引言万年历是一种显示当前日期和时间的器件或软件。
随着科技的发展,电子产品普及率愈来愈高,基于单片机的万年历设计成为了一种非常受欢迎的设计方案。
本文将介绍一种基于单片机的万年历设计。
二、设计原理1.显示模块:采用液晶显示屏作为显示模块,可以显示日期、时间等信息。
2.时钟模块:基于RTC(实时时钟)模块,用于获取当前日期和时间。
3.按键模块:采用按键模块作为输入模块,用于设置日期和时间、切换显示模式等。
4.控制模块:基于单片机,用于控制各个模块的工作,并进行相关的计算和显示。
三、硬件设计1.单片机选择在本设计中,选择了一款常用的单片机,STM32F103C8T6、它具有低功耗、高性能的特点,并且具备丰富的外设接口,非常适合用来设计万年历。
2.RTC模块选择在本设计中,选择了一款常用的RTC模块,DS1302、它具有低功耗、稳定性好的特点,并且具备SPI接口,非常适合用来获取当前日期和时间。
3.液晶显示屏选择在本设计中,选择了一款常用的液晶显示屏,1602液晶显示屏。
它具有较大的屏幕尺寸、低功耗的特点,并且可以显示多行字符,非常适合用来显示日期、时间等信息。
4.按键模块选择在本设计中,选择了一款常用的按键模块,4x4按键模块。
它具备4行4列的按键布局,可以满足设置日期和时间、切换显示模式等功能的需求。
五、软件设计1.初始化设置在软件设计中,首先需要对各个硬件模块进行初始化设置。
2.获取当前日期和时间使用RTC模块获取当前日期和时间,并将其存储在相应的变量中。
3.显示日期和时间使用液晶显示屏将当前日期和时间显示出来。
4.设置日期和时间通过按键模块获取用户的输入,并将对应的日期和时间设置到RTC模块中。
5.切换显示模式通过按键模块获取用户的输入,并根据用户的选择切换不同的显示模式,例如切换到年模式、月模式、日模式等等。
六、总结通过以上的设计,基于单片机的万年历完成了日期和时间的获取、显示和设置等功能。
(完整word版)基于STM32的万年历设计

基于STM32的万年历设计班级:姓名:学号:成绩:电子通信工程系题目:基于STM32的万年历设计前言:随着科技的快速发展,时间的流逝,至从观太阳、摆钟到现在电子钟,人类不断研究,不断创新纪录。
美国DALLAS公司推出的具有涓细电流充电能的低功耗实时时钟电路DS12C887。
它可以对年、月、日、周日、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS12C887的使用寿命长,误差小。
对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、周日、时、分、秒和温度等信息,还具有时间校准等功能。
该电路采用AT89S52单片机作为核心,采用数字式温度传感器DS18B20提取外界温度,功耗小,能在3V的低压工作,电压可选用3~5V电压供电。
进入新世纪LCD显示屏的技术和产业都取得了长足的发展,作为重要的现代信息发布媒体之一,LCD显示屏在证券交易、金融、交通、体育、广告等领域被广泛的应用。
伴随社会信息化进程的推进,LCD显示屏技术也在不断的推陈出新,应用领域愈加广阔。
基于STM32的LCD显示可以更好的满足各种需求,也更便于操作和实现。
现基于STM32在液晶显示屏幕上显示文本及图形。
目前,显示技术和显示工业的发展迅速。
显示技术是传递视觉的信息技术。
液晶显示器件LCD 是当今最有发展前途的一种平板显示器件,它具有很多独到的优异特性。
它具有显示信息多、易于多彩化、体积小、重量轻、功耗低、寿命长、价格低、无辐射、无污染、接口控制方便等优点。
截至目前,我国在液晶显示取得较大进步,我国LCD产业已经走过了近30年的历程.经历几次大的投资浪潮之后,我国内地已经成为世界最大的TN-LCD(扭曲液晶显示器)生产基地和主要的STN-LCD(超扭曲液晶显示器)生产基地,并且从2003年开始,涉足TFT-LCD(薄膜晶体管液晶显示器)领域.本课题设计采用STM32F103VE开发板,实现在LCD显示屏上显示由按键可操控的万年历功能。
STM32实现万年历..

STM32学习笔记一竹天笑实现的功能:1、日历功能。
2、数字和模拟时钟功能。
图1(为LCD截屏保存在SD卡中的图像)最终界面如下,但还存在不少漏洞。
1、没有更改时间的设置;2、只有节气显示没有节假日显示3、背景不是用uCGUI画的,是在PS中画好然后存在SD卡中,然后显示的BMP 格式图像。
要点分析:1、STM32自带了RTC时钟计数器,从0开始计数到232。
每一个计数代表秒计数,每六十个计数代表分计数,以此类推。
24(小时)*60(分钟)*60(秒钟)=86400代表一天的计数时间。
假设当前计数为count,count/86400得到计数的天数,根据这个得到年月日。
Count%86400得到时分秒。
2、一些根据1中得到的年月日时分秒,进行计算的程序有:阳历转阴历,闰年判断,节气判断,星期几计算,当前月有多少天等等。
3、模拟时钟的绘制:时钟指针运动算法、屏幕重绘方法、RTC消息、画笔/画刷等。
指针运动算法和屏幕重绘方法是本程序主要难点所在。
(以下参照百度文库之模拟时钟)不论何种指针,每次转动均以π/30弧度(一秒的角度)为基本单位,且都以表盘中心为转动圆心。
计算指针端点(x, y)的公式如下:x =圆心x坐标+ 指针长度* cos (指针方向角)y =圆心y坐标+ 指针长度* sin (指针方向角)注意,指针长度是指自圆心至指针一个端点的长度(是整个指针的一部分),由于指针可能跨越圆心,因此一个指针需要计算两个端点。
由于屏幕的重绘1秒钟一次,如果采用全屏删除式重绘则闪烁十分明显,显示效果不佳。
本程序采用非删除式重绘,假定指针将要移动一格,则先采用背景色(这里是白色)重绘原来指针以删除原来位置的指针,再采用指针的颜色在当前位置绘制指针(如果指针没有动,则直接绘制指针,此句在程序中被我删除,具体原因,为数据截断导致一些误差)。
另外,秒表为RTC一秒钟定时计数。
程序分析:uCGUI+uCOS,一共三个任务:主处理任务、触摸屏任务、秒更新任务。
基于STM32单片机的万年历设计毕业设计论文

万年历是一种可以显示年、月、日、星期的电子设备,广泛应用于日常生活和办公场所。
本文将介绍一个基于STM32单片机的万年历的设计思路和实现过程。
首先,我们需要明确设计目标。
在这个项目中,我们的目标是使用STM32单片机开发一个功能齐全、易于操作的万年历。
具体地说,这个万年历应该能够显示当前的年、月、日和星期,并且能够进行日期的加减操作,同时应该具备一些辅助功能如闹钟设置、倒计时等。
接下来,我们需要进行硬件设计。
首先需要选择适当的显示屏,比如常见的LCD或OLED屏幕。
然后,我们需要选择合适的按键和外部触发器,用于用户的交互输入。
同时,还需要添加一些必要的接口,如USB接口用于数据传输和维护。
在软件设计方面,我们需要定义合适的数据结构来存储日期、时间、闹钟等信息。
同时,需要编写相应的程序来实现日期的显示和更新、日期的加减、闹钟的设置等功能。
在实现倒计时功能时,我们可以使用定时器中断来实现精确的计时。
此外,为了提高用户体验,我们可以添加一些额外的功能。
比如,我们可以为万年历设计一个简洁美观的用户界面,考虑使用图形库绘制用户界面元素。
同时,可以添加一些实用的功能如温湿度监测、天气预报等。
最后,在整个开发流程结束后,我们需要进行集成测试和调试,确保万年历的各项功能正常运行。
并且,我们还可以考虑为万年历添加一些优化和改进措施,如增加存储容量、优化节能技术等。
综上所述,基于STM32单片机的万年历设计主要涉及硬件设计和软件设计两个方面。
通过精心的设计和合理的实现,我们可以开发出一款功能丰富、易于使用的万年历产品,满足用户的各种需求。
使用STM32的RTC制作万年历

使用STM32的RTC制作万年历(2013-09-14 16:39:34)转载▼标签:it注意:红色代码部分,如果不加这两句,修改时间一直卡死在RTC_WaitForLastTask()#include "stm32f10x.h"#include "STM32_RTC.h"#define BKP_TIME_FLAG BKP_DR1#define BKP_TIME_YEAR BKP_DR2#define BKP_TIME_MONTH BKP_DR3#define BKP_TIME_DAY BKP_DR4#define BKP_TIME_DATE BKP_DR5u32 Month_Days_Accu_C[13] = {0,31,59,90,120,151,181,212,243,273,304,334,365}; u32 Month_Days_Accu_L[13] = {0,31,60,91,121,152,182,213,244,274,305,335,366}; #define SecsPerDay (3600*24)extern T_STRUCT Real_Time;//实时时间值void RTC_Configuration(void){RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);PWR_BackupAccessCmd(ENABLE);BKP_DeInit();RCC_LSEConfig(RCC_LSE_ON);while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET){}RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);RCC_RTCCLKCmd(ENABLE);RTC_WaitForSynchro();RTC_WaitForLastTask();RTC_ITConfig(RTC_IT_SEC, ENABLE);RTC_WaitForLastTask();RTC_SetPrescaler(32767);RTC_WaitForLastTask();}void RTC_init(void){if(BKP_ReadBackupRegister(BKP_TIME_FLAG) != 0xA5A5){RTC_Configuration();Real_Time.year = 2013;Real_Time.month = 1;Real_Time.day = 1;Real_Time.hour = 12;Real_Time.minute = 0;Real_Time.second = 0;Real_Time.date = 1;SetRTCTime(&Real_Time);BKP_WriteBackupRegister(BKP_TIME_FLAG, 0xA5A5);}else{if(RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET){//电源复位}else if(RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET){//External Reset occurred}RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); PWR_BackupAccessCmd(ENABLE);BKP_TamperPinCmd(DISABLE);BKP_RTCOutputConfig(BKP_RTCOutputSource_CalibClock);RTC2Time();}RTC_WaitForSynchro();RCC_ClearFlag(); //清除RCC重启标志}void GetRTCTime(T_STRUCT* time){RTC_ITConfig(RTC_IT_SEC, DISABLE); //关闭秒中断RTC_WaitForLastTask();time->year=Real_Time.year;time->month=Real_Time.month;time->day=Real_Time.day;time->hour=Real_Time.hour;time->minute=Real_Time.minute;time->second=Real_Time.second;time->date=Real_Time.date;RTC_WaitForLastTask();RTC_ITConfig(RTC_IT_SEC, ENABLE); //打开秒中断}const u8 TAB_DATE[12]={6,2,2,5,0,3,5,1,4,6,2,4,};u8 GetDate(T_STRUCT* time){return( (time->year + time->year/4 - ( (time->month<3)&&(time->year%4==0) ) +TAB_DATE[time->month-1] + time->day )%7);}const u8 Month2Day_Tab[12]={31,28,31,30,31,30,31,31,30,31,30,31} ;void RTC2Time(void){u32 count;u8 tmp,change=0;Real_Time.year=BKP_ReadBackupRegister(BKP_TIME_YEAR);//年值Real_Time.month=BKP_ReadBackupRegister(BKP_TIME_MONTH);//月值Real_Time.day=BKP_ReadBackupRegister(BKP_TIME_DAY);//日值Real_Time.date=BKP_ReadBackupRegister(BKP_TIME_DATE);//星期值RTC_ITConfig(RTC_IT_SEC, DISABLE); //为了避免代码重入引起的问题,这里吧RTC秒中断屏蔽了count=RTC_GetCounter();//计算新的年月日while (count>=0x0001517f) //上次关电到本次跨越了一天以上{change=1;count-=0x0001517f;//星期自加if ((++Real_Time.date)>=8)Real_Time.date=1;//如果是2月,计算闰年(不需要考虑2099以后的400年一非润) if (Real_Time.month==2){if (Real_Time.year%4)tmp=28;elsetmp=29;}else{tmp=Month2Day_Tab[Real_Time.month-1];}if ((++Real_Time.day)>tmp){Real_Time.day=1;if ((++Real_Time.month)>12){Real_Time.month=1;if ((++Real_Time.year)>=100){Real_Time.year=0;}}}//如果跨越了一天,则计算后,要存回寄存器内if (change){RTC_SetCounter(count);BKP_WriteBackupRegister(BKP_TIME_DATE,Real_Time.date);BKP_WriteBackupRegister(BKP_TIME_DAY,Real_Time.day);BKP_WriteBackupRegister(BKP_TIME_MONTH,Real_Time.month); BKP_WriteBackupRegister(BKP_TIME_YEAR,Real_Time.year);}}//计算新的时分秒Real_Time.hour=count/3600;Real_Time.minute=(count600)/60;Real_Time.second=(count600)`;//重新打开RTC中断// Check if the Power On Reset flag is setRCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);PWR_BackupAccessCmd(ENABLE);RTC_WaitForLastTask();RTC_ITConfig(RTC_IT_SEC, ENABLE);}void SetRTCTime(T_STRUCT* time){u32 count;RTC_ITConfig(RTC_IT_SEC, DISABLE); //关闭秒中断RTC_WaitForLastTask();//付时间值到Real_Time上Real_Time.year=time->year;Real_Time.month=time->month;Real_Time.day=time->day;Real_Time.hour=time->hour;Real_Time.minute=time->minute;Real_Time.second=time->second;//计算星期time->date=Real_Time.date=GetDate(time);//把新的年月日存到掉电寄存器上BKP_WriteBackupRegister(BKP_TIME_DATE,Real_Time.date);// RTC_WaitForLastTask();BKP_WriteBackupRegister(BKP_TIME_DAY,Real_Time.day);// RTC_WaitForLastTask();BKP_WriteBackupRegister(BKP_TIME_MONTH,Real_Time.month); // RTC_WaitForLastTask();BKP_WriteBackupRegister(BKP_TIME_YEAR,Real_Time.year);// RTC_WaitForLastTask();//计算新的RTC count值count=Real_Time.hour*3600+Real_Time.minute*60+Real_Time.second; RTC_WaitForLastTask();RTC_SetCounter(count);// Check if the Power On Reset flag is set//注意红色代码部分,如果不加这两句,修改时间一直卡死在 RTC_WaitForLastTask()RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);PWR_BackupAccessCmd(ENABLE);RTC_WaitForLastTask();RTC_ITConfig(RTC_IT_SEC, ENABLE); //打开秒中断}void RTCTick(void){u8 tmp;if ((++Real_Time.second)>59){Real_Time.second=0;if ((++Real_Time.minute)>59){Real_Time.minute=0;if ((++Real_Time.hour)>23){Real_Time.hour=0;//星期自加if ((++Real_Time.date)>=8)Real_Time.date=1;//--存储新的星期BKP_WriteBackupRegister(BKP_DR5,Real_Time.date);//如果是2月,计算闰年(不需要考虑2099以后的400年一非润)if (Real_Time.month==2){if (Real_Time.year%4)tmp=28;elsetmp=29;}else{tmp=Month2Day_Tab[Real_Time.month-1];}if ((++Real_Time.day)>tmp){Real_Time.day=1;if ((++Real_Time.month)>12){Real_Time.month=1;if ((++Real_Time.year)>99){Real_Time.year=0;}//--储存新的年BKP_WriteBackupRegister(BKP_DR2,Real_Time.year); }//--储存新的月BKP_WriteBackupRegister(BKP_DR3,Real_Time.month); }//--储存新的日BKP_WriteBackupRegister(BKP_DR4,Real_Time.day);}}}}。
「基于单片机的多功能电子万年历设计」

基于单片机的多功能电子万年历设计引言在现代社会中,计算机及其应用已经成为我们生活中不可或缺的一部分。
计算机科技的发展不仅使我们的生活更加便捷,还为我们提供了更多的娱乐和功能选择。
在这样一个科技高度发达的时代,电子万年历作为一种基于单片机技术的应用产品,正逐渐走进人们的生活。
而本文将着重对基于单片机的多功能电子万年历进行设计与实现。
一、设计目标本次设计主要是基于单片机的多功能电子万年历。
设计目标包括:1.显示日期、时间和星期几的功能。
2.具备日历计算功能,能够计算今天是该年的第几天,该周的第几天等信息。
3.具备闹钟和定时器功能。
二、设计思路基于单片机的多功能电子万年历的设计理念是通过单片机与LCD显示屏、温度传感器、按键等外设组合实现多种功能。
具体实现步骤如下:1. 使用单片机和RTC(Real-Time Clock)芯片实现时间的获取和处理。
RTC芯片可以提供准确的时钟信息,单片机可以通过与RTC芯片的通信来读取时钟信息,并进行相应的处理。
2.使用单片机与LCD显示屏进行通信,将获取的时间、日期和星期信息显示在LCD显示屏上。
3.设计按键接口,通过按键的触发实现切换功能或进行相应操作。
例如,通过按键的触发可以实现日期、时间的调整,以及闹钟和定时器的设置等。
4.使用单片机和温度传感器实现温度测量功能。
通过温度传感器读取当前温度信息,并将其显示在LCD屏幕上。
5.使用定时器功能实现闹钟和定时器的功能。
单片机可以通过定时器来控制闹钟和定时器的开启与关闭,并通过LCD屏幕上的显示提醒用户。
三、电路设计本次设计中需要使用的元器件主要包括单片机、RTC芯片、LCD显示屏、温度传感器和按键。
其中,单片机为本次设计的核心控制器,RTC芯片用于提供准确的时钟信息,LCD显示屏用于显示时间、日期和其他信息,温度传感器用于测量当前温度信息,按键用于触发相应的操作。
四、软件设计本次设计中需要编写相应的软件程序,用于读取RTC芯片提供的时钟信息,并将其显示在LCD屏幕上。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于STM32的智能万年历设计方案1.课程设计任务1.1 课程设计目的(1)学习万年历的原理,学会定时器、触摸屏在万年历中的应用。
(2)通过万年历的制作使学生熟练掌握所学的相关知识容,并培养学生工程设计的一般方法和技巧。
1.2 设计要求:独立思考、共同合作、保质保量、按时完成。
1.3 技术要求:(1)系统组成系统选用STM32F103单片机为微处理器,使用开发板上具有的按键、指示灯、触摸屏和串口等实现万年历的功能。
(2)实现功能:1)日历、时间的调整,通过按键切换实现对年月日时分秒的调整控制,可以设置每一部分的初始值。
2)具备闰年的自动调整功能3)具有定时闹钟功能:通过按键/触摸屏设置定时时间。
定时时间到,蜂鸣器发出鸣叫声,维持5S。
4)上位机功能:可以把单片机的时间数据通过串口或者USB传送至上位机。
5)无线设置功能:通过远程设置万年历。
(3)模块组成:STM32 单片机最小应用系统;设置显示模块;闹钟模块;时间运行模块等;1.4 解决的主要问题:(1)最小应用系统设计:设计STM32的最小应用系统,包括MCU、复位、启动、晶振、电源等。
(2)日历的显示和设置;(3)万年历的算法和实现;(4)定时闹钟功能;(5)无线设置功能。
1.5 两周时间安排(1)第一周:星期一:布置设计任务,收集相关资料。
星期二:确定设计方案星期三:软、硬件的总体设计星期四、五、六、日:上机调试(2)第二周星期一、二、三:上机调试星期四:完成设计报告。
星期五:17:00之前上交课程设计报告。
2 总体方案设计2.1 整体方案设计2.2 模块工作原理2.2.1 最小应用系统模块最小应用系统包括MCU和电源、复位、晶振、启动等,该系统可以接收数据传给上位机,通过上位机将数据传输到显示屏上显示数据,也可以通过改变数据让其调整显示屏上的数据。
另外它能使蜂鸣器发声。
2.2.2 基础配置模块基础配置模块实现对SysClock、RCC、GPIO、EXTI、NVIC、Timer、USART 等功能模块进行基础配置,设置其输入输出方式、速度及其它专属配置,并使能需要的管脚及外设,设置中断。
2.2.3 时间运行模块时间运行模块是用来对时间运行的算法进行编程,通过算法编程实现对年、月、日、时、分、秒的处理,实现秒满60清零并进1,分满60清零并进1,时满24清零并进1,日满28或29或30或31清零并进1,月满12清零并进1的功能。
2.2.4 触摸屏显示模块触摸屏显示模块使用TFT-LCD即薄膜晶体管液晶显示器,使用TFTLCD模块驱动芯片中的ILI9320芯片,实现触摸屏的显示。
TFT-LCD与无源TN-LCD、STN-LCD的简单矩阵不同,它在液晶显示屏的每一个像素上都设置有一个薄膜晶体管(TFT),可以有效地克服非选通时的串扰,使显示液晶屏的静态特性与扫描线数无关,因此大大提高了图像质量。
TFT-LCD也被叫做真彩液晶显示器。
2.2.5 触摸屏触摸模块触摸屏的主要部分是一块与显示器表面非常配合的电阻薄膜屏,当手指触摸屏幕时,两层导电层在触摸点位置就有了接触,电阻发生变化,在X和Y两个方向上产生信号,然后送到触摸屏控制器。
控制器侦测到这一接触并计算出X,Y的位置,再根据获得的位置模拟鼠标的方式运行。
2.2.6 闹钟设置模块定时闹钟模块是利用Timer函数进行操作,通过设置闹钟时间,倒计时使其到达指定时间触发蜂鸣器,从而实现闹钟提示的功能。
2.3 硬件模块简介在智能万年历项目中,我们采用的硬件主要是基于STM32F103VCT6的神州二号开发板,它的主要性能如下表所示:2.3.1 最小应用系统最小应用系统是完成此项目所有功能的基础,它主要包含MCU和电源、复位、晶振、启动等,我们通过程序使能这些硬件,让它完成相应的功能。
MCU:微控制单元,是把中央处理器的频率与规格做适当缩减,并将存、计数器、USB、A/D转换、UART、PLC、DMA等周边接口, LCD驱动电路都整合在单一芯片上,形成芯片级的计算机,为不同的应用场合做不同组合控制。
复位电路:就是利用它把电路恢复到起始状态。
就像计算器的清零按钮的作用一样,以便回到原始状态,重新进行计算。
和计算器清零按钮有所不同的是,复位电路启动的手段有所不同。
晶振电路:驱动整个系统中的各个时钟进行工作。
启动电路:启动整个系统。
电源:给整个系统供电。
2.3.2 TFTLCD显示屏TFT(Thin Film Transistor)即薄膜场效应晶体管。
所谓薄膜晶体管,是指液晶显示器上的每一液晶像素点都是由集成在其后的薄膜晶体管来驱动。
从而可以做到高速度、高亮度、高对比度显示屏幕信息。
3 硬件设计3.1 stm32硬件系统原理图我们组选用神州二号开发板来完成我们的任务目标,它是基于STM32F103VCT6开发的,面向企业和广大爱好者,开发板功能强大,外围资源丰富,例程丰富,如下图所示:此章主要介绍最小应用系统(MCU、复位、启动、晶振、电源等)和此设计相关硬件。
3.1.1 MCU神州二号STM32开发板选择的是STM32F103VCT6作为MCU,该芯片是STM32F103系列里面配置非常强大的了,它拥有的资源包括:48KB RAM、256KB FLASH、2个基本定时器、4个通用定时器、2个高级定时器、3个SPI、2个IIC、5个串口、1个USB、1个CAN、3个ADC、1个DAC、1个SDIO接口、以及80个通用IO口。
神州二号开发板选用的是外设资源和管脚资源最丰富的100脚LQFP封装的STM32F103VCT6芯片,充分满足企业和广大爱好者的评估开发需求。
所以我们选择了它作为我们的主芯片。
MCU部分原理图如下图所示3.1.2 复位电路图中所示是开发板板载的复位按键(RESET),用于复位STM32,还具有复位液晶显示屏的功能,因为液晶模块的复位引脚和STM32的复位引脚是连接在一起的,当按下该键的时候,STM32和液晶一并被复位。
因为STM32是低电平复位的,所以我们设计的电路也是低电平复位的,这里的R和C构成了上电复位电路。
同时,开发板把TFT_LCD的复位引脚也接在RESET上,这样这个复位按钮不仅可以用来复位MCU,还可以复位LCD。
3.1.3 启动电路在STM32F103VCT6里,可以通过BOOT[1:0]引脚选择三种不同启动模式。
启动模式如下:在系统复位后,SYSCLK的第4个上升沿,BOOT引脚的值将被锁存。
用户可以通过设置BOOT1和BOOT0引脚的状态,来选择在复位后的启动模式。
在从待机模式退出时,BOOT引脚的值将被被重新锁存,因此,在待机模式下BOOT引脚应保持为需要的启动配置。
在启动延迟之后,CPU从地址0x0000 0000获取堆栈顶的地址,并从启动存储器的0x0000 0004指示的地址开始执行代码。
因为固定的存储器映像,代码区始终从地址0x0000 0000开始(通过ICode和DCode总线访问),而数据区(SRAM)始终从地址0x2000 0000开始(通过系统总线访问)。
Cortex-M3的CPU始终从ICode总线获取复位向量,即启动仅适合于从代码区开始(典型地从Flash 启动)。
STM32F103VCT6微控制器实现了一个特殊的机制,系统可以不仅仅从Flash存储器或系统存储器启动,还可以从置SRAM启动。
3.1.4 晶振电路STM32F103部已经包含了8MHz高速部RC震荡电路,但是其精度不是很高,为此,我们在外部增加了25MHz的晶振电路,为系统的可靠动作提供时序基准。
STM32F103部已经包含了40KHZ低速部RC震荡电路LSE,但是其精度不是很高,为此我们在外设部分增加了32.768KHZ的晶振电路,可以用于驱动独立看门狗和通过程序选择驱动RTC实时时钟。
晶振电路图如下:3.1.5 电源电路VDDA与VREF是STM32处理器数字|模拟转换(ADC)电路需要使用到的模拟参考电源和模拟电源输入。
其相关管脚定义如下:在神州二号开发板上,VREF和VDDA电源相关电路如下图所示,为保障其稳定性需要隔离并增强独立的滤波储能电容。
3.1.6 蜂鸣器电路神州二号STM32开发板板载了一个有源蜂鸣器,其原理图如图所示:有源蜂鸣器是指自带了震荡电路的蜂鸣器,这种蜂鸣器一接上电就会自己震荡发声。
而如果是无源蜂鸣器,则需要外加一定频率(2~5KHz)的驱动信号才会发声。
这里我们选择使用有源蜂鸣器,方便大家使用。
图中Q1是用来扩流,R60则是一个下拉电阻,避免MCU复位的时候,蜂鸣器可能发声的现象。
BEEP信号直接连接在MCU的PB8上面,PB8可以做PWM输出,所以大家如果想玩高级点(如:控制蜂鸣器“唱歌”),就可以使用PWM来控制蜂鸣器。
3.1.7 实时时钟电路神州二号开发的STM32处理器部带有RTC实时时钟,使用我们的代码可以实现年月日时分秒及星期等计算与输出功能。
部的RTC实时时钟在系统正常运行时使用系统的3.3V电源,而在系统断电时则电池供电保证时间信息持续不丢失。
其供电VBAT采用CR1220纽扣电池,相关电路如下:3.2 触摸屏模块电路设计3.2.1 TFTLCD简介TFT-LCD即薄膜晶体管液晶显示器。
其英文全称为:Thin Film Transistor-Liquid Crystal Display。
TFT-LCD与无源TN-LCD、STN-LCD的简单矩阵不同,它在液晶显示屏的每一个像素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性与扫描线数无关,因此大大提高了图像质量。
TFT-LCD也被叫做真彩液晶显示器。
模块原理图如下图所示:其中 CS:TFTLCD片选信号。
WR:向TFTLCD写入数据。
RD:从TFTLCD读取数据。
D[15:0]:16位双向数据线。
RST:硬复位TFTLCD。
RS:命令/数据标志(0,读写命令;1,读写数据)。
需要说明的是,TFTLCD模块的RST信号线是直接接到STM32的复位脚上,并不由软件控制,这样可以省下来一个IO口。
另外我们还需要一个背光控制线来控制TFTLCD的背光。
所以,我们总共需要的IO口数目为21个。
3.2.2 显示设置神州二号开发板提供的TFTLCD模块,其驱动芯片有很多种类型,我们这里用ILI9320控制器。
ILI9320液晶控制器自带显存,其显存总大小为172820(240*320*18/8),即18位模式(26万色)下的显存量。
模块的16位数据线与显存的对应关系为565方式,如图所示:最低5位代表蓝色,中间6位为绿色,最高5位为红色。
数值越大,表示该颜色越深。
下表是ILI9320的几个重要命令:其中,R32,R33是设置GRAM的行地址和列地址。