万年历ARM课程设计.docx
- 文档编号:3590693
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:18
- 大小:356.51KB
万年历ARM课程设计.docx
《万年历ARM课程设计.docx》由会员分享,可在线阅读,更多相关《万年历ARM课程设计.docx(18页珍藏版)》请在冰豆网上搜索。
万年历ARM课程设计
万年历系统
摘要:
万年历在日常生活中最常见,应用也最广泛。
本次课程设计主要就是设计一款电子万年历系统,本次嵌入式系统课程设计以STM32F103RB芯片为核心,主要能够实现显示时间、日期、节日、以及24节气和12生肖等功能。
其中时间显示包括时、分、秒,日期显示包括年、月、日,显示部分通过电脑上的超级终端进行显示,当程序编译无误后,将其下载至开发板中,然后通过超级终端进行显示,开始时用户需要自行设置时间和日期,然后万年历系统才会按照用户设计的功能开始工作。
关键字:
STM32F103RB超级终端时间日期显示24节气显示十二生肖显示
1引言
STM32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM内核。
按性能有不同的系列:
STM32F103“增强型”系列和STM32F101“基本型”系列。
此次我们所使用的STM32F103RB芯片就是增强型系列,增强型系列时钟频率达到72MHz,是同类产品中性能最高的产品;基本型时钟频率为36MHz,以16位产品的价格得到比16位产品大幅提升的性能,是16位产品用户的最佳选择。
两个系列都内置32K到128K的闪存,不同的是SRAM的最大容量和外设接口的组合。
时钟频率72MHz时,从闪存执行代码,STM32功耗36mA,是32位市场上功耗最低的产品,相当于MHz。
ARM公司的高性能”Cortex-M3”内核具有一流的外设(1μs的双12位ADC,4兆位/秒的UART,18兆位/秒的SPI,18MHz的I/O翻转速度)、低功耗(在72MHz时消耗36mA(所有外设处于工作状态),待机时下降到2μA)、最大的集成度(复位电路、低电压检测、调压器、精确的RC振荡器等)\简单的结构和易用的工具,STM32F10x重要参数主要有供电、容忍5V的I/O管脚、优异的安全时钟模式、带唤醒功能的低功耗模式、内部RC振荡器、内嵌复位电路、工作温度范围是-40°C至+85°C或105°C。
STM32F103系列性能特点:
1、内核:
ARM32位Cortex-M3CPU,最高工作频率72MHz,MHz。
单周期乘法和硬件除法。
2、存储器:
片上集成32-512KB的Flash存储器。
6-64KB的SRAM存储器。
3、时钟、复位和电源管理:
的电源供电和I/O接口的驱动电压。
POR、PDR和可编程的电压探测器(PVD)。
4-16MHz的晶振。
内嵌出厂前调校的8MHzRC振荡电路。
内部40kHz的RC振荡电路。
用于CPU时钟的PLL。
带校准用于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:
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();
printf("\r\nRTCconfigured....");
/*Adjusttimebyvaluesentredbytheuseronthehyperterminal*/
Time_Adjust();
BKP_WriteBackupRegister(BKP_DR1,0xA5A5);
}
else
{
/*CheckifthePowerOnResetflagisset*/
if(RCC_GetFlagStatus(RCC_FLAG_PORRST)!
=RESET)
{
printf("\r\n\nPowerOnResetoccurred....");
}
/*CheckifthePinResetflagisset*/
elseif(RCC_GetFlagStatus(RCC_FLAG_PINRST)!
=RESET)
{
.printf("\r\n\nExternalResetoccurred....");
}
printf("\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();这两个函数已在前面相关的教程中讲解过,这里不再详述。
NVIC_Configuration();函数用于配置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""
#include""
#include""
#include""
#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();
PWR_BackupAccessCmd(ENABLE);
BKP_ClearFlag();
BKP_TamperPinLevelConfig(BKP_TamperPinLevel_Low);
BKP_TamperPinCmd(ENABLE);
BKP_ITConfig(ENABLE);
BKP_WriteBackupRegister(BKP_DR1,0xA1A2);
if(BKP_ReadBackupRegister(BKP_DR1)!
=0xA5A5)
{
printf("\r\n\nRTCnotyetconfigured....");
RTC_Configuration();
printf("\r\nRTCconfigured....");
Time_Adjust();
BKP_WriteBackupRegister(BKP_DR1,0xA5A5);
}
else
{
if(RCC_GetFlagStatus(RCC_FLAG_PORRST)!
=RESET)
{
printf("\r\n\nPowerOnResetoccurred....");
}
elseif(RCC_GetFlagStatus(RCC_FLAG_PINRST)!
=RESET)
{
printf("\r\n\nExternalResetoccurred....");
}
printf("\r\nNoneedtoconfigureRTC....");
RTC_WaitForSynchro();
RTC_ITConfig(RTC_IT_SEC,ENABLE);
RTC_WaitForLastTask();
}
#ifdefRTCClockOutput_Enable
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP,ENABLE);
PWR_BackupAccessCmd(ENABLE);
BKP_TamperPinCmd(DISABLE);
BKP_RTCOutputConfig(BKP_RTCOutputSource_CalibClock);
#endif
RCC_ClearFlag();
Time_Show();
}
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;
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
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()
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP,ENABLE);
PWR_BackupAccessCmd(ENABLE);
BKP_DeInit();
#ifdefRTCClockSource_LSI
RCC_LSI
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 万年历 ARM 课程设计
![提示](https://static.bdocx.com/images/bang_tan.gif)