内容发布更新时间 : 2024/12/25 0:09:12星期一 下面是文章的全部内容请认真阅读。
实时时钟RTC模块和串口设计电子钟实验
一、实验要求",
对开发板上STM32处理器的RTC模块进行操作。RTC模块的当前时间通过串口传送给PC机的超级终端显示,若RTC模块还未设置时间则通过超级终端进行设置。 RTC的秒中断每发生一次,发光二极管LED1闪烁一次。
二、硬件电路设计
在开发板上STM32F103VET6处理器的VBAT引脚接+3V钮扣电池,PB6引脚接LED1,晶振、USART等均已连接好。
该应用实例不需要额外电路设计,只需将用一根RS232串行通讯线将开发板的COM1口与PC机的串口相连即可。
三、软件设计思路
根据设计要求,软件需实现以下任务: (1) 系统启动后检查RTC是否已设置。由于RTC在BKP区域,当Vdd掉电之后可由后备电源提供电源,当后备电源连接到针脚VBAT上时,RTC的设置不会由于外部电源的断开而丢失。在本例中先写一个值到BKP_DR1中以标示RTC是否已配置,在启动之后程序检查BKP_DR1的值,如果保持不变,则表示有后备电池;若BKP_DR1的值不是已经写入的值,则可能是BKP_DR1的值有误或者由于是第一次运行值还未写进去,则需要配置RTC,并且询问用户当前的时间作为RTC的起始值。
(2) 若BKP_DR1的值正确,则意味着RTC已配置,此时将在超级终端上按照每秒一次的频率更新时间。
(3) 在RTC秒中断发生时,连接到PB.05 的LED1灯改变一次状态,这样闪烁频率为2秒。
四、程序分析
整个工程包含3个源文件:startup_stm32f10x_hd.s、stm32f10x_it.c和main.c,其中startup_stm32f10x_hd.s为启动代码,所有中断服务子程序均在stm32f10x_it.c中,其它函数则在main.c中。下面分别介绍相关的函数,
函数RTC_IRQHandler用于处理秒中断事件,每次秒中断令LED1闪烁一次,在每次遇到23:59:59时将时钟回零。
函数RTC_Configuration用于配置RTC模块。
函数USART_Scanf用于从PC超级终端中获取输入的数字值。
函数Time_Regulate则利用函数USART_Scanf从超级终端获取新的RTC时间值,并回显到终端中。
函数Time_Adjust使用函数Time_Regulate的结果设置新的RTC时间。 函数Time_Show和Time_Display用于每秒一次的时间处理和将RTC时间转换了时分秒字符串送往USART1。
源文件其他函数,例如GPIO、RCC、NVIC、USART的配置,不再作冗述。 编译与链接:
五、程序调试
1. 仿真:
仿真可以通过设置Option for Target中的Debug选项“Use simulator”来进行。
点击调试按钮,进入仿真状态后,打开UART1面板,利用USART窗口来模拟实现COM1的输入和输出。
然后运行程序,可以直接在串口1中得到以下输出,设置好正确格式的时间初值后即可进入时间更新,但是因为非硬件,所以不是精确的秒计时。
2. 下载:
在PC机上运行Windows自带的超级终端串口通信程序(波特率115200、1位停止位、无校验位、无硬件流控制);或者使用其它串口通信程序;
(1) 选择硬件调试模式,点击MDK的Debug菜单,选择Start/Stop Debug Session项或Ctrl+F5键,连接目标板并下载调试代码到目标系统中;也可以使用串口下载方式。
(2) 程序正常运行之后会在超级终端显示以下信息: RTC not yet configured.... RTC configured....
============TimeSettings=================== Please Set Hours:
在PC机上依次输入时钟、分钟、秒钟之后每隔1秒在超级终端上显示一次时间:
Please Set Hours: 12 Please Set Minutes: 0 Please Set Seconds: 0 Time: 12:00:00
同时开发板的LED1灯也会每隔2S闪烁一次。 (3) 调试环境中,按下Reset按钮,PC超级终端上将继续显示正常时间: External Reset occurred.... No need to configure RTC.... Time: 12:03:09 (4) 程序正常运行时断开开发板外部电源,然后重新接上外部电源,PC超级终端上也将会继续显示正常时间:
Power On Reset occurred.... No need to configure RTC.... Time: 12:05:57