蓝桥杯嵌入式RTC闹钟

功能:主要实现设置时间以及多次设置闹钟中断。

百度云:https://pan.baidu.com/s/15RbaZY3aH4yC6xRyvhaqWw?pwd=6666 
提取码:6666

1.RCC配置

 

然后回车一下。

因为开发板上接的是24MHz所以这里填1处24,官方给的历程都是80MHz所以4处填80。

2.SYS配置

防止只能下载一次程序所以这里设置为Serial Wire。

 3.RTC配置

这里的时钟源我们使用HSE分频之后为750KHz。

 

 这里我们使能时钟和日历以及闹钟A。

我们使用24小时制,

RTC时钟频率=RTC时钟源/(Asynchronous Predivider value+1)/(Synchronous Predivider value+1)=750K/(125-1+1)/(6000-1+1)=1Hz,也就是1秒

 我们这里使用BCD形式进行赋值。

 这里我们忽略日期,也就相当于时间等于闹钟时间就进入中断。

这里我们使能闹钟中断。

设置好名字以及用keil编写程序 。

勾上这个。

 

点击生成代码。

 4.代码编写

 点开rtc.c找到

 复制一下

写一下设置闹钟时间的函数

 

打开stm32g4xx_hal_rtc.c,右击打开对应的头文件,拉到最后。 

 找到回调函数,复制一下,重新编写回调函数。

 这里为设置日期和时间的函数,以及读取时间和日期的函数。

因为是BCD码所以Set_Alarm(sTime.Hours,sTime.Minutes,sTime.Seconds);传入的参数一定为十六进制。例如: Set_Alarm(0,0,0x10);否则不好判断什么时候进入中断。

 到此RTC闹钟实验完毕。

如果有错误还请指正,谢谢。

### 蓝桥杯嵌入式系统RTC闹钟功能的实现 在STM32微控制器中,RTC模块用于提供实时时钟服务,支持多种特性包括定时唤醒和闹钟功能。为了配置RTC并启用其闹钟功能,在初始化过程中需调用特定函数来设置时间和日期参数以及定义闹钟触发条件。 对于蓝桥杯竞赛中的具体应用,通常会涉及到以下几个方面: #### 初始化库文件 首先需要包含必要的头文件以访问RTC寄存器及相关API接口。这些头文件一般位于标准固件库内,例如`stm32f1xx_hal_rtc.h`[^1]。 ```c #include "stm32f1xx_hal.h" ``` #### 配置RTC时基 通过HAL库提供的API可以方便地完成RTC初始化工作。下面是一个简单的例子展示如何开启LSE作为RTC时钟源,并启动RTC计数器。 ```c void MX_RTC_Init(void){ RTC_TimeTypeDef sTime = {0}; RTC_DateTypeDef DateToUpdate = {0}; /* ##-1- Configure the LSE as RTC clock source ###################### */ RCC_OscInitTypeDef OscInitStruct; // Enable Power Clock and Backup Domain Access __HAL_RCC_PWR_CLK_ENABLE(); HAL_PWREx_EnableBkUpAccess(); // Initialize LSE oscillator (Low Speed External) OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE; OscInitStruct.PLL.PLLState = RCC_PLL_NONE; OscInitStruct.LSEState = RCC_LSE_ON; if(HAL_RCC_OscConfig(&OscInitStruct)!= HAL_OK){ Error_Handler(); } // Select LSE as RTC clock source PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC; PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; if(HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK){ Error_Handler(); } } ``` #### 设置闹钟中断 要使能RTC闹钟事件,则必须先设定好期望的时间点,之后再激活相应的IRQ通道以便处理后续动作。这里给出了一段示范代码说明怎样安排一次性的闹钟提醒。 ```c // Set Alarm A to trigger at a specific time. void Set_Alarm(uint8_t hour, uint8_t minute, uint8_t second){ RTC_AlarmTypeDef sAlarm; hrtc.Instance = RTC; hrtc.Init.AsynchPrediv = 99; // Asynchronous prescaler value: 100Hz hrtc.Init.OutPut = RTC_OUTPUT_DISABLE; hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH; hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN; if (HAL_RTC_Init(&hrtc) != HAL_OK){ Error_Handler(); } sAlarm.AlarmTime.Hours = hour; sAlarm.AlarmTime.Minutes = minute; sAlarm.AlarmTime.Seconds = second; sAlarm.AlarmMask = RTC_ALARMMASK_NONE; sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_ALL; sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE; sAlarm.AlarmDateWeekDay = 1; sAlarm.Alarm = RTC_ALARM_A; if (HAL_RTC_SetAlarm_IT(&hrtc,&sAlarm,RTC_FORMAT_BIN) != HAL_OK){ Error_Handler(); } } // Handle alarm interrupt when it occurs. void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc){ // Insert your code here... } ``` 上述过程展示了基于STM32平台下利用硬件资源构建基本RTC闹钟机制的方法。值得注意的是实际比赛中可能会遇到更复杂的需求场景,因此建议参赛者深入研究官方文档获取更多细节指导。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值