基于ARM的时钟闹钟设计.doc

上传人:管** 文档编号:850256 上传时间:2023-09-15 格式:DOC 页数:19 大小:176.50KB
下载 相关 举报
基于ARM的时钟闹钟设计.doc_第1页
第1页 / 共19页
基于ARM的时钟闹钟设计.doc_第2页
第2页 / 共19页
基于ARM的时钟闹钟设计.doc_第3页
第3页 / 共19页
基于ARM的时钟闹钟设计.doc_第4页
第4页 / 共19页
基于ARM的时钟闹钟设计.doc_第5页
第5页 / 共19页
点击查看更多>>
资源描述

1、基于ARM的时钟系统摘要:本设计选择STM32为核心控制元件,设计了用RTC定时器实现时钟的控制与设计,本设计能作为普通时钟用,而且能设置闹钟。程序使用C语言进行编程,能动态显示当前时间,包括时、分、秒,并且用串口助手显示。关键词:STM32 ARM 时钟 闹钟目 录1 引言12 STM32单片机RTC介绍13 总体设计框图24 硬件电路24.1 STM32芯片管脚介绍24.2 STM32复位和时钟电路设计34.3闹钟提醒电路45 程序流程图45.1 主程序流程图45.2 中断程序流程图66 总结与体会6参考文献:7附录:81 引言 随着科技的发展,嵌入式系统广泛应用于工业控制和商业管理领域,

2、在多媒体手机、袖珍电脑,掌上电脑,车载导航器等方面的应用,更是极大地促进了嵌入式技术深入到生活和工作各个方面。嵌入式系统主要由嵌入式处理器、相关支撑硬件及嵌入式软件系统组成。本文介绍基于STM32F103R6T6的嵌入式微处理器的电子时钟设计,并且在液晶上显示。2 STM32单片机RTC介绍STM32的实时时钟(RTC)是一个独立的定时器。RTC模块拥有一组连续计数的计数器,在相应软件配置下,可以提供时钟日历的功能,修改计数器的值可以重新设置系统当前的时间和日期。STM32F10x系列微控制器片上内置的RTC模块,主要特性如下:(1) 可编程的预分频系数,分频系数最高位220。(2) 32位的

3、可编程计数器,可用于长程时间段的测量。(3) 两个单独的时钟:用于APB1接口的PLCK1和RTC时钟(此时RTC时钟的频率必须小于PCLK1时钟的四分之一以上)。(4) 可以选择一下三种RTC的时钟源: HSE(high speed external)时钟除以128,即高速外部时钟,接石英/陶瓷谐振器,或者接外部时钟源,频率范围为416MHz。 LSI(low speed internal)振荡器时钟,即低速内部时钟,频率为40kHz。 LSE(low speed external)振荡器时钟,即低速外部时钟,接石英晶体,频率为32.768kHz。(5)2钟独立的复位类型: APB1接口由系

4、统复位。 RTC核(预分频器、闹钟、计数器和分频器)只能由备份域复位。(6)3个专门的可屏蔽中断:闹钟中断,用来产生一个软件可编程的闹钟中断。秒中断,用来产生一个可编程的周期性中断信号(最长可达1s)。溢出中断,检测内部可编程计数器溢出并回转为0的状态。3 总体设计框图 本电路主要由3大部分电路组成:ARM最小系统电路、时钟显示电路和闹钟警报电路(本设计用LED灯指示)。其中ATM最小系统主要由复位电路和时钟电路组成。在该设计中,闹钟提醒由LED灯代替,当闹钟时间到的话,LED灯亮,延时设定的时间后自动关闭。总体设计方框图,如图1所示。STM32液晶显示电路 复位电路 闹铃提醒电路 时钟电路图

