欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > DOCX文档下载  

    万年历_ARM课程设计.docx

    • 资源ID:4929865       资源大小:133.82KB        全文页数:20页
    • 资源格式: DOCX        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    万年历_ARM课程设计.docx

    目录475,总结8万年历系统摘要:万年历在日常生活中最常见,应用也最广泛。本次课程设计主要就 是设计一款电子万年历系统,本次嵌入式系统课程设计以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”内核具有一流的外设(1u s的双12位ADC, 4兆位/秒的UART,18兆位/秒的SPI,18MHz的I/O翻转速度)、低功耗(在72MHz 时消耗36mA(所有外设处于工作状态),待机时下降到2uA).最大的集成度(复 位电路、低电压检测、调压器、精确的RC振荡器等八简单的结构和易用的工 具,STM32F10x重要参数主要有供电、容忍5V的I/O管脚、优异的安全时钟模式、 带唤醒功能的低功耗模式、内部RC振荡器、内嵌复位电路、工作温度范围是-40。 C 至+85° C 或 105。C。STM32F103系列性能特点:1、内核:ARM32位Cortex-M3 CPU,最高工作频率72MHz,MHz。单周期乘 法和硬件除法。2、存储器:片上集成32-512KB的Flash存储器。6-64KB的SRAM存储器。3、时钟、复位和电源管理:的电源供电和I/O接口的驱动电压。POR、PDR 和可编程的电压探测器(PVD)。4-16MHz的晶振。内嵌出厂前调校的8MHz RC振 荡电路。内部40 kHz的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测量范围:。双采样 和保持能力。片上集成一个温度传感器。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. /* Uncomment the line below to enable peripheral header file inclusion */2. /*#include""*/3. #include ""4. /*#include""*/5. /*#include""*/6. /*#include""*/7. /*#include""*/8. /*#include""*/9. /*#include""*/10. /*#include ""*/11. /* #include "" */12. #include13. /* #include "" */14. #include ""15. #include ""16. #include ""17. #include ""18. /* #include "" */19. /* #include "" */20. /* #include "" */21. #include ""22. /* #include "" */23. #include "" /* High level functions for NVIC and SysTick (add-on to CMSIS functions) */好嘞,配置好库的环境之后,我们就从main函数开始分析。int main(void)(/* config the sysclock to 72M */SystemInit();/* USART1 config */USART1_Config();/*配置RTC秒中断优先级*/NVIC_Configuration();printf( "rn This is a RTC demo rn");if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)(/* Backup data register value is not correct or not yet programmed (whenthe first time the program is executed) */. printf("rnThis is a RTC demo!rn");printf("rnn RTC not yet configured.");/* RTC Configuration */RTC_Configuration();printf("rn RTC configured.");/* Adjust time by values entred by the user on the hyperterminal */Time_Adjust();BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);else(/* Check if the Power On Reset flag is set */ if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET)(printf("rnn Power On Reset occurred.");/* Check if the Pin Reset flag is set */else if (RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET) (. printf("rnn External Reset occurred.");printf("rn No need to configure RTC."); ./* Wait for RTC registers synchronization */RTC_WaitForSynchro();/* Enable the RTC Second */RTC_ITConfig(RTC_IT_SEC, ENABLE);/* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask();#ifdef RTCClockOutput_Enable/* Enable PWR and BKP clocks */RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);/* Allow access to BKP Domain */PWR_BackupAccessCmd(ENABLE);/* Disable the Tamper Pin */BKP_TamperPinCmd(DISABLE); /* To output RTCCLK/64 on Tamper pin, the tamperfunctionality must bedisabled */* Enable RTC Clock Output on Tamper Pin */BKP_RTCOutputConfig(BKP_RTCOutputSource_CalibClock);#endif/* Clear reset flags */RCC_ClearFlag();/* Display time in infinite loop */Time_Show();while (1)(在main函数开始首先调用库函数SystemInit();将我的系统时钟初始化为 72M。因为我们在实验中需要用到串口,所以我们调用USART1_Config();函数将 串口配置好o SystemInit();和USART1_Config();这两个函数已在前面相关的教 程中讲解过,这里不再详述。NVIC_Configuration();函数用于配置RTC (实时时钟)的中断优先级,我 们将它的主优先级设置为1,次优先级为0。这里只用到了 RTC 一个中断,所以RTC 的主和次优先级不必太关心。接下来的代码部分就是真正跟RTC有关的啦:(1) i f ()部分首先读取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.人民邮电出版 社,20042 李佳.ARM系列处理器应用技术完全手册M.人民邮电出版社,.3 赖于树.ARM微处理器与应用开发M.电子工业出版社,2007.4 张绮文,谢建雄,谢劲M.ARM嵌入式常用模块与中和系统设计实例精讲M. 电子工业出版社,2007.5 刘岚尹勇李京蔚.基于ARM的嵌入式系统开发】M.电子工业出版社, 2008.附录一主程序#include#include#include#include#include "”_IO uint32_t TimeDisplay = 0;void RCC_Configuration(void);void NVIC_RTC_Configuration(void);void GPIO_Configuration(void);void USART_Configuration(void);int fputc(int ch, FILE *f);void RTC_Configuration(void);void Time_Regulate(struct rtc_time *tm);void Time_Adjust(void);void Time_Display(uint32_t TimeVar);void Time_Show(void);u8 USART_Scanf(u32 value);#define RTCClockSource_LSEu8 const *WEEK_STR = ”日”,"一",”二”,”三”,”四”,”五”,”六"u8 const *zodiac_sign = "猪”,”鼠”,"牛","虎”,”兔","龙”,"蛇”,”马","羊”,"猴”,"鸡","狗”; struct rtc_time systmtime;int main()RCC_Configuration();NVIC_RTC_Configuration();NVIC_TAMPER_Configuration();GPIO_Configuration();USART_Configuration();RCC_APB1PeriphClockCmd(RCC_APB2Periph_ALL I 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("rnn RTC not yet configured.");RTC_Configuration();printf("rn RTC configured.");Time_Adjust();BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);elseif (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET)printf("rnn Power On Reset occurred");else if (RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET)printf("rnn External Reset occurred.");printf("rn No need to configure RTC.");RTC_WaitForSynchro();RTC_ITConfig(RTC_IT_SEC, ENABLE);RTC_WaitForLastTask();#ifdef RTCClockOutput_EnableRCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);PWR_BackupAccessCmd(ENABLE);BKP_TamperPinCmd(DISABLE);BKP_RTCOutputConfig(BKP_RTCOutputSource_CalibClock);#endifRCC_ClearFlag();Time_Show();void RCC_Configuration()SystemInit();RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);void NVIC_RTC_Configuration()NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);=RTC_IRQn;=1;=0;=ENABLE;NVIC_Init(&NVIC_InitStructure);void GPIO_Configuration()GPIO_InitTypeDef GPIO_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);void USART_Configuration()USART_InitTypeDef USART_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);int fputc(int ch, FILE *f)USART_SendData(USART1, (unsigned char) ch);while (!(USART1->SR & USART_FLAG_TXE);return (ch);void RTC_Configuration()RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP,ENABLE);PWR_BackupAccessCmd(ENABLE);BKP_DeInit();#ifdef RTCClockSource_LSIRCC_LSICmd(ENABLE);while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY)=RESET)RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);#elif defined RTCClockSource_LSERCC_LSEConfig(RCC_LSE_ON);while(RCC_GetFlagStatus(RCC_FLAG_LSERDY)=RESET)RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);#endifRCC_RTCCLKCmd(ENABLE);#ifdef RTCClockOutput_EnableBKP_TamperPinCmd(DISABLE);BKP_RTCCalibrationClockOutputCmd(ENABLE);#endifRTC_WaitForSynchro();RTC_WaitForLastTask();RTC_ITConfig(RTC_IT_SEC, ENABLE);RTC_WaitForLastTask();#ifdef RTCClockSource_LSIRTC_SetPrescaler(31999);#elif defined RTCClockSource_LSERTC_SetPrescaler(32767);#endifRTC_WaitForLastTask();void Time_Regulate(struct rtc_time *tm)u32 Tmp_YY = 0xFF, Tmp_MM = 0xFF, Tmp_DD = 0xFF, Tmp_HH = 0xFF, Tmp_MI=0xFF, Tmp_SS = 0xFF;printf("rn=Time Settings=");printf("rn 请输入年份(Please Set Years): 20");while (Tmp_YY = 0xFF)Tmp_YY = USART_Scanf(99);printf("nr 年份被设置为:20%nr", Tmp_YY);tm->tm_year = Tmp_YY+2000;Tmp_MM = 0xFF;printf("rn 请输入月份(Please Set Months):");while (Tmp_MM = 0xFF)Tmp_MM = USART_Scanf(12);printf("nr 月份被设置为:%dnr", Tmp_MM);tm->tm_mon= Tmp_MM;Tmp_DD = 0xFF;printf("rn 请输入日期(Please Set Dates):");while (Tmp_DD = 0xFF)Tmp_DD = USART_Scanf(31);printf("nr 日期被设置为:%dnr", Tmp_DD);tm->tm_mday= Tmp_DD;Tmp_HH = 0xFF;printf("rn 请输入时钟(Please Set Hours):");while (Tmp_HH = 0xFF)Tmp_HH = USART_Scanf(23);printf("nr 时钟被设置为:%dnr", Tmp_HH );tm->tm_hour= Tmp_HH;Tmp_MI = 0xFF;printf("rn 请输入分钟(Please Set Minutes):");while (Tmp_MI = 0xFF)Tmp_MI = USART_Scanf(59);printf("nr 分钟被设置为:%dnr", Tmp_MI);tm->tm_min= Tmp_MI;Tmp_SS = 0xFF;printf("rn 请输入秒钟(Please Set Seconds):");while (Tmp_SS = 0xFF)Tmp_SS = USART_Scanf(59);printf("nr 秒钟被设置为:%dnr", Tmp_SS);tm->tm_sec= Tmp_SS;void Time_Adjust()RTC_WaitForLastTask();Time_Regulate(&systmtime);GregorianDay(&systmtime);RTC_SetCounter(mktimev(&systmtime);RTC_WaitForLastTask();void Time_Display(uint32_t TimeVar)static uint32_t FirstDisplay = 1;u8 str15;to_tm(TimeVar, &systmtime);if(! && ! && ! | (FirstDisplay)GetChinaCalendar(u16), (u8), (u8), str);printf("nrnr 今天农历:%,%,%", str0, str1, str,str3);GetChinaCalendarStr(u16),(u8),(u8),str);printf(" %s", str);printf("r 当前时间为:%d年(s年)%d月%d日(星期%s) %:%:%",zodiac_sign%12,WEEK_STR,void Time_Show()printf("nr");while (1)if (TimeDisplay = 1)Time_Display(RTC_GetCounter();TimeDisplay = 0;u8 USART_Scanf(u32 value)u32 index = 0;u32 tmp =0, 0;while (index < 2)while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) = RESET) tmpindex+ = (USART_ReceiveData(USART1);if (tmpindex - 1 < 0x30) II (tmpindex - 1 > 0x39)if(index = 2) && (tmpindex - 1 = 'r')tmp1 = tmp0;tmp0 = 0x30;elseprintf("nr 请输入 09 的数字(Please enter valid number between 0 and 9) ->:");index-;index = (tmp1 - 0x30) + (tmp0 - 0x30) * 10);if (index > value)printf("nr 请输入 0-%d 之间的数字(Please enter valid number between 0 and %d) ->", value);return 0xFF;return index;附录二仿真图Mf)nth5Set5etSetHour sJ:SetRhmiL"):ETC v 口 nEigurN.,.=z =- = -£Settings- 请输入解怯(Figg Set 年份被设置为:2013 请输入月愣(ZLg* 月馅被设置为:3 话输又m期cfxme电 日期被设置为:2S if谕入时钟Hleas-e 时钟震设置为20请输X筮钟施心膈 分替桩设置为 30秒譬莆展置为MR:2600COMT 已关闭 L152O0fbps 8 CTS=C B5R=0 KLSD=O夫篇立刨既B律瓯最低印无或E长窦5印以内)!点击进入打拌插注册页面-丈括淘宝支付!tp: /www. dxi a . £Da/p<b/汝遮访间大虾电孑网的大蜉论坛t!点这里亘接进入wtw. dajtia. Em/hiliiw打开文件l&ff毛发送支怦|保存圈口 |清除圈口 |厂皿遇示军口号 Iqomt 二| 打并串口 | 帮助 | WWW. AACUSi.COAi 扩屐 I厂DTR 厂FHS厂定时发送n 瞭古砍r HEU推送厂发送新行字符串输入很:0旗案跆。龄椿雀漏敲黯鬻喝£5!W)寸阊为.2CH 3年配年)3月*为;30; 30 当前v波特率115W 数据位S停止位1植验位N one 澹控制Hone amt. ncu51. com S : 12附录三设计流程图设置引脚连接串口初始化"7增量中断标志位?

    注意事项

    本文(万年历_ARM课程设计.docx)为本站会员(小飞机)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开