《基于ARM的时钟闹钟设计》由会员分享,可在线阅读,更多相关《基于ARM的时钟闹钟设计(20页珍藏版)》请在金锄头文库上搜索。
1、嵌入式系统课程设计报告 基于ARM的时钟系统院 系: 学生姓名: 专 业: 应用电子技术 班 级: 指导教师: 完成时间: 目 录1 引言12 STM32单片机RTC介绍13 总体设计框图24 硬件电路24.1 STM32芯片管脚介绍24.2 STM32复位和时钟电路设计34.3闹钟提醒电路45 程序流程图45.1 主程序流程图45.2 中断程序流程图66 总结与体会6参考文献:7附录:8基于ARM的时钟系统摘要:本设计选择STM32为核心控制元件,设计了用RTC定时器实现时钟的控制与设计,本设计能作为普通时钟用,而且能设置闹钟。程序使用C语言进行编程,能动态显示当前时间,包括时、分、秒,并且
2、用串口助手显示。关键词:STM32 ARM 时钟 闹钟1 引言 随着科技的发展,嵌入式系统广泛应用于工业控制和商业管理领域,在多媒体手机、袖珍电脑,掌上电脑,车载导航器等方面的应用,更是极大地促进了嵌入式技术深入到生活和工作各个方面。嵌入式系统主要由嵌入式处理器、相关支撑硬件及嵌入式软件系统组成。本文介绍基于STM32F103R6T6的嵌入式微处理器的电子时钟设计,并且在液晶上显示。2 STM32单片机RTC介绍STM32的实时时钟(RTC)是一个独立的定时器。RTC模块拥有一组连续计数的计数器,在相应软件配置下,可以提供时钟日历的功能,修改计数器的值可以重新设置系统当前的时间和日期。STM3
3、2F10x系列微控制器片上内置的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 speed ex
4、ternal)振荡器时钟,即低速外部时钟,接石英晶体,频率为32.768kHz。(5)2钟独立的复位类型: APB1接口由系统复位。 RTC核(预分频器、闹钟、计数器和分频器)只能由备份域复位。(6)3个专门的可屏蔽中断:闹钟中断,用来产生一个软件可编程的闹钟中断。秒中断,用来产生一个可编程的周期性中断信号(最长可达1s)。溢出中断,检测内部可编程计数器溢出并回转为0的状态。3 总体设计框图 本电路主要由3大部分电路组成:ARM最小系统电路、时钟显示电路和闹钟警报电路(本设计用LED灯指示)。其中ATM最小系统主要由复位电路和时钟电路组成。在该设计中,闹钟提醒由LED灯代替,当闹钟时间到的话,
5、LED灯亮,延时设定的时间后自动关闭。总体设计方框图,如图1所示。STM32液晶显示电路 复位电路 闹铃提醒电路 时钟电路图1总体设计方框图4 硬件电路 该设计分为软件设计和硬件设计两大模块,硬件电路由ARM最小系统电路、时钟显示电路和闹钟提醒电路组成。4.1 STM32芯片管脚介绍STM32F103R6T6管脚示意图,如图2所示。图2 STM32F103R6T6管脚示意图4.2 STM32复位和时钟电路设计 此电路主要是复位电路和时钟电路两部分,其中复位电路采用按键手动复位和上电自动复位组合,电路如图2(右)所示:其中7脚为STM32的复位端。时钟电路如图2(左)所示:晶振采用的是8MHz和
6、32.786KHz,8MKz分别接STM32的5脚和6脚,32.786KHz分别接STM32的3脚和4脚。图3 STM32复位和时钟电路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处理器开发应
8、用M.北京航空航天大学出版社,2008.3 王永红、徐炜、赫立平.STM32系列ARM Cortex-M3微控制器原理与实践M.北京航空航天大学出版社,2008.4 ARM Limited.Cortex-M3 Technical Reference Manual(r2p0). ARM DDI 0037G 2008.5 总体电路图2 串口助手演示效果3 源程序/* * 函数名:NVIC_Configuration * 描述 :配置RTC秒中断的主中断优先级为1,次优先级为0 * 输入 :无 * 输出 :无 * 调用 :外部调用 */void NVIC_Configuration(void) N
9、VIC_InitTypeDef NVIC_InitStructure; /* Configure one bit for 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_IRQChann
10、elSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = RTCAlarm_IRQn; NVIC_InitStructure.NVIC_IRQChannelSubPriority =0 ; NVIC_Init(&NVIC_InitStructure);/* * 函数名:GPIO_Configuration * 描述 :配置GPIO * 输入 :无 * 输出 :无 * 调用 :外部调用
11、 */void GPIO_Configuration(void)/*定义一个GPIO_InitTypeDef类型的结构体*/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.GP
12、IO_Mode = GPIO_Mode_Out_PP; /*设置引脚速率为50MHz */ GPIO_InitStructure.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_Confi
13、guration(void) /* Enable PWR and BKP clocks */ RCC_APB1PeriphClockCmd(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 as RTC Clock Source */ RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); /* Enable RTC Cloc