完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
RTC实时时钟
1. RTC实时时钟简介 STM32的实时时钟RTC是一个独立的定时器,RTC模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能,修改计数器的值可以重新设置系统当前的时间和日期 RTC模块和时钟配置系统(RCC_BDCR寄存器)是在后背区域,即在系统复位或从待机模式唤醒后RTC的设置和事件维持不变。但是在系统复位后,会自动禁止访问后备寄存器和RTC,以防止对后备区域(BKP)的意外操作。所以在要设置时间之前,要先取消备份区域写保护。RTC的简化框图如下所示: RTC由两个主要部分组成:第一部分(APB1接口)用来和APB1总线相连,此单元还包含一组16位寄存器,可通过APB1总线对其进行读写操作;另一部分(RTC核心)由一组可编程计数器组成,分为两个主要模块,第一个模块是RTC的预分频模块,可编程产生1秒的RTC时间基准TR_CLK。第二个模块是一个32位的可编程计数器(RTC_CNT),可被初始化为当前的系统时间,一个32位的时钟计数器按秒钟计算可以记录4294967296秒,约136年左右,一般应用已经足够 RTC还有一个闹钟寄存器RTC_ALR,用于产生闹钟。系统时间按TR_CLK周期累加并与存储在RTC_ALR寄存器中的可编程时间相比较,如果RTC_CNT = RTC_ALR将产出一个闹钟中断,从而实现闹钟功能 2. 硬件设计 本实验通过RTC的秒中断来持续输出时间通过串口1打印出来,并通过设置闹钟中断实现一个闹钟提醒,D1指示灯提示系统正常运行 D1指示灯 USART1串口 RTC 3. 软件设计 3.1 STM32CubeMX设置 RCC设置中开启外部高速晶振(HSE)以及外部低速晶振(LSE),时钟树中将RTC的频率设置为32.768KHz PC0设置为GPIO推挽输出模式、上拉、高速、默认输出电平为高电平 USART1选择为异步通讯方式,波特率设置为115200Bits/s,传输数据长度为8Bit,无奇偶校验,1位停止位 激活时钟源,激活日历,选择No RTC Output,设置初始日期和时间 使能RTC全局中断和闹钟中断 输入工程名,选择工程路径(不要有中文),选择MDK-ARM V5;勾选Generated periphera initialization as a pair of ‘.c/.h’ files per IP ;点击GENERATE CODE,生成工程代码 3.2 MDK-ARM编程 在rtc.c文件中编写秒中断处理回调函数和闹钟中断处理函数 extern RTC_DateTypeDef GetDate; extern RTC_TimeTypeDef GetTime; void HAL_RTCEx_RTCEventCallback(RTC_HandleTypeDef *hrtc){ HAL_RTC_GetTime(hrtc,&GetTime,RTC_FORMAT_BIN); HAL_RTC_GetDate(hrtc,&GetDate,RTC_FORMAT_BIN); printf(“Date:%02d-%02d-%02drn”,2000+GetDate.Year,GetDate.Month,GetDate.Date); printf(“Time:%02d:%02d:%02drn”,GetTime.Hours,GetTime.Minutes,GetTime.Seconds); printf(“rn”); } void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc){ printf(“Alarm Active.。.!!!n”); } 在main.c文件中编写闹钟设置相关代码并开启相关中断 /* USER CODE BEGIN PV */ RTC_DateTypeDef GetDate; RTC_TimeTypeDef GetTime; RTC_AlarmTypeDef sAlarm; /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); int main(void){ HAL_Init(); SystemClock_Config(); /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_RTC_Init(); MX_USART1_UART_Init(); /* USER CODE BEGIN 2 */ __HAL_RTC_SECOND_ENABLE_IT(&hrtc,RTC_IT_SEC); //开启秒中断 sAlarm.Alarm = RTC_ALARM_A; sAlarm.AlarmTime.Hours = 16; sAlarm.AlarmTime.Minutes = 20; sAlarm.AlarmTime.Seconds = 30; HAL_RTC_SetAlarm_IT(&hrtc,&sAlarm,RTC_FORMAT_BIN); //设置闹钟并使能闹钟中断 /* USER CODE END 2 */ while (1){ HAL_Delay(1000); HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0); } } 4. 下载验证 编译无误后下载到开发板,可以看到D1指示灯每1s闪烁一次,串口助手每1s会打印出相应的日期和时间,闹钟设置的时间到后会打印出闹钟中断函数里的相关语句 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1602 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1536 浏览 1 评论
967 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
680 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1579 浏览 2 评论
1861浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
642浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
514浏览 3评论
528浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
501浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-19 19:47 , Processed in 1.032052 second(s), Total 79, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号