万年历ARM课程设计Word格式文档下载.docx
- 文档编号:16495653
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:18
- 大小:356.51KB
万年历ARM课程设计Word格式文档下载.docx
《万年历ARM课程设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《万年历ARM课程设计Word格式文档下载.docx(18页珍藏版)》请在冰豆网上搜索。
带校准用于RTC的32kHz的晶振。
4、低功耗:
3种低功耗模式:
休眠,停止,待机模式。
为RTC和备份寄存器供电的VBAT。
5、调试模式:
串行调试(SWD)和JTAG接口。
6、DMA:
12通道DMA控制器。
支持的外设:
定时器,ADC,DAC,SPI,IIC和USART。
7、2个12位的us级的A/D转换器(16通道):
A/D测量范围:
V。
双采样和保持能力。
片上集成一个温度传感器。
8、2通道12位D/A转换器:
STM32F103xC,STM32F103xD,STM32F103xE独有。
9、最多高达112个的快速I/O端口:
根据型号的不同,有26,37,51,80,和112的I/O端口,所有的端口都可以映射到16个外部中断向量。
除了模拟输入,所有的都可以接受5V以内的输入。
10、最多多达11个定时器:
4个16位定时器,每个定时器有4个IC/OC/PWM或者脉冲计数器。
2个16位的6通道高级控制定时器:
最多6个通道可用于PWM输出。
2个看门狗定时器(独立看门狗和窗口看门狗)。
Systick定时器:
24位倒计数器。
2个16位基本定时器用于驱动DAC。
11、最多多达13个通信接口:
2个IIC接口(SMBus/PMBus)。
5个USART接口(ISO7816接口,LIN,IrDA兼容,调试控制)。
3个SPI接口(18Mbit/s),两个和IIS复用。
CAN接口()。
USB全速接口。
SDIO接口。
12、ECOPACK封装:
STM32F103xx系列微控制器采用ECOPACK封装形式。
2.总体设计方案
设计任务和要求
1、课程设计目的
(1)了解嵌入式芯片的工作原理,从而学会制作相关的东西。
(2)通过课程设计进一步的了解各种在设计中常用到的程序的作用及程序的调试方法。
(3)进一步了解嵌入式系统以及嵌入式在实际生活中的应用
2、课程设计要求
(1)本次设计要包含ARM板上的几个模块
(2)本次设计要有一定有实际意义(有应用价值)
设计思路
利用STM32的RTC实现一个简易的电子万年历。
RTC实时时钟是一个独立的定时器。
RTC模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。
修改计数器的值可以重新设置系统当前的时间和日期,当用户设置好时间日期后,在超级终端中显示我们所要求的电子万年历的功能。
当时间计数为:
23:
59:
59时将刷新为:
00:
00。
设计中所用到的库文件
用户编写的文件
RTC(实时时钟)简介
实时时钟是一个独立的定时器。
RTC模块拥有一组连续计数的计数器,在
相应软件配置下,可提供时钟日历的功能。
修改计数器的值可以重新设置系统
当前的时间和日期。
RTC模块和时钟配置系统(RCC_BDCR寄存器)是在后备区域,即在系统复
位或从待机模式唤醒后RTC的设置和时间维持不变。
系统复位后,禁止访问后备寄存器和RTC,防止对后备区域(BKP)的意外写
操作。
执行以下操作使能对后备寄存器和RTC的访问:
设置寄存器RCC_APB1ENR的PWREN和BKPEN位来使能电源和后备接口
时钟。
设置寄存器PWR_CR的DBP位使能对后备寄存器和RTC的访问。
当我们需要在掉电之后,又需要RTC时钟正常运行的话,单片机的VBAT脚需外接的锂电池。
当我们重新上电的时候,主电源给VBAT供电,当系统掉电之后VBAT给RTC时钟工作,RTC中的数据都会保持在后备寄存器当中。
野火STM32开发板的VBAT引脚接了的锂电
3.程序代码分析
首先在中将相应库文件的头文件的注释去掉,这样才能够真
正使用这些库,否则将会编译错误。
1./*Uncommentthelinebelowtoenableperipheralheaderfileinclusion*/
2./*#include"
"
*/
3.#include"
4./*#include"
5./*#include"
6./*#include"
7./*#include"
8./*#include"
9./*#include"
10./*#include"
*/
11./*#include"
12.#include"
13./*#include"
14.#include"
15.#include"
16.#include"
17.#include"
18./*#include"
19./*#include"
20./*#include"
21.#include"
22./*#include"
23.#include"
/*HighlevelfunctionsforNVICandSysTick(add-ontoCMSISfunctions)*/
好嘞,配置好库的环境之后,我们就从main函数开始分析。
intmain(void)
{
/*configthesysclockto72M*/
SystemInit();
/*USART1config*/
USART1_Config();
/*配置RTC秒中断优先级*/
NVIC_Configuration();
printf("
\r\nThisisaRTCdemo......\r\n"
);
if(BKP_ReadBackupRegister(BKP_DR1)!
=0xA5A5)
/*Backupdataregistervalueisnotcorrectornotyetprogrammed(when
thefirsttimetheprogramisexecuted)*/
.printf("
\r\nThisisaRTCdemo!
\r\n"
);
printf("
\r\n\nRTCnotyetconfigured...."
/*RTCConfiguration*/
RTC_Configuration();
\r\nRTCconfigured...."
/*Adjusttimebyvaluesentredbytheuseronthehyperterminal*/
Time_Adjust();
BKP_WriteBackupRegister(BKP_DR1,0xA5A5);
}
else
/*CheckifthePowerOnResetflagisset*/
if(RCC_GetFlagStatus(RCC_FLAG_PORRST)!
=RESET)
{
\r\n\nPowerOnResetoccurred...."
/*CheckifthePinResetflagisset*/
elseif(RCC_GetFlagStatus(RCC_FLAG_PINRST)!
\r\n\nExternalResetoccurred...."
\r\nNoneedtoconfigureRTC...."
./*WaitforRTCregisterssynchronization*/
RTC_WaitForSynchro();
/*EnabletheRTCSecond*/
RTC_ITConfig(RTC_IT_SEC,ENABLE);
/*WaituntillastwriteoperationonRTCregistershasfinished*/
RTC_WaitForLastTask();
#ifdefRTCClockOutput_Enable
/*EnablePWRandBKPclocks*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP,ENABLE);
/*AllowaccesstoBKPDomain*/
PWR_BackupAccessCmd(ENABLE);
/*DisabletheTamperPin*/
BKP_TamperPinCmd(DISABLE);
/*TooutputRTCCLK/64onTamperpin,thetamperfunctionalitymustbedisabled*/
/*EnableRTCClockOutputonTamperPin*/
BKP_RTCOutputConfig(BKP_RTCOutputSource_CalibClock);
#endif
/*Clearresetflags*/
RCC_ClearFlag();
/*Displaytimeininfiniteloop*/
Time_Show();
while
(1)
在main函数开始首先调用库函数SystemInit();
将我的系统时钟初始化为
72M。
因为我们在实验中需要用到串口,所以我们调用USART1_Config();
函数将串口配置好。
SystemInit();
和USART1_Config();
这两个函数已在前面相关的教程中讲解过,这里不再详述。
函数用于配置RTC(实时时钟)的中断优先级,我们将
它的主优先级设置为1,次优先级为0。
这里只用到了RTC一个中断,所以RTC的主和次优先级不必太关心。
接下来的代码部分就是真正跟RTC有关的啦:
(1)if()部分首先读取RTC备份寄存器里面的值,看看备份寄存器里面的
值是否正确(如果RTC曾经被设置过的话,备份寄存器里面的值为0XA5A5)或判断这是不是第一次对RTC编程。
如果这两种情况有任何一种发生的话,则调用RTC_Configuration();
(在中实现)函数来初始化RTC,并往电脑的超级终端打印出相应的调试信息。
初始化好RTC之后,调用函数Time_Adjust();
(在中实现)让用户键入(通过超级终端输入)时间值,如下截图所示
4.调试过程
整个设计的调试过程是分步进行的。
1)60秒倒计时的调试:
对深入浅出ARM课本中的万年历源程序进行实现倒计时功能。
倒计时功能实现后再添加LED的提示,即当倒计时至0时所有LED亮否则灭。
同样将添加好的程序进行编译并下载到芯片,然后运行,观察开发板现象看看是否能实现所需功能。
这一项相对简单,所以调试过程也很快成功。
2)、校时、校分的调试:
在能够实现倒计时功能的程序中添加校时校分的程序。
KEY1按下计数器停止计数小时(HOUR)加1,KEY3按下计数器停止计数分钟(MIN)加1。
程序添加完之后编译,编译无错之后下载到芯片,然后运行。
按下KEY1或KEY3,观察是否能实现所需功能。
这个过程运用到了按键,所以存在一个消抖的问题,若消抖不合理可能可能会造成键按一下,小时或分钟可能不止加1。
5.总结
本次ARM嵌入式系统设计主要以STM32F103RB芯片为核心,主要能够实现显示时间、日期、节日、以及24节气和12生肖等功能。
其中时间显示包括时、分、秒,日期显示包括年、月、日,显示部分通过电脑上的超级终端进行显示。
在实训的这五天里,前三天老师每天上午都在讲课,我基本都听不懂,感觉自己都学得好差。
下午在图书馆查找资料,形成设计思想,写出大概的程序。
最后两天时间就是呆在实验室,经常忘了时间,在实验室反复修改,调试。
与同学相互讨论,咨询老师。
在此,我要特别感谢我的指导老师,谢谢他们的指点。
通过这次实训,感觉自己的动手能力还有待提高,当然,在这次实训中,我能够独立的思考。
以前摸棱两可的知识变得更加清晰了。
对ARM感觉没有没有以前那么恐怖了。
这门课程的学习最主要的还是自学,终于理解师傅领进门,修行在个人着句话了。
参考文献
[1]吴明晖,徐睿.基于ARM的嵌入式系统开发与应用[M].人民邮电出版社,2004.
[2]李佳.ARM系列处理器应用技术完全手册[M].人民邮电出版社,.
[3]赖于树.ARM微处理器与应用开发[M].电子工业出版社,2007.
[4]张绮文,谢建雄,谢劲心.ARM嵌入式常用模块与中和系统设计实例精讲[M].电子工业出版社,2007.
[5]刘岚尹勇李京蔚.基于ARM的嵌入式系统开发[M].电子工业出版社,2008.
附录一主程序
#include"
__IOuint32_tTimeDisplay=0;
voidRCC_Configuration(void);
voidNVIC_RTC_Configuration(void);
voidGPIO_Configuration(void);
voidUSART_Configuration(void);
intfputc(intch,FILE*f);
voidRTC_Configuration(void);
voidTime_Regulate(structrtc_time*tm);
voidTime_Adjust(void);
voidTime_Display(uint32_tTimeVar);
voidTime_Show(void);
u8USART_Scanf(u32value);
#defineRTCClockSource_LSE
u8const*WEEK_STR[]={"
日"
"
一"
二"
三"
四"
五"
六"
};
u8const*zodiac_sign[]={"
猪"
鼠"
牛"
虎"
兔"
龙"
蛇"
马"
羊"
猴"
鸡"
狗"
structrtc_timesystmtime;
intmain()
{
RCC_Configuration();
NVIC_RTC_Configuration();
NVIC_TAMPER_Configuration();
GPIO_Configuration();
USART_Configuration();
RCC_APB1PeriphClockCmd(RCC_APB2Periph_ALL|RCC_APB1Periph_ALL,ENABLE);
BKP_DeInit();
BKP_ClearFlag();
BKP_TamperPinLevelConfig(BKP_TamperPinLevel_Low);
BKP_TamperPinCmd(ENABLE);
BKP_ITConfig(ENABLE);
BKP_WriteBackupRegister(BKP_DR1,0xA1A2);
=0xA5A5)
{
printf("
BKP_WriteBackupRegister(BKP_DR1,0xA5A5);
}
else
if(RCC_GetFlagStatus(RCC_FLAG_PORRST)!
=RESET)
{
}
elseif(RCC_GetFlagStatus(RCC_FLAG_PINRST)!
RTC_WaitForSynchro();
RTC_ITConfig(RTC_IT_SEC,ENABLE);
RTC_WaitForLastTask();
#ifdefRTCClockOutput_Enable
#endif
}
voidRCC_Configuration()
SystemInit();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);
voidNVIC_RTC_Configuration()
NVIC_InitTypeDefNVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
=RTC_IRQn;
=1;
=0;
=ENABLE;
NVIC_Init(&
NVIC_InitStructure);
voidGPIO_Configuration()
GPIO_InitTypeDefGPIO_InitStructure;
=GPIO_Pin_9;
=GPIO_Mode_AF_PP;
=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&
GPIO_InitStructure);
=GPIO_Pin_10;
=GPIO_Mode_IN_FLOATING;
voidUSART_Configuration()
USART_InitTypeDefUSART_InitStructure;
=115200;
=USART_WordLength_8b;
=USART_StopBits_1;
=USART_Parity_No;
=USART_HardwareFlowControl_None;
=USART_Mode_Rx|USART_Mode_Tx;
USART_Init(USART1,&
USART_InitStructure);
USART_Cmd(USART1,ENABLE);
intfputc(intch,FILE*f)
USART_SendData(USART1,(unsignedchar)ch);
while(!
(USART1->
SR&
USART_FLAG_TXE));
return(ch);
voidRTC_Configuration()
#ifdefRTCClockSource_LSI
RCC_LSI
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 万年历 ARM 课程设计
![提示](https://static.bdocx.com/images/bang_tan.gif)