基于ARM的万年历.doc

上传人:土8路 文档编号:11063829 上传时间:2021-06-24 格式:DOC 页数:16 大小:219KB
返回 下载 相关 举报
基于ARM的万年历.doc_第1页
第1页 / 共16页
基于ARM的万年历.doc_第2页
第2页 / 共16页
基于ARM的万年历.doc_第3页
第3页 / 共16页
基于ARM的万年历.doc_第4页
第4页 / 共16页
基于ARM的万年历.doc_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《基于ARM的万年历.doc》由会员分享,可在线阅读,更多相关《基于ARM的万年历.doc(16页珍藏版)》请在三一文库上搜索。

1、嵌入式系统课程设计报告 基于ARM的万年历系统 院 系: 机电学院 学生姓名: 专 业: 应用电子技术教育 班 级: 指导教师: 田丰庆 付广春 完成时间: 2013年3月29日 目录1 引言12 STM32芯片RTC时钟介绍13 程序运行结果23.1 STM32管脚介绍23.2 STM32复位电路和时钟设计24 总体设计框图35 程序运行结果图示46 程序流程图57 总结体会58 参考文献6附录一:总体电路图7附录二:源程序8基于ARM的万年历系统摘要:本设计选择STM32为核心控制元件,设计了用RTC定时器实现万年历的控制与设计。程序使用C语言进行编程,能动态显示当前时间,包括年、月、日、

2、时、分、秒,并且用串口助手显示。关键词:STM32 ARM 时钟 1 引言 随着科技的发展,嵌入式系统广泛应用于工业控制和商业管理领域,在多媒体手机、袖珍电脑,掌上电脑,车载导航器等方面的应用,更是极大地促进了嵌入式技术深入到生活和工作各个方面。嵌入式系统主要由嵌入式处理器、相关支撑硬件及嵌入式软件系统组成。本文介绍基于STM32F103R6T6的嵌入式微处理器的万年历设计,并且在液晶上显示。2 STM32芯片RTC时钟介绍STM32的实时时钟(RTC)是一个独立的定时器。RTC模块拥有一组连续计数的计数器,在相应软件配置下,可以提供时钟日历的功能,修改计数器的值可以重新设置系统当前的时间和日

3、期。STM32F10x系列微控制器片上内置的RTC模块,主要特性如下:(1) 可编程的预分频系数,分频系数最高位220。(2) 32位的可编程计数器,可用于长程时间段的测量。(3) 两个单独的时钟:用于APB1接口的PLCK1和RTC时钟(此时RTC时钟的频率必须小于PCLK1时钟的四分之一以上)。(4) 可以选择一下三种RTC的时钟源: HSE(high speed external)时钟除以128,即高速外部时钟,接石英/陶瓷谐振器,或者接外部时钟源,频率范围为416MHz。 LSI(low speed internal)振荡器时钟,即低速内部时钟,频率为40kHz。 LSE(low sp

4、eed external)振荡器时钟,即低速外部时钟,接石英晶体,频率为32.768kHz。(5)2钟独立的复位类型: APB1接口由系统复位。 RTC核(预分频器、闹钟、计数器和分频器)只能由备份域复位。(6)3个专门的可屏蔽中断:闹钟中断,用来产生一个软件可编程的闹钟中断。秒中断,用来产生一个可编程的周期性中断信号(最长可达1s)。溢出中断,检测内部可编程计数器溢出并回转为0的状态 (7)STM32侵入检测: TPAL=0时启动侵入检测TAMPER引脚前已经为高电平,一旦启动检测功能,则会产生一个额外的侵入事件。 TPAL=1时启动侵入引脚TAMPER前该引脚为低电平,一旦启动检测功能,则

5、会产生一个额外的侵入事件。 检测TAMPER上的点品变化,就会把备份寄存器的内容清空,以保护重要的数据不被非法盗取。3 STM32最小系统电路3.1 STM32芯片管脚介绍STM32F103R6T6管脚示意图,如图1所示。图1 STM32F103R6T6管脚示意图3.2 STM32复位和时钟电路设计 此电路主要是复位电路和时钟电路两部分,其中复位电路采用按键手动复位和上电自动复位组合,电路如图2(右)所示:其中7脚为STM32的复位端。时钟电路如图2(左)所示:晶振采用的是8MHz和32.786KHz,8MKz分别接STM32的5脚和6脚,32.786KHz分别接STM32的3脚和4脚。图2