5、1总体设计方框图4 硬件电路 该设计分为软件设计和硬件设计两大模块,硬件电路由ARM最小系统电路、时钟显示电路和闹钟提醒电路组成。4.1 STM32芯片管脚介绍STM32F103R6T6管脚示意图,如图2所示。图2 STM32F103R6T6管脚示意图4.2 STM32复位和时钟电路设计 此电路主要是复位电路和时钟电路两部分,其中复位电路采用按键手动复位和上电自动复位组合,电路如图2(右)所示:其中7脚为STM32的复位端。时钟电路如图2(左)所示:晶振采用的是8MHz和32.786KHz,8MKz分别接STM32的5脚和6脚,32.786KHz分别接STM32的3脚和4脚。图3 STM32复

6、位和时钟电路4.3 闹钟提醒电路本设计的闹钟提醒电路没有采用蜂鸣器,为了调试方便用实验板上的发光二极管LED1LED4指示,其与实验板对应接口为PC0PC3。电路如图4所示。图4 闹钟提醒电路5 程序流程图5.1主程序流程图 主程序流程图,如图5所示。图5主程序流程图5.2中断程序流程图 中断程序流程图,如图6所示。图6中断程序流程图6 总结与体会通过这次时钟的设计,使我对ARM有了更深的理解。刚开始拿到题提目,我先是查找相关资料,从图书馆和网上找到相关的课题,参考借鉴别人的设计,从而理清我们设计的思路。此次作业设计大致可以分为两部分,电路图部分和程序编程部分,其中最有难度的是程序的编写与调试

7、。在编写程序的过程中,我遇到了各种各样的问题,工程之间的结合,对于其中的错误怎样解决,需要配置什么,更改哪里等等。对于ARM我学的很浅,编程遇到问题不知道如何解决,我知道这个是我的弱点,但在这两周的课程设计中,用Keil uVision4在ARM开发板上进行程序调试,遇到问题解决问题,在这个过程中我收获了不少。参考文献1 彭刚、秦志强等.基于ARM Cortex-M3的STM32系列嵌入式微控制器应用实践M.北京:电子工业出版社2 李宁.基于MDK的STM32处理器开发应用M.北京航空航天大学出版社,2008.3 王永红、徐炜、赫立平.STM32系列ARM Cortex-M3微控制器原理与实践

8、M.北京航空航天大学出版社,2008.4 ARM Limited.Cortex-M3 Technical Reference Manual(r2p0). ARM DDI 0037G 2008.5 附录1 总体电路图2 串口助手演示效果3 源程序/* * 函数名:NVIC_Configuration * 描述 :配置RTC秒中断的主中断优先级为1,次优先级为0 * 输入 :无 * 输出 :无 * 调用 :外部调用 */void NVIC_Configuration(void) NVIC_InitTypeDef NVIC_InitStructure; /* Configure one bit fo

9、r preemption priority */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); /* Enable the RTC Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd =

10、ENABLE; NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = RTCAlarm_IRQn; NVIC_InitStructure.NVIC_IRQChannelSubPriority =0 ; NVIC_Init(&NVIC_InitStructure);/* * 函数名:GPIO_Configuration * 描述 :配置GPIO * 输入 :无 * 输出 :无 * 调用 :外部调用 */void GPIO_Configuration(void)/*定义一个GPIO_InitTypeDef类型的结构

11、体*/GPIO_InitTypeDef GPIO_InitStructure;/*开启GPIOC的外设时钟*/RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE); /*选择要控制的GPIOC引脚*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;/*设置引脚模式为通用推挽输出*/ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /*设置引脚速率为50MHz */ GPIO_InitStru

12、cture.GPIO_Speed = GPIO_Speed_50MHz; /*调用库函数,初始化GPIOC*/ GPIO_Init(GPIOC, &GPIO_InitStructure);GPIO_SetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3); /* * 函数名:RTC_Configuration * 描述 :配置RTC * 输入 :无 * 输出 :无 * 调用 :外部调用 */void RTC_Configuration(void) /* Enable PWR and BKP clocks */ RCC_APB1Peri

