嵌入式课程方案设计书报告0.docx
- 文档编号:25031219
- 上传时间:2023-06-04
- 格式:DOCX
- 页数:22
- 大小:269.32KB
嵌入式课程方案设计书报告0.docx
《嵌入式课程方案设计书报告0.docx》由会员分享,可在线阅读,更多相关《嵌入式课程方案设计书报告0.docx(22页珍藏版)》请在冰豆网上搜索。
嵌入式课程方案设计书报告0
中南民族大学
嵌入式技术与应用
课程设计报告
题目
串口数字时钟设计
学院
计算机科学学院
专业
自动化
班级
自动化四班
姓名
肖映彩
学号
08064112
指导教师
张志俊、田微、李薇、姚为
2011年11月14日
教师评语:
总分:
教师签名:
通过本课程的学习,结合《自动化专业人才培养方案(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)装订成册,并将本页装订在论文首页;
(6)以大班为单位收齐并上交。
目录
摘要1
Abstract1
0引言2
1设计概述2
1.1设计要求2
1.2STM32实时时钟简介2
2硬件电路设计3
3软件程序设计3
3.1需求分析3
3.2程序流程图4
3.3主要程序说明4
4调试过程与结果5
4.1调试过程5
4.2调试结果5
5设计总结6
6参考文献6
7附录7
串口数字时钟设计
摘要
本文介绍了利用处理器STM32F103VET6的实时时钟模块,设计一个简单的数字时钟的方法。
在对处理器STM32F103VET6的实时时钟模块进行正确设置后,处理器会每一秒钟通过串口发送数据到PC机上显示实时时间。
关键词
STM32;实时时钟;串口
SerialPortsDigitalClockDesign
Abstract
ThispaperdescribestheuseofSTM32F103VET6processorofrealtimeclockmodule,designasimpledigitalclockmethod.ToSTM32F103VET6processorintherealtimeclockmoduleaftersetcorrectly,processorwilleachsecondsthroughaserialportsendingdatatoPCdisplaysreal-timetime.
Keywords
STM32;realtimeclock;serialports
0引言
在现代人们的生活中,时钟几乎是不能缺少的东西。
在许多单片机的应用系统中,实时时钟的设计是一个不可或缺的部分,要设计一个高精度、智能化的时钟往往需要花费一番心血。
STM32处理器带有实时时钟模块,并有一个秒中断,能保证时钟的精度。
1设计概述
1.1设计要求
对STM32处理器的实时时钟(RTC)模块进行操作,RTC模块的当前时间通过串口传送给PC机的超级终端显示,若RTC模块还未设置时间则通过超级终端进行设置。
1.2STM32实时时钟简介
STM32处理器的实时时钟是一个独立的定时器。
RTC模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。
修改计数器的值可以重新设置系统当前的时间和日期。
RTC模块和时钟配置系统(RCC_BDCR寄存器)处于后备区域,即在系统复位或从待机模式唤醒后,RTC的设置和时间维持不变。
系统复位后,对后备寄存器和RTC的访问被禁止,这是为了防止对后备区域(BKP)的意外写操作。
执行以下操作将使能对后备寄存器和RTC的访问:
●设置寄存器RCC_APB1ENR的PWREN和BKPEN位,使能电源和后备接口时钟
●设置寄存器PWR_CR的DBP位,使能对后备寄存器和RTC的访问。
RTC由两个主要部分组成如图1-1所示:
图1-1RTC框图
第一部分(APB1接口)用来和APB1总线相连。
此单元还包含一组16位寄存器,可通过APB1总线对其进行读写操作。
APB1接口由APB1总线时钟驱动,用来与APB1总线接口。
另一部分(RTC核心)由一组可编程计数器组成,分成两个主要模块。
第一个模块是RTC的预分频模块,它可编程产生最长为1秒的RTC时间基准TR_CLK。
RTC的预分频模块包含了一个20位的可编程分频器(RTC预分频器)。
如果在RTC_CR寄存器中设置了相应的允许位,则在每个TR_CLK周期中RTC产生一个中断(秒中断)。
第二个模块是一个32位的可编程计数器,可被初始化为当前的系统时间。
系统时间按TR_CLK周期累加并与存储在RTC_ALR寄存器中的可编程时间相比较,如果RTC_CR控制寄存器中设置了相应允许位,比较匹配时将产生一个闹钟中断。
第一部分(APB1接口)用来和APB1总线相连。
此单元还包含一组16位寄存器,可通过APB1总线对其进行读写操作。
APB1接口由APB1总线时钟驱动,用来与APB1总线接口。
另一部分(RTC核心)由一组可编程计数器组成,分成两个主要模块。
第一个模块是RTC的预分频模块,它可编程产生最长为1秒的RTC时间基准TR_CLK。
RTC的预分频模块包含了一个20位的可编程分频器(RTC预分频器)。
如果在RTC_CR寄存器中设置了相应的允许位,则在每个TR_CLK周期中RTC产生一个中断(秒中断)。
第二个模块是一个32位的可编程计数器,可被初始化为当前的系统时间。
系统时间按TR_CLK周期累加并与存储在RTC_ALR寄存器中的可编程时间相比较,如果RTC_CR控制寄存器中设置了相应允许位,比较匹配时将产生一个闹钟中断。
2硬件电路设计
在系统板上STM32F103VET6处理器的VBAT引脚接+3V钮扣电池,PC6引脚接LED1,串口电路设计如图2-1所示:
图2-1串口电路
有了以上电路,使用该实例时只需将用一根RS232串行通讯线将系统板的USART1口与PC机的串口相连即可。
3软件程序设计
3.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-1所示:
3.3主要程序说明
整个工程包含3个源文件:
startup_stm32f10x_hd.s、stm32f10x_it.c和main.c,其中startup_stm32f10x_hd.s为启动代码,所有中断服务子程序均在stm32f10x_it.c中,其它函数则在main.c中。
下面分别介绍各个主要的函数,具体详细程序见附录1程序清单:
●stm32f10x_it.c文件中函数RTC_IRQHandler用于处理RTC秒中断事件,每次秒中断令LED1闪烁一次,在每次遇到23:
59:
59时将时钟回零。
●main.c函数RTC_Configuration用于配置RTC模块。
函数USART_Scanf用于从PC超级终端中获取数字值,Time_Regulate利用函数USART_Scanf从超级终端获取新的RTC时间值,函数Time_Adjust则利用函数USART_Scanf设置新的RTC时间。
函数Time_Display和Time_Show用于将RTC时间转换了字符串送往USART1。
4调试过程与结果
3
4
4.1调试过程
●使用KeiluVision3打开工程RTC-USART.Uv2,用仿真器连接系统板和KeiluVision3,编译链接工程;
●使用标准串口线,连接系统板上的USART1接口和PC机的串口;
●打开串口调试工具ComTools,设置通讯端口参数为:
COM1端口,波特率9600,8位数据位,1位停止位,无校验位,无硬件流控制。
●选择硬件调试模式(也可采用软件调试模式,利用USART窗口来模拟实现COM1的输入和输出),点击KeiluVision3的Debug菜单,选择Start/StopDebugSession项或Ctrl+F5键,远程连接目标板并下载调试代码到目标系统中;
4.2调试结果
例程正常运行之后会在超级终端显示以下信息:
RTCnotyetconfigured....
RTCconfigured....
============TimeSettings===================
PleaseSetHours:
在PC机上依次输入时钟、分钟、秒钟之后每隔1秒在ComTools上显示一次时间,同时开发板的LED1灯也会每隔1s闪烁一次。
显示效果图4-1所示:
图4-1
程序正常运行时断开系统板外部电源,然后重新接上外部电源,在ComTools也将继续显示正常时间。
显示效果图4-2所示:
图4-1
取下系统板上的纽扣电池,并断开外部电源,然后重新接上外部电源,PC超级终端上将无法继续正常显示时间,要重新设置时间才能正常显示。
5设计总结
本次课程设计设计的是串口数字时钟,是针对处理器STM32的实时时钟模块和串行通讯口设计的一个应用系统。
该系统通过PC机的超级终端提供人际交互界面,实现和STM32的通讯,在设置好时间后,STM32会每一秒钟在超级终端上输出实时时间。
通过设计该系统,我学习了STM32实时时钟模块和通用串行输入输出端口的应用,也对其他通用模块有了一定的了解。
6参考文献
[1]意法半导体(中国)投资有限公司.STM32F10x微控制器参考手册.2010
[2]意法半导体(中国)投资有限公司.STM32固件库使用手册的中文翻译版.2010
7
附录
stm32f10x_it.c文件:
voidRTC_IRQHandler(void)
{
if(RTC_GetITStatus(RTC_IT_SEC)!
=RESET)//读取秒中断状态
{
RTC_ClearITPendingBit(RTC_IT_SEC);//清除秒中断标志
GPIO_WriteBit(GPIOB,GPIO_Pin_6,
(BitAction)(1-GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_6)));//LED1闪烁
TimeDisplay=1;
RTC_WaitForLastTask();//等待上一次对RTC寄存器的写操作完成
if(RTC_GetCounter()==0x00015180)//当前时间是23:
59:
59时复位为0:
0:
0
{
RTC_SetCounter(0x0);//写入复位值
RTC_WaitForLastTask();
}
}
}
main.c文件:
#include"stm32f10x.h"
#include"stm32f10x_bkp.h"
#include"stm32f10x_gpio.h"
#include"stm32f10x_rcc.h"
#include"stm32f10x_usart.h"
#include"stm32f10x_rtc.h"
#include"stm32f10x_flash.h"
#include"stm32f10x_pwr.h"
#include"misc.h"
#include
vu32TimeDisplay=0;
voidRCC_Configuration(void);
voidGPIO_Configuration(void);
voidUSART_Configuration(void);
voidRTC_Configuration(void);
voidNVIC_Configuration(void);
u32Time_Regulate(void);
voidTime_Adjust(void);
voidTime_Show(void);
voidTime_Display(u32TimeVar);
u8USART_Scanf(u32value);
intmain(void)
{
#ifdefDEBUG
debug();
#endif
RCC_Configuration();//系统时钟初始化
NVIC_Configuration();//中断初始化
GPIO_Configuration();//GPIO初始化
USART_Configuration();//串口1初始化
if(BKP_ReadBackupRegister(BKP_DR1)!
=0xA5A5)//判断保存在备份寄存器的RTC标志是否已经被配置过
{
printf("\r\n\nRTCnotyetconfigured....");
RTC_Configuration();//RTC初始化
printf("\r\nRTCconfigured....");
Time_Adjust();//设置RTC时钟参数
BKP_WriteBackupRegister(BKP_DR1,0xA5A5);//RTC设置后,将已配置标志写入备份数据寄存器
}
else
{
if(RCC_GetFlagStatus(RCC_FLAG_PORRST)!
=RESET)//检查是否掉电重启
{
printf("\r\n\nPowerOnResetoccurred....");
}
elseif(RCC_GetFlagStatus(RCC_FLAG_PINRST)!
=RESET)//检查是否reset复位
{
printf("\r\n\nExternalResetoccurred....");
}
printf("\r\nNoneedtoconfigureRTC....");
RTC_WaitForSynchro();//等待RTC寄存器被同步
RTC_ITConfig(RTC_IT_SEC,ENABLE);//使能秒中断
RTC_WaitForLastTask();
}
RCC_ClearFlag();
Time_Show();//显示时钟
}
voidRCC_Configuration(void)
{
RCC_DeInit();//将外设RCC寄存器重设为缺省值
RCC_HSEConfig(RCC_HSE_ON);//设置外部高速晶振
HSEStartUpStatus=RCC_WaitForHSEStartUp();//等待HSE起振
if(HSEStartUpStatus==SUCCESS)//如果HSE成功起振
{
RCC_HCLKConfig(RCC_SYSCLK_Div1);//设置AHB时钟为系统时钟
RCC_PCLK2Config(RCC_HCLK_Div1);//设置高速AHB时钟
RCC_PCLK1Config(RCC_HCLK_Div2);//设置低速AHB时钟
FLASH_SetLatency(FLASH_Latency_2);//设置代码延时值为2延时周期
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);//设置PLL的输入时钟为HSE时钟,倍频系数为9
RCC_PLLCmd(ENABLE);//使能PLL
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET)//等待PLL就绪
{
}
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//选择PLL作为系统时钟
while(RCC_GetSYSCLKSource()!
=0x08)//等待PLL作为系统时钟
{
}
}
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA|
RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);//使能外设时钟
}
voidNVIC_Configuration(void)
{
NVIC_InitTypeDefNVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel=RTC_IRQn;//配置RTC秒中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
voidGPIO_Configuration(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;//PC.06
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//最高输出速率50MHz
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出模式
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//PA.09,串口发送引脚
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出模式
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;//PA.10,串口接收引脚
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空输入模式
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
voidRTC_Configuration(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|
RCC_APB1Periph_BKP,ENABLE);//使能PWR和BKP时钟
PWR_BackupAccessCmd(ENABLE);//使能RTC和后备寄存器访问
BKP_DeInit();//重置BKP
RCC_LSEConfig(RCC_LSE_ON);
while(RCC_GetFlagStatus(RCC_FLAG_LSERDY)==RESET)//等待LSE就绪
{
}
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);//选择LSE作为RTC时钟
RTC_WaitForLastTask();//等待最近一次对RTC寄存器的写操作完成
}
u32Time_Regulate(void)
{
u32Tmp_HH=0xFF,Tmp_MM=0xFF,Tmp_SS=0xFF;
printf("\r\n==============TimeSettings=====================================");
printf("\r\nPleaseSetHours");
while(Tmp_HH==0xFF)
{
Tmp_HH=USART_Scanf(23);//输入小时,输入的值小于23
}
printf(":
%d",Tmp_HH);
printf("\r\nPleaseSetMinutes");
while(Tmp_MM==0xFF)
{
Tmp_MM=USART_Scanf(59);//输入分,输入的值小于59
}
printf(":
%d",Tmp_MM);
printf("\r\nPlease
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 课程 方案设计 书报