6、STM32复位和时钟电路4 总体设计框图 本电路主要由3大部分电路组成:ARM最小系统电路、时钟显示电路和闹钟警报电路(本设计用LED灯指示)。其中ATM最小系统主要由复位电路和时钟电路组成。在该设计中,闹钟提醒由LED灯代替,当闹钟时间到的话,LED灯亮,延时设定的时间后自动关闭。总体设计方框图,如图3所示。STM32 复位电路串口显示 输入时间 时钟电路图3总体设计方框图5 程序运行结果如图4所示图4 程序运行结果6 程序流程图 程序流程图,如图5所示。 图5 程序主流程和时间程序流程图7 总结与体会通过这次万年历的设计,使我对ARM有了更深的理解。刚开始拿到题提目,我先是查找相关资料,从

7、图书馆和网上找到相关的课题,参考借鉴别人的设计,从而理清我们设计的思路。此次作业设计大致可以分为两部分,电路图部分和程序编程部分,其中最有难度的是程序的编写与调试。在编写程序的过程中,我遇到了各种各样的问题,工程之间的结合,对于其中的错误怎样解决,需要配置什么,更改哪里等等。对于ARM我学的很浅,编程遇到问题不知道如何解决,我知道这个是我的弱点,但在这两周的课程设计中,用Keil uVision4在ARM开发板上进行程序调试,遇到问题解决问题,在这个过程中我收获了不少。 参考文献1 彭刚、秦志强等.基于ARM Cortex-M3的STM32系列嵌入式微控制器应用实践M.北京:电子工业出版社2

8、李宁.基于MDK的STM32处理器开发应用M.北京航空航天大学出版社,2008.3 王永红、徐炜、赫立平.STM32系列ARM Cortex-M3微控制器原理与实践M.北京航空航天大学出版社,2008.4 ARM Limited.Cortex-M3 Technical Reference Manual(r2p0). ARM DDI 0037G 2008.5 stm32f10x.h#include stdio.h #include calendar.h#include date.h_IO uint32_t TimeDisplay = 0;void RCC_Configuration(void)

9、;void NVIC_Configuration(void);void GPIO_Configuration(void);void USART_Configuration(void);int fputc(int ch, FILE *f);void RTC_Configuration(void);void Time_Regulate(struct rtc_time *tm);void Time_Adjust(void);void Time_Display(uint32_t TimeVar);void Time_Show(void);u8 USART_Scanf(u32 value);#defin

10、e RTCClockSource_LSEu8 const *WEEK_STR = 日, 一, 二, 三, 四, 五, 六;u8 const *zodiac_sign = 猪, 鼠, 牛, 虎, 兔, 龙, 蛇, 马, 羊, 猴, 鸡, 狗;struct rtc_time systmtime;int main() RCC_Configuration(); NVIC_Configuration(); GPIO_Configuration(); USART_Configuration(); if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5) printf(r

11、nn RTC not yet configured.); RTC_Configuration();printf(rn RTC configured.); Time_Adjust();BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);elseif (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET) printf(rnn Power On Reset occurred.);else if (RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET) printf(rnn External Rese

12、t occurred.); printf(rn No need to configure RTC.);RTC_WaitForSynchro();RTC_ITConfig(RTC_IT_SEC, ENABLE);RTC_WaitForLastTask(); #ifdef RTCClockOutput_Enable RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); PWR_BackupAccessCmd(ENABLE); BKP_TamperPinCmd(DISABLE); BKP_RTCOutputC

13、onfig(BKP_RTCOutputSource_CalibClock);#endif RCC_ClearFlag(); Time_Show();void RCC_Configuration()SystemInit();RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);void NVIC_Configuration() NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); N

14、VIC_InitStructure.NVIC_IRQChannel = RTC_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);void GPIO_Configuration() GPIO_InitTypeDef GPIO_InitStructure; GPI

15、O_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_Init

16、Structure);void USART_Configuration() USART_InitTypeDef USART_InitStructure;USART_InitStructure.USART_BaudRate = 115200;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_Parity = USART_Parity_No ;USART_InitStruc

17、ture.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_Init(USART1, &USART_InitStructure); USART_Cmd(USART1, ENABLE);int fputc(int ch, FILE *f) USART_SendData(USART1, (unsigned char) ch); while (!(USART1-SR & USART_FLAG_T

18、XE); return (ch);void RTC_Configuration() RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); PWR_BackupAccessCmd(ENABLE); BKP_DeInit(); #ifdef RTCClockSource_LSI RCC_LSICmd(ENABLE); while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY)=RESET) RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI); #elif de

19、fined RTCClockSource_LSE RCC_LSEConfig(RCC_LSE_ON); while(RCC_GetFlagStatus(RCC_FLAG_LSERDY)=RESET) RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); #endif RCC_RTCCLKCmd(ENABLE); #ifdef RTCClockOutput_Enable BKP_TamperPinCmd(DISABLE); BKP_RTCCalibrationClockOutputCmd(ENABLE); #endif RTC_WaitForSynchro(); RTC

20、_WaitForLastTask(); RTC_ITConfig(RTC_IT_SEC, ENABLE); RTC_WaitForLastTask(); #ifdef RTCClockSource_LSI RTC_SetPrescaler(31999); #elif defined RTCClockSource_LSE RTC_SetPrescaler(32767); #endif RTC_WaitForLastTask();void Time_Regulate(struct rtc_time *tm) u32 Tmp_YY = 0xFF, Tmp_MM = 0xFF, Tmp_DD = 0x

21、FF, Tmp_HH = 0xFF, Tmp_MI = 0xFF, Tmp_SS = 0xFF; printf(rn=Time Settings=); printf(rn 请输入年份(Please Set Years): 20); while (Tmp_YY = 0xFF) Tmp_YY = USART_Scanf(99); printf(nr 年份被设置为: 20%0.2dnr, Tmp_YY); tm-tm_year = Tmp_YY+2000; Tmp_MM = 0xFF; printf(rn 请输入月份(Please Set Months): ); while (Tmp_MM = 0x

22、FF) Tmp_MM = USART_Scanf(12); printf(nr 月份被设置为: %dnr, Tmp_MM); tm-tm_mon= Tmp_MM; Tmp_DD = 0xFF; printf(rn 请输入日期(Please Set Dates): ); while (Tmp_DD = 0xFF) Tmp_DD = USART_Scanf(31); printf(nr 日期被设置为: %dnr, Tmp_DD); tm-tm_mday= Tmp_DD; Tmp_HH = 0xFF; printf(rn 请输入时钟(Please Set Hours): ); while (Tmp_

23、HH = 0xFF) Tmp_HH = USART_Scanf(23); printf(nr 时钟被设置为: %dnr, Tmp_HH ); tm-tm_hour= Tmp_HH; Tmp_MI = 0xFF; printf(rn 请输入分钟(Please Set Minutes): ); while (Tmp_MI = 0xFF) Tmp_MI = USART_Scanf(59); printf(nr 分钟被设置为: %dnr, Tmp_MI); tm-tm_min= Tmp_MI; Tmp_SS = 0xFF; printf(rn 请输入秒钟(Please Set Seconds): );

24、 while (Tmp_SS = 0xFF) Tmp_SS = USART_Scanf(59); printf(nr 秒钟被设置为: %dnr, Tmp_SS); tm-tm_sec= Tmp_SS;void Time_Adjust() RTC_WaitForLastTask(); Time_Regulate(&systmtime); GregorianDay(&systmtime); RTC_SetCounter(mktimev(&systmtime); RTC_WaitForLastTask();void Time_Display(uint32_t TimeVar) static uint

25、32_t FirstDisplay = 1; u8 str15; to_tm(TimeVar, &systmtime); if(!systmtime.tm_hour & !systmtime.tm_min & !systmtime.tm_sec) | (FirstDisplay) GetChinaCalendar(u16)systmtime.tm_year, (u8)systmtime.tm_mon, (u8)systmtime.tm_mday, str); printf(nrnr 今天农历:%0.2d%0.2d,%0.2d,%0.2d, str0, str1, str2, str3); Ge

26、tChinaCalendarStr(u16)systmtime.tm_year,(u8)systmtime.tm_mon,(u8)systmtime.tm_mday,str); printf( %s, str); printf(r 当前时间为: %d年(%s年) %d月 %d日 (星期%s) %0.2d:%0.2d:%0.2d, systmtime.tm_year, zodiac_sign(systmtime.tm_year-3)%12, systmtime.tm_mon, systmtime.tm_mday, WEEK_STRsystmtime.tm_wday, systmtime.tm_h

27、our, systmtime.tm_min, systmtime.tm_sec);void Time_Show() printf(nr); while (1) if (TimeDisplay = 1) Time_Display(RTC_GetCounter(); TimeDisplay = 0; u8 USART_Scanf(u32 value) u32 index = 0; u32 tmp2 = 0, 0; while (index 2) while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) = RESET) tmpindex+ = (USA

28、RT_ReceiveData(USART1); if (tmpindex - 1 0x39) if(index = 2) & (tmpindex - 1 = r) tmp1 = tmp0; tmp0 = 0x30; else printf(nrPlease enter valid number between 0 and 9 -: ); index-; index = (tmp1 - 0x30) + (tmp0 - 0x30) * 10); if (index value) printf(nrPlease enter valid number between 0 and %d, value); return 0xFF; return index;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1