




已阅读5页,还剩18页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目录1引言12.总体设计方案22.1设计任务和要求22.2设计思路32.3设计中所用到的库文件32.4 RTC(实时时钟)简介33.程序代码分析44.调试过程75.总结8参考文献9附录一 主程序10附录二 仿真图20附录三 设计流程图21万年历系统摘要:万年历在日常生活中最常见,应用也最广泛。本次课程设计主要就是设计一款电子万年历系统,本次嵌入式系统课程设计以STM32F103RB芯片为核心,主要能够实现显示时间、日期、节日、以及24节气和12生肖等功能。其中时间显示包括时、分、秒,日期显示包括年、月、日,显示部分通过电脑上的超级终端进行显示,当程序编译无误后,将其下载至开发板中,然后通过超级终端进行显示,开始时用户需要自行设置时间和日期,然后万年历系统才会按照用户设计的功能开始工作。关键字:STM32F103RB 超级终端 时间日期显示 24节气显示 十二生肖显示 1引言 STM32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M3内核。按性能有不同的系列:STM32F103“增强型”系列和STM32F101“基本型”系列。此次我们所使用的STM32F103RB芯片就是增强型系列,增强型系列时钟频率达到72MHz,是同类产品中性能最高的产品;基本型时钟频率为36MHz,以16位产品的价格得到比16位产品大幅提升的性能,是16位产品用户的最佳选择。两个系列都内置32K到128K的闪存,不同的是SRAM的最大容量和外设接口的组合。时钟频率72MHz时,从闪存执行代码,STM32功耗36mA,是32位市场上功耗最低的产品,相当于0.5mA/MHz。 ARM公司的高性能”Cortex-M3”内核具有一流的外设(1s的双12位ADC,4兆位/秒的UART,18兆位/秒的SPI,18MHz的I/O翻转速度)、低功耗(在72MHz时消耗36mA(所有外设处于工作状态),待机时下降到2A)、最大的集成度(复位电路、低电压检测、调压器、精确的RC振荡器等)简单的结构和易用的工具,STM32F10x重要参数主要有2V-3.6V供电、容忍5V的I/O管脚、优异的安全时钟模式、带唤醒功能的低功耗模式、内部RC振荡器、内嵌复位电路、工作温度范围是-40C至+85C或105C。STM32F103系列性能特点:1、内核:ARM32位Cortex-M3 CPU,最高工作频率72MHz,1.25DMIPS/MHz。单周期乘法和硬件除法。2、存储器:片上集成32-512KB的Flash存储器。6-64KB的SRAM存储器。3、时钟、复位和电源管理:2.0-3.6V的电源供电和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测量范围:0-3.6 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接口(18 Mbit/s),两个和IIS复用。CAN接口(2.0B)。USB 2.0全速接口。SDIO接口。12、ECOPACK封装:STM32F103xx系列微控制器采用ECOPACK封装形式。2.总体设计方案2.1设计任务和要求 1、 课程设计目的(1) 了解嵌入式芯片的工作原理,从而学会制作相关的东西。 (2) 通过课程设计进一步的了解各种在设计中常用到的程序的作用及程序的调试方法。 (3) 进一步了解嵌入式系统以及嵌入式在实际生活中的应用2、 课程设计要求(1) 本次设计要包含ARM板上的几个模块 (2) 本次设计要有一定有实际意义(有应用价值) 2.2设计思路利用STM32 的RTC 实现一个简易的电子万年历。RTC实时时钟是一个独立的定时器。RTC模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期,当用户设置好时间日期后,在超级终端中显示我们所要求的电子万年历的功能。当时间 计数为:23:59:59 时将刷新为:00:00:00。2.3设计中所用到的库文件 start_stm32f10x_hd.c core_cm3.c system_stm32f10x.c stm32f10x_gpio.c stm32f10x_rcc.c stm32f10x_usart.c stm32f10x_pwr.c stm32f10x_bkp.c stm32f10x_rtc.c stm32f10x_misc.c 用户编写的文件 main.c stm32f10x_it.c usart.c rtc.c 2.4 RTC(实时时钟)简介 实时时钟是一个独立的定时器。RTC模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。 RTC模块和时钟配置系统(RCC_BDCR寄存器)是在后备区域,即在系统复位或从待机模式唤醒后RTC的设置和时间维持不变。 系统复位后,禁止访问后备寄存器和RTC,防止对后备区域(BKP)的意外写操作。执行以下操作使能对后备寄存器和RTC的访问: 设置寄存器RCC_APB1ENR的PWREN和BKPEN位来使能电源和后备接口时钟。 设置寄存器PWR_CR的DBP位使能对后备寄存器和RTC的访问。 当我们需要在掉电之后,又需要RTC时钟正常运行的话,单片机的VBAT脚需外接3.3V的锂电池。当我们重新上电的时候,主电源给VBAT供电,当系统掉电之后VBAT给RTC时钟工作,RTC中的数据都会保持在后备寄存器当中。 野火STM32开发板的VBAT引脚接了3.3V的锂电3. 程序代码分析 首先在 stm32f10x_conf.g 中将相应库文件的头文件的注释去掉,这样才能够真正使用这些库,否则将会编译错误。 1. /* Uncomment the line below to enable peripheral header file inclusion */ 2. /* #include stm32f10x_adc.h */ 3. #include stm32f10x_bkp.h 4. /* #include stm32f10x_can.h */ 5. /* #include stm32f10x_crc.h */ 6. /* #include stm32f10x_dac.h */ 7. /* #include stm32f10x_dbgmcu.h */ 8. /* #include stm32f10x_dma.h */ 9. /* #include stm32f10x_exti.h */ 10. /*#include stm32f10x_flash.h*/ 11. /* #include stm32f10x_fsmc.h */ 12. #include stm32f10x_gpio.h 13. /* #include stm32f10x_i2c.h */ 14. #include stm32f10x_iwdg.h 15. #include stm32f10x_pwr.h 16. #include stm32f10x_rcc.h 17. #include stm32f10x_rtc.h 18. /* #include stm32f10x_sdio.h */ 19. /* #include stm32f10x_spi.h */ 20. /* #include stm32f10x_tim.h */ 21. #include stm32f10x_usart.h 22. /* #include stm32f10x_wwdg.h */ 23. #include misc.h /* 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 (when the 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 tamper functionality must be disabled */ /* 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();函数将串口配置好。SystemInit();和USART1_Config();这两个函数已在前面相关的教程中讲解过,这里不再详述。 NVIC_Configuration();函数用于配置RTC(实时时钟)的中断优先级,我们将它的主优先级设置为 1,次优先级为0。这里只用到了RTC一个中断,所以RTC的主和次优先级不必太关心。 接下来的代码部分就是真正跟RTC有关的啦: (1)i f ( ) 部分首先读取 RTC 备份寄存器里面的值,看看备份寄存器里面的值是否正确(如果RTC曾经被设置过的话,备份寄存器里面的值为0XA5A5)或判断这是不是第一次对RTC编程。如果这两种情况有任何一种发生的话,则调用RTC_Configuration(); (在rtc.c中实现)函数 来初始化 RTC,并往电脑的超级终端打印出相应的调试信息。初始化好RTC之后,调用函数Time_Adjust();(在rtc.c中实现)让用户键入(通过超级终端输入)时间值,如下截图所示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的嵌入式系统开发与应用. 人民邮电出版社,2004.2李佳. ARM系列处理器应用技术完全手册. 人民邮电出版社,2006.3赖于树. ARM微处理器与应用开发. 电子工业出版社,2007.4张绮文,谢建雄,谢劲心.ARM嵌入式常用模块与中和系统设计实例精讲. 电子工业出版社, 2007.5刘岚 尹勇 李京蔚. 基于ARM的嵌入式系统开发. 电子工业出版社, 2008. 附录一 主程序#include stm32f10x.h#include stdio.h #include calendar.h#include date.h#include tamper.h_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 | 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_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();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); NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);void GPIO_Configuration() GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure);void USART_Configuration() USART_InitTypeDef USART_InitStructure;USART_InitStructure.USART_BaudRate = 115200;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_Parity = USART_Parity_No ;USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = 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_LSI RCC_LSICmd(ENABLE); while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY)=RESET) RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI); #elif defined RTCClockSource_LSE RCC_LSEConfig(RCC_LSE_ON); while(RCC_GetFlagStatus(RCC_FLAG_LSERDY)=RESET) RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); #endif RCC_RTCCLKCmd(ENABLE); #ifdef RTCClockOutput_Enable BKP_TamperPinCmd(DISABLE); BKP_RTCCalibrationClockOutputCmd(ENABLE); #endif RTC_WaitForSynchro(); RTC_WaitForLastTask(); RTC_ITConfig(RTC_IT_SEC, ENABLE); RTC_WaitForLastTask(); #ifdef RTCClockSource_LSI RTC_SetPrescaler(31999); #elif defined RTCClockSource_LSE RTC_SetPrescaler(32767); #endif RTC_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%0.2dnr, 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(&sy
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 午餐科学搭配课件
- 硬笔点画教学课件
- 课件桥梁教学课件
- 应急处置培训课件
- 课件标准尺寸
- 课件末班教学课件
- 儿童创意口罩设计入门
- 表演基础全套课件
- 课件显示快捷方式
- 锂电行业考试题及答案
- 化工企业安全管理评估手册 依据化工过程安全管理导则AQ3034-2022
- 儿童医院进修工作思想汇报儿童血液系统疾病的诊断与治疗新进展
- 泛海煤制60万吨甲醇项目可行性研究报告
- 《复杂世界简单规律》课件
- 加油船租赁油船租赁合同
- 智能高速铁路概论-课件-第一章-世界智能铁路发展-
- 空间向量及其运算练习题
- 《城市轨道交通运营管理(第2版)》(李建明) 项目七
- 九年级英语人教版Unit 1 How Can we become good learners 单元话题书面表达 真题+模拟(含解析)
- 医学交流课件:腹痛
- 六年级上册数学西师大版知识要点
评论
0/150
提交评论