13、phClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); /* Allow access to BKP Domain */ PWR_BackupAccessCmd(ENABLE); /* Reset Backup Domain */ BKP_DeInit(); /* Enable LSE */ RCC_LSEConfig(RCC_LSE_ON); /* Wait till LSE is ready */ while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) = RESET) /* Select LSE

14、 as RTC Clock Source */ RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); /* Enable RTC Clock */ RCC_RTCCLKCmd(ENABLE); /* Wait for RTC registers synchronization */ RTC_WaitForSynchro(); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); /* Enable the RTC Second */ RTC_

15、ITConfig(RTC_IT_SEC, ENABLE); RTC_ITConfig(RTC_IT_ALR, ENABLE); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); /* Set RTC prescaler: set RTC period to 1sec */ RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */ /* Wait until

16、last write operation on RTC registers has finished */ RTC_WaitForLastTask();/* * 函数名:Time_Regulate * 描述 :返回用户在超级终端中输入的时间值,并将值储存在 * RTC 计数寄存器中。 * 输入 :无 * 输出 :用户在超级终端中输入的时间值,单位为 s * 调用 :内部调用 */uint32_t Time_Regulate(void) uint32_t Tmp_HH = 0xFF, Tmp_MM = 0xFF, Tmp_SS = 0xFF; printf(rn=Time Settings=);

17、 printf(rn Please Set Hours); while (Tmp_HH = 0xFF) Tmp_HH = USART_Scanf(23); printf(: %d, Tmp_HH); printf(rn Please Set Minutes); while (Tmp_MM = 0xFF) Tmp_MM = USART_Scanf(59); printf(: %d, Tmp_MM); printf(rn Please Set Seconds); while (Tmp_SS = 0xFF) Tmp_SS = USART_Scanf(59); printf(: %d, Tmp_SS)

18、; /* Return the value to store in RTC counter register */ return(Tmp_HH*3600 + Tmp_MM*60 + Tmp_SS);/* * 函数名:Time_Adjust * 描述 :时间调节 * 输入 :无 * 输出 :无 * 调用 :外部调用 */void Time_Adjust(void) /uint32_t AAAA; /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); /AAAA=Time

19、_Regulate(); /* Change the current time */ RTC_SetCounter(Time_Regulate(); RTC_SetAlarm( Time_Regulate(); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask();/* * 函数名:Time_Display * 描述 :显示当前时间值 * 输入 :-TimeVar RTC计数值,单位为 s * 输出 :无 * 调用 :内部调用 */void Time_Display(u

20、int32_t TimeVar) uint32_t THH = 0, TMM = 0, TSS = 0; /* Compute hours */ THH = TimeVar / 3600; /* Compute minutes */ TMM = (TimeVar % 3600) / 60; /* Compute seconds */ TSS = (TimeVar % 3600) % 60; printf( Time: %0.2d:%0.2d:%0.2dr, THH, TMM, TSS);/* * 函数名:Time_Show * 描述 :在超级终端中显示当前时间值 * 输入 :无 * 输出 :无

21、 * 调用 :外部调用 */ void Time_Show(void) printf(nr); /* Infinite loop */ while (1) /* If 1s has paased */ if (TimeDisplay = 1) /* Display current time */ Time_Display(RTC_GetCounter(); TimeDisplay = 0; /* * 函数名:USART_Scanf * 描述 :串口从超级终端中获取数值 * 输入 :- value 用户在超级终端中输入的数值 * 输出 :无 * 调用 :内部调用 */ uint8_t USART

22、_Scanf(uint32_t value) uint32_t index = 0; uint32_t tmp2 = 0, 0; while (index 2) /* Loop until RXNE = 1 */ while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) = RESET) tmpindex+ = (USART_ReceiveData(USART1);/ 从串口终端里面输进去的数是ASCII码值 if (tmpindex - 1 0x39) printf(nrPlease enter valid number between 0 an

23、d 9); index-; /* Calculate the Corresponding value */ index = (tmp1 - 0x30) + (tmp0 - 0x30) * 10); /* Checks */ if (index value) printf(nrPlease enter valid number between 0 and %d, value); return 0xFF; return index;/*/* STM32F10x Peripherals Interrupt Handlers */* Add here the Interrupt Handler for

24、 the used peripheral(s) (PPP), for the */* available peripheral interrupt handlers name please refer to the startup */* file (startup_stm32f10x_xx.s). */*/* * brief This function handles RTC global interrupt request. * param None * retval : None */void RTC_IRQHandler(void) if (RTC_GetITStatus(RTC_IT

25、_SEC) != RESET) /* Clear the RTC Second interrupt */ RTC_ClearITPendingBit(RTC_IT_SEC); /* Toggle GPIO_LED pin 6 each 1s */ /GPIO_WriteBit(GPIO_LED, GPIO_Pin_6, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIO_LED, GPIO_Pin_6); /* Enable time update */ TimeDisplay = 1; /* Wait until last write operation

26、on RTC registers has finished */ RTC_WaitForLastTask(); /* Reset RTC Counter when Time is 23:59:59 */ if (RTC_GetCounter() = 0x00015180) RTC_SetCounter(0x0); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); if(RTC_GetITStatus(RTC_IT_ALR)!=RESET) RTC_ClearITP

27、endingBit(RTC_IT_ALR); printf(rn RTC alarm begin!); GPIO_ResetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3); Delay_nms(3000);GPIO_SetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3); /* * 函数名:Delay_nus(int16) * 描述 :微秒级延时n32767 * 输入 :无 * 输出 :无 */void Delay_nus(u16 n)u16 j;while(n-)j=

28、8;while(j-);/*/* * 函数名:Delay_nms(int16) * 描述 :毫秒级延时n32767 * 输入 :无 * 输出 :无 */void Delay_nms(u16 n)while(n-)Delay_nus(1100);/*嵌入式系统课程设计报告 * 文件名 :main.c* 描述 :利用STM32的RTC实现一个简易的电子时钟。在串口助手中显示时间值。* 显示格式为 Time: XX:XX:XX(时:分:秒),当时间* 计数为:23:59:59 时将刷新为:00:00:00。 * 另外还能设置闹钟*基于ARM的时钟系统*/int main(void) /* confi

29、g the sysclock to 72M */ SystemInit(); /* USART1 config */USART1_Config();/* 配置RTC秒中断优先级 */NVIC_Configuration(); printf( rn This is a RTC demo. rn );GPIO_Configuration();if (BKP_ReadBackupRegister(BKP_DR1) != 0x5A5A) /* Backup data register value is not correct or not yet programmed (when the first

30、time the program is executed) */printf(rnThis is a RTC demo!rn); printf(rnn RTC not yet configured.); /* RTC Configuration */ RTC_Configuration(); printf(rn RTC configured.); /* Adjust time by values entred by the user on the hyperterminal */ Time_Adjust(); BKP_WriteBackupRegister(BKP_DR1, 0x5A5A);

31、else /* Check if the Power On Reset flag is set */ if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET) printf(rnn Power On Reset occurred.); /* Check if the Pin Reset flag is set */ else if (RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET) printf(rnn External Reset occurred.); printf(rn No need to configur

32、e RTC.); /* Wait for RTC registers synchronization */ RTC_WaitForSynchro(); /* Enable the RTC Second */ RTC_ITConfig(RTC_IT_SEC, ENABLE);RTC_ITConfig(RTC_IT_ALR, ENABLE); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); #ifdef RTCClockOutput_Enable /* Enable

33、 PWR and BKP clocks */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); /* Allow access to BKP Domain */ PWR_BackupAccessCmd(ENABLE); /* Disable the Tamper Pin */ BKP_TamperPinCmd(DISABLE); /* To output RTCCLK/64 on Tamper pin, the tamper functionality must be disabled */ /* Enable RTC Clock Output on Tamper Pin */ BKP_RTCOutputConfig(BKP_RTCOutputSource_CalibClock);#endif /* Clear reset flags */ RCC_ClearFlag(); /* Display time in infinite loop */ Time_Show();while (1) 19

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

当前位置:首页 > 学术论文 > 毕业设计

版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。

Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1 

陕公网安备 61072602000132号     违法和不良信息举报:0916-4228922