还剩23页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
中南民族大学嵌入式技术与应用课程设计报告串口数字时钟设计学院计算机科学学院专业自动化班级自动化四班姓名肖映彩学号08064112指导教师张志俊、田微、李薇、姚为年月日20111114教师评语:总分:教师签名:(APB1APB1第一部分接口)用来和总线相连416APB1此单元还包含一组位寄存器,可通过APB1总线对其进行读写操作APB1APB1接口由总线时钟驱动,用来与总(RTC线接口另一部分核心)由一组可编程计数器组成,分成两个主要模块第RTC一个模块是的预分频模块,它可编程产生1RTC TR_CLKo RTC最长为秒的时间基准的20预分频模块包含了一个位的可(RTC编程分频器预分频器)如果在TR_CLK RTC则在每个期中产生一个中RTC_CR寄存器中设置了相应的允许位,32断(秒中断)第二个模块是一个位的可编程计数器,可被初始化为当前的系TR_CLK统时间系统时间按周期累加并与存RTC_ALR储在寄存器中的可编程时间RTC_CR相比较,如果控制寄存器中设置了相应允许位,比较匹配时将产生一个闹钟中断硬件电路设计5在系统板上STM32F103VET6处理器的VBAT引脚接+3V钮扣电池,PC6引脚接LED1,串口电路设计如图2-1所示图2-1串口电路有了以上电路,使用该实例时只需将用一根6RS232USART1PC串行通讯线将系统板的口与机的串口相连即可软件程序设计
73.1需求分析•根据设计要求,软件需实现以下任务•系统启动后检查RTC是否已设置由于RTC在BKP区域,当Vdd掉电之后可由后备电源提供电源,当后备电源连接到针脚VBAT上时,RTC的设置不会由于外部电源的断开而丢失在本设计中写一个值到BKP_DR1寄存器中以标示RTC是否已配置,在启动之后程序检查BKP_DR1寄存器的值•若BKP_DR1寄存器的值不正确(BKP_DR1寄存器的值有误或者由于是第一次运行值还未写进去),则需要配置时间并且询问用户调整时间若BKP_DR1的值正确,则意味着RTC已配置,此时将在超级终端上显示时间在RTC秒中断发生时,连接到PC.06的LED1灯每秒闪烁一次
3.2程序流程图根据系统设计要求,程序设计流程图如图3-1所示:
3.3主要程序说明整个工程包含3个源文件:startup stm32f10x hd.s stm32fl0x it.c和main,c,其中startup_stm32fl0x_hd.s为启动代码,所有中断服务子程序均在stm32f10x_it.c中,其它函数则在main,c中•下面分别介绍各个主要的函数,具体详细程序见附录1程序清单8文件中函数用于处理秒中断事件,每次秒中断令stm32fl0x_it.c RTCJRQHandlerRTC LED1闪烁一次,在每次遇到时将时钟回零23:59:59main.c RTC_Configuration函数用于酉己置RTC USART_Scanf模块函数用于从PC Time_Regulate超级终端中获取数字值,USART_Scanf利用函数从超级终端获取新的RTC Time_Adjust时间值,函数则利用函数USART_Scanf RTC设置新的时间函数Time_Display Time_Show RTC和用于将时间转换了字USART1符串送往调试过程与结果
104.1调试过程•使用Keil uVision3打开工程RTC-USART.Uv2,用仿真器连接系统板和Keil uVision3,编译链接工程;•使用标准串口线,连接系统板上的接口和机的串口;USART1PC•打开串口调试工具设置通讯端口参数为:端口,波特率位数据位,ComTools,COM19600,8位停止位,无校验位,无硬件流控制1选择硬件调试模式(也可采用软件调试模42USART C0M1式,利用窗口来模拟实现的Keil uVision3输入和输出),点击的Debug Start/Stop Debug菜单,选择Session Ctrl+F5项或键,远程连接目标板并下载调试代码到目标系统中;
4.3调试结果例程正常运行之后会在超级终端显示以下信息:RTC not yet configured....RTC configured....TimeSettingsPlease Set Hours:在PC机上依次输入时钟、分钟、秒钟之后每隔1秒在ComTools上显示一次时间,同时开发板的LED1灯也会每隔1s闪烁一次显示效果图4T所示:RTC notyet confic^ed.•••RTC conficured....zx•»Please SetHours16Please Setlinutex46Please Set Seconds46Ti»e16:46:46Tiae16:46:46Ti»e16:46:47Tiae16:46:5216:46:48Tiae16:46:49TIM16:46:50Tiae16:46:51TIMTiae16:46:53TIM16:46:54Tiae16:46:55Tiae16:46:56TIM16:47:0116:46:57TIM16:46:58TIM16:46:59TIM16:47:00TiaeTIM16:47:02TIM16:47:03Tiae:16:47:04Tiae16:47:05TIM16:47:06Tiae16:47:07TIM16:47:06TIM:16:47:09TIM:16:47:10Tine16:47:11UM16:47:12TM16:47:13Tiae16:47:14Tiae16:47:15TIM:10:47:16TIM16:47:17Tiae16:47:18TIM10:47:19Txae:16:47:21TIM16:47:20Tiae16:47:22Txae16:47:23Tiae16:47:2816:47:24Txae16:47:25TIM16:47:26Tiae16:47:27TIMTiae16:47:29Tiae16:47:30Tiae16:47:31Txae16:47:32Tiae16:47:3716:47:33Tiae16:47:34TIM16:47:35TIM16:47:36TIM Tie16:47:38图4-1程序正常运行时断开系统板外部电源,然后重新接上外部电源,在ComTools也将继续显示正常时间显示效果图4-2所示I PoverOn Reset occurred.•••No need to confitureRTC....*TiT^e16:50:26TIM16SO27Txxe16:50:28Txe16:50:29Tiae16:50:3416:50:30Tiae16:50:31Tiae16:50:32Tiae16:50:33TIMTi»e16:50:35TIM16:50:36TIM16:50:37Tiae16:50:38Tiae16:50:39Tiae:16:S0:41Tiae:16:50:42Tx»e:16:50:4316:50:40TimeTme16:50:44TIM16:50:45Tiae16:50:46Tiae16:50:47Time16:50:5216:50:48Txae16:50:49Tiae16:50:50Tiae16:50:51TiaeTi»e16:50:53Tiae16:50:54TIM16:50:55Tiae16:50:56Tiae16:50:57取下系统板上的纽扣电池,并断开外部电源,11PC然后重新接上外部电源,超级终端上将无法继续正常显示时间,要重新设置时间才能正常显示设计总结12本次课程设计设计的是串口数字时钟,是针对13STM32处理器的实时时钟模块和串行通讯口设计的一个应用系统该系统通PC过机的超级终端提供人际交互界面,STM32实现和的通讯,在设置好时间后,STM32会每一秒钟在超级终端上输出实时时间STM32通过设计该系统,我学习了实时时钟14模块和通用串行输入输出端口的应用,也对其他通用模块有了一定的了解参考文献15
[2]意法半导体(中国)投资有限公司.16
[1]意法半导体(中国)投资有限公司.STM32F10X微控制器参考手册・2010STM32固件库使用手册的中文翻译版.2010附录17文件stm32fl0x_it.cvoid RTC_IRQHandler voidifRTC^GetITStatusRTC_IT_SEC!=RESET〃读取秒中断状态RTC_ClearlTPendingBitRTC_IT_SEC;〃清除秒中断标志GPIO_WriteBitGPIOB,GPI0_Pin_6,BitAction l-GPIO_ReadOutputDataBit GPIOB,GPI0_Pin_6;//LED1闪烁TimeDisplay=1;RTCJVaitForLastTaskO;〃等待上一次对RTC寄存器的写操作完成ifRTC_GetCounter==0x00015180〃当前时间是23:59:59时复位为0:0:0RTC SetCounter0x0;〃写入复位值RTCJVaitForLastTaskO;}main,c文件ttinclude〃stm32f10x.h〃ttinclude〃stm32f10x_bkp.h〃ttinclude/,stm32f10x_gpio.h〃ttinclude/zstm32f lOxrcc.h〃ttinclude,zstm32f10x_usart.h〃ttinclude zzstm32f10x_rtc.h〃ttinclude〃stm32f10x_flash.h〃ttinclude〃stm32f10x_pwr.h〃ttinclude〃misc,h〃ttinclude stdio.hvu32TimeDisplay=0;void RCCConfigurationvoid;void GPI0_Configurationvoid;void USARTConfigurationvoid;void RTC_Configurationvoid;void NVIC_Configurationvoid;u32Time Regulatevoid;void Time_Adjustvoid;void TimeShowvoid;void Time_Displayu32TimeVar;u8USARTScanfu32value;int mainvoidttifdef DEBUGdebug;ttendifRCC_Conf iguration;〃系统时钟初始化NVIC_Configuration;〃中断初始化GPIO Configuration;//GPIO初始化USARTConf igurat ion;//串口1初始化ifBKP_ReadBackupRegisterBKP_DR1!=0xA5A5RTC标志//判断保存在备份寄存器的是否已经被配置过printf z/\r\n\n RTCnotyetconfigured....,z;//RTC初始化RTC_Configuration;printf〃\r\n RTCconfigured....z,;Time_Adjust;//设置RTC时钟参数BKP_Wri teBackupRegister BKPDR1,0xA5A5;//RTC设置后,将已配置标志写入备份数据寄存器else{ifRCC_GetFlagStatusRCC_FLAG_PORRST!二RESET〃检查是否掉电重启{printf〃\r\n\n PowerOn Resetoccurred....;else ifRCC_GetFlagStatus RCC_FLAG_PINRST!=RESET〃检查是否reset复位{printf〃\r\n\n ExternalResetoccurred....z,;printf〃\r\n Noneedtoconfigure RTC..・.〃;RTC_WaitForSynchro;步〃等待RTC寄存器被同RTC_ITConfigRTC_IT_SEC,ENABLE;〃使能秒中断RTC_WaitForLastTask;RCC ClearFlagO;Time_Show;〃显示时钟void RCC_Configuration void{RCC_DeInit;为缺省值〃将外设RCC寄存器重设RCCJISEConf igRCCJ1SE_ON;〃设置外部高速晶振HSEStartUpStatus=RCCWaitForHSEStartUp;//等待HSE起振ifHSEStartUpStatus==SUCCESS//如果HSE成功起振RCC_HCLKConf igRCC_SYSCLK_Di v1;//设置AHB时钟为系统时钟RCC_PCLK2ConfigRCC_HCLK_Divl;〃设置高速AHB时钟RCC_PCLKlConfigRCC_HCLK_Div2;〃设置低速AHB时钟FLASH_SetLatencyFLASH_Latency_2;〃设置代码延时值为2延时周期FLASIl_Pref etchBufferCmdFLASH_PrefetchBuffer_Enable;RCOLLConf igRCC_PLLSource„HSE_Divl,RCC_PLLMul9;〃设置PLL的输入时钟为HSE时钟,倍频系数为9RCC_PLLCmdENABLE;〃使能PLLwhileRCC_GetFlagStatus RCC_FLAG_PLLRDY二二RESET〃等待PLL就绪RCC_SYSCLKConfigRCC_SYSCLKSource_PLLCLK;〃选择PLL作为系统时钟whileRCC_GetSYSCLKSource!=0x08〃等待PLL作为系统时钟RCC_APB2PeriphC1ockCmdRCC_APB2Periph_USART1|RCC_APB2Periph_GPI0ARCC_APB2Periph_GPI0B|RCC_APB2Periph_GPI0C,ENABLE;〃使能外设时钟void NVIC_Configurationvoid NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfigNVIC_PriorityGroup_1;NVIC」nitStructure.NVIC」RQChannel=RTC_IRQn;〃配置RTC秒中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_InitNVIC_InitStructure;void GPI0_ConfigurationvoidGPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPI0_Pin=GPI0_Pin_6;//PC.06GPIO InitStructure.GPI0_Speed=GPI0_Speed_50MHz;〃最高输出速率50MHzGPIO_InitStructure.GPI0_Mode=GPI0_Mode_0ut_PP;〃推挽输出模式GPI0_InitGPIOC,GPIO_InitStructure;//PA.09,串口发送引脚GPIO_InitStructure.GPI0_Pin=GPI0_Pin_9;〃复用推挽输出模式GPIO_InitStructure.GPIOJIode=GPIO_Mode_AF_PP;GPIO InitGPIOA,GPIO InitStructure;//PA.10,串口接收引脚GPIO_InitStructure.GPI0_Pin=GPI0_Pin_10;〃浮空输入模式GPIO_InitStructure.GPIOJlode=GPIO_Mode_IN_FLOATING;GPI0_InitGPIOA,GPIO_InitStructure;void RTCConfigurationvoidRCC_APBlPeriphClockCmdRCC_APBlPeriph_PWR|RCC_APBlPeriph_BKP,ENABLE;〃使能PWR和BKP时钟PWR JackupAccessCmdENABLE;〃使能RTC和后备寄存寄存器的写操作完成器访问〃重置BKPBKP_DeInit;RCC_LSEConfigRCC_LSE_ON;==RESET〃等待LSE就绪whileRCC„GetFlagStatusRCC_FLAG LSERDY//选择LSE作为RTC时RCC_RTCCLKConfigRCC_RTCCLKSource_LSE;钟〃等待最近一次对RTCRTC_Wai tForLastTask;u32Time_Regulatevoid{printf\r\n==============T imeSett ings===============〃;printfz,\r\n PleaseSetHours;whileTmp_HH==OxFF〃输入小时,输入的值小TmpJlH=USART_Scanf23;于23printf z,:%d〃,Tmp HH;printfz,\r\n PleaseSet Minutes;whileTmp_MM二二OxFF{〃输入分,输入的值小于TmpJIM=USART_Scanf59;59printf/z%d〃,Tmp_MM;printf〃\r\n PleaseSetSeconds;whileTmpSS二二OxFF//输入秒,输入的值小于u32Tmp HH=OxFF,TmpJIM=OxFF,Tmp_SS=OxFF;Tmp SS=USART_Scanf59;59}printf〃%d〃,Tmp_SS;returnTmp HH*3600+Tmp_MM*60+TmpSS;成秒作为返回值//将当前输入的时间换算}void Time_Adjust voidRTC_WaitForLastTask;〃等待最近一次对RTC寄〃存器的写操作完成RTC SetCounterTime_Regulate;设置RTC计数器的值为//等输入的当前时间RTC WaitForLastTask;待最近一次对RTC寄存器的写操作完成void TimeDisplayu32TimeVar u32THH=0,TMM=0,TSS=0;THH=TimeVar/3600;TMM二TimeVar%3600/60;TSS二TimeVar%3600%60;printfCTime:%
0.2d:%
0.2d:%
0.2d\rz,,THH,TMM,TSS;}void Time_Showvoid printf〃\n\r〃;while1if TimeDisplay==1//如果Is过去{Time_Display RTCGetCounter;〃显示当前时间TimeDisplay=0;}void USARTConf igurationvoid USARTInitTypeDef USARTlnitStructure;USART_InitStructure.USART_BaudRate=9600;〃波特率9600USART InitStructure.USART WordLength=USART WordLength8b;〃8位数据位USART InitStructure.USART_StopBits二USART_StopBits_l;//I位停止位USART_InitStructure.USART Parity=USART ParityNo;//无奇偶检验USART InitStructure.USART HardwareF1owContro1二〃无硬件流控制USART_HardwareFlowControl_None;USART InitStructure.USART_Mode=USARTJlode_Rx|〃收发模式USART_Mode_Tx;USART_InitUSARTl,USART_InitStructure;〃使能USART1USART_CmdUSART1,ENABLE;int fputcint ch,FILE*fUSART_SendDataUSARTl,unsigned charch;while!USART1-SRUSART_FLAG_TXE;returnch;u8USART_Scanfu32value u32index=0;u32tmp
[2]={0,0};while index2whileUSART_GetFlagStatusUSARTl,USART_FLAG_RXNE=RESET〃等待接收字符串完成tmp[index++]=USART ReceiveDataUSART1;iftmp[index-1]0x30||tmp[index-1]0x39〃如果接收的字符不是0~9的范围{printf〃\n\rPlease entervalid numberbetween0and9〃;index一;index二tmp[l]-0x30+tmp
[0]-0x30*10;〃将接收字符换算成数值if indexvalue〃如果输入的数值大于valueprintf z,\n\rPlease entervalid numberbetween0and%d〃,value;return OxFF;return index;}ttifdef DEBUGvoidassert_failedu8*file,u32line while1}}ttendif19通过本课程的学习,结合《自动化专业人才培养方案(2009版)》,独立完成课程设计,并撰写课程设计报告,要求
1.第8周结合自己将来的研究或工作方向,选择自己感兴趣的课题;
2.第9周根据课题要求,阅读、收集、整理相关参考资料及产品用户手册,拟出设计方案并分析该设计的应用及其应用领域,要有一定的前瞻性;
3.第10-11周实施设计方案;
①硬件设计可以实验室现有的实验箱为基础(可外部扩展)进行,也可利用自购的开发板;
②配合硬件进行软件设计,在实现题目要求的功能基础上,尽可能增加新功能,使设计更完善;
③软硬件联调,应充分发挥软硬协同设计思想的作用,不断完善系统,并记录调试过程及结果
4.第12周将设计交于指导老师验收,并进行答辩总结该设计的主要内容及主要思想,撰写设计报告;
5.第13周交课程设计报告说明
(1)此为本课程设计考查的书面报告,占总成绩40%;
(2)内容原创、真实,不得雷同,否则无报告成绩;
(3)严格按照科技论文规范写作,字数为3000-4000字,摘要(75-150字)、关键词(3-5个),格式参见“中南民族大学本科毕业论文(设计)规范化要求”、“计算机科学学院本科毕业论文(设计)规范化要求”和“论文格式及写作指南”;正文应包含以下内容
①设计概述设计需求,设计原理,设计框图及描述
②硬件设计硬件电路及描述
③软件设计程序流程图及描述,主要程序说明
④调试与结果调试过程,测试、结果及描述
⑤总结设计总结
(3)广泛收集并阅读相关参考文献,参考文献不少于4篇,其中英文文献不少于1篇;
(5)装订成册,并将本页装订在论文首页;
21.1设计要求STM32RTC对处理器的实时时钟模块进行操22RTC PC作,模块的当前时间通过串口传送给RTC机的超级终端显示,若模块还未设置时间则通过超级终端进行设置
2.3STM32实时时钟简介STM32处理器的实时时钟是一个独立的定时器RTC模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能修改计数器的值可以重新设置系统当前的时间和日期•RTC模块和时钟配置系统RCC_BDCR寄存器处于后备区域,即在系统复位或从待机模式唤醒后,RTC的设置和时间维持不变系统复位后,对后备寄存器和RTC的访问被禁止,这是为了防止对后备区域BKP的意外写操作执行以下操作将使能对后备寄存器和RTC的访问设置寄存器RCJAPB1ENR的PWREN和BKPEN位,使能电源和后备接口时钟设置寄存器PWR.CR的DBP位,使能对后备寄存器和RTC的访问RTC由两个主要部分组成如图1-1所示(APB1APB1第一部分接口)用来和总线相316连此单元还包含一组位寄存器,可通过APB1APB1总线对其进行读写操作APB1APB1接口由总线时钟驱动,用来与(RTC总线接口另一部分核心)由一组可编程计数器组成,分成两个主要模块第一个RTC模块是的预分频模块,它可编程产生最长1RTC TR_CLK RTC为秒的时间基准的预分频o20模块包含了一个位的可(RTC编程分频器预分频器)如果在RTC_CR寄存器中设置了相应的允许位,TR_CLK RTC则在每个周期中产生一个中32断(秒中断)第二个模块是一个位的TR_CLK统时间系统时间按期累加并可编程计数器,可被初始化为当前的系RTC,ALR与存储在寄存器中的可编程时间相RTC.CR比较,如果控制寄存器中设置了相应允许位,比较匹配时将产生一个闹钟中断。