直接使用cubeMX即可,否则可以根据官网给出例程来进行配置。
void RTC_Configuration(void)
{
//启用PWR和BKP的时钟(from APB1)
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
//后备域解锁
PWR_BackupAccessCmd(ENABLE);
//备份寄存器模块复位
BKP_DeInit();
//外部32768K其哟偶那个
RCC_LSEConfig(RCC_LSE_ON);
//等待稳定
while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);
//RTC时钟源配置成LSE(外部32768K)
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
//RTC开启
RCC_RTCCLKCmd(ENABLE);
//开启后需要等待APB1时钟与RTC时钟同步,才能读写寄存器
RTC_WaitForSynchro();
//读写寄存器前,要确定上一个 *** 作已经结束
RTC_WaitForLastTask();
//设置RTC分频器,使RTC时钟为1Hz
//RTC period = RTCCLK/RTC_PR = (32768 KHz)/(32767+1)
RTC_SetPrescaler(32767);
//等待寄存器写入完成
RTC_WaitForLastTask();
//使能秒中断
RTC_ITConfig(RTC_IT_SEC, ENABLE);
//等待写入完成
RTC_WaitForLastTask();
return;
}
void RTC_Config(void)
{
//我们在BKP的后备寄存器1中,存了一个特殊字符0xA5A5
//第一次上电或后备电源掉电后,该寄存器数据丢失,
//表明RTC数据丢失,需要重新配置
if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)
{
//重新配置RTC
RTC_Configuration();
//配置完成后,向后备寄存器中写特殊字符0xA5A5
BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);
}
else
{
//若后备寄存器没有掉电,则无需重新配置RTC
//这里我们可以利用RCC_GetFlagStatus()函数查看本次复位类型
if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET)
{
//这是上电复位
}
else if (RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET)
{
//这是外部RST管脚复位
}
//清除RCC中复位标志
RCC_ClearFlag();
//虽然RTC模块不需要重新配置,且掉电后依靠后备电池依然运行
//但是每次上电后,还是要使能RTCCLK
//RCC_RTCCLKCmd(ENABLE);
//等待RTC时钟与APB1时钟同步
//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
return;
}
STM32停止模式是一种省电模式,可以将芯片的功耗降至最低,但同时也会导致一些外设无法正常工作。在停止模式下,串口等外设会被关闭,需要通过唤醒来重新启动。
如果在停止模式下唤醒后串口不通,可能是以下原因:
1 时钟配置问题:在停止模式下,芯片的时钟会被关闭,唤醒后需要重新配置时钟。如果时钟配置不正确,可能会导致串口无法正常工作。需要检查时钟配置是否正确。
2 中断配置问题:如果串口中断没有正确配置,可能会导致串口无法正常工作。需要检查中断配置是否正确。
3 电源管理问题:在停止模式下,芯片的电源管理也会被关闭,唤醒后需要重新配置电源管理。如果电源管理配置不正确,可能会导致串口无法正常工作。需要检查电源管理配置是否正确。
4 程序问题:如果程序中存在问题,可能会导致串口无法正常工作。需要检查程序是否正确。
综上所述,如果在停止模式下唤醒后串口不通,需要检查时钟配置、中断配置、电源管理配置和程序是否正确。如果以上都没有问题,可能需要进一步调试和排查。
在 STM32 的 HAL 库和标准外设库中,都存在一个名为 `RESET` 的常量。该常量的含义是复位标志,用于指示芯片是否发生了复位。具体来说,当芯片发生复位时,系统会将存储器中的所有变量清零,并将 `RCC_CSR` 寄存器中的复位标志位置 1,以便以后的 *** 作可以检测到芯片的复位状态。在 HAL 库和标准外设库中,可以通过读取 `RCC_CSR` 寄存器中的复位标志(即 `RESET` 常量)来检查芯片是否发生了复位,从而进行相应的处理。
需要注意的是,`RESET` 常量的值并不是 0 或 1,而是一个特殊的值 `0x01U`,代表着复位标志位被置为了 1。因此,在使用 `RESET` 常量时,需要将其与 `0x01U` 进行比较,来判断复位标志位是否被置为了 1。例如,可以使用如下代码检测复位标志位是否被置为了 1:
```c
if (__HAL_RCC_GET_FLAG(RCC_FLAG_RESET) == RESET) {
// 处理复位状态
}
```
其中,`__HAL_RCC_GET_FLAG(RCC_FLAG_RESET)` 函数用于读取 `RCC_CSR` 寄存器中的复位标志(即 `RESET` 常量),`RCC_FLAG_RESET` 参数用于指示要读取复位标志。如果返回值等于 `RESET` 常量(即值为 `0x01U`),则说明芯片发生了复位。
周期性唤醒标志由 16 位可编程自动重载递减计数器生成。唤醒定时器范围可扩展至 17 位。
可通过 RTC_CR 寄存器中的 WUTE 位来使能此唤醒功能。
唤醒定时器的时钟输入可以是: 2、4、8 或 16 分频的 RTC 时钟 (RTCCLK)。
当 RTCCLK 为 LSE (32768 kHz) 时,可配置的唤醒中断周期介于 122 µs 和 32 s 之 间,且分辨率低至 61 µs。
· ck_spre(通常为 1 Hz 内部时钟)。
当 ck_spre 频率为 1 Hz 时,可得到的唤醒时间为 1s 到 36h 左右,分辨率为 1 秒。这 一较大的可编程时间范围分为两部分:
– WUCKSEL [2:1] = 10 时为 1s 到 18h
– WUCKSEL [2:1] = 11 时约为 18h 到 36h。在后一种情况下,会将 216 添加到 16 位计数器当前值。完成初始化序列后(请参见第 600 页的编程唤醒定时器),定时 器开始递减计数。在低功耗模式下使能唤醒功能时,递减计数保持有效。此外,当 计数器计数到 0 时,RTC_ISR 寄存器的 WUTF 标志会置 1,并且唤醒寄存器会使用其重载值(RTC_WUTR 寄存器值)动重载。 之后必须用软件清零 WUTF 标志。
通过将 RTC_CR2 寄存器中的 WUTIE 位置 1 来使能周期性唤醒中断时,它会使器件退出低功耗模式。
如果已通过 RTC_CR 寄存器的位 OSEL[1:0] 使能周期性唤醒标志,则该标志可连接到RTC_ALARM 输出。可通过 RTC_CR 寄存器的 POL 位配置 RTC_ALARM 输出极性。
系统复位以及低功耗模式(睡眠、停机和待机)对唤醒定时器没有任何影响。
二、配置周期唤醒
配置步骤如下:
1 禁用周期唤醒功能,复位RTC_CR2中WUTE位;
2 等待RTC_ISR1中WUTWF位置位,表示唤醒计数器可配置;
3 配置唤醒时钟,设置RTC_CR1中WUCKSEL[2:0]位:
- 000: RTCCLK/16
- 001: RTCCLK/8
- 010: RTCCLK/4
- 011: RTCCLK/2
- 10x: ck_spre(1Hz,WUT计数范围:0x0000~0xFFFF)
- 11x: ck_spre(1Hz,WUT计数范围:0x10000~0x1FFFF)
4 配置唤醒周期,装载寄存器RTC_WUTRH和RTC_WUTRL;
5 使能周期唤醒功能,置位RTC_CR2中WUTE位。(该中断会使MCU退出低功耗状态,进入运行状态。)
RTCCLK,预分频2,4,8或16。如果RTCCLK为LSE,即32768Hz,则可配置唤醒周期为:(61us ~ 32s)
ck_spre, 1Hz时钟,则可配置唤醒周期为:(1s ~ 36h)
三、RTC时钟配置
1、时钟源选择:RTC时钟源可选HSE,LSE,HSI或LSI。
为确保RTC精确工作,要求系统时钟(SYSCLK)必须等于或大于4RTCCLK值。如果系统时钟(SYSCLK)为LSE或LSI,则RTC时钟必须等于系统时钟(SYSCLK),并且禁用RTC同步机制(置位RTC_CR1寄存器RATIO位)。
2、配置RTC时钟源:配置RTC时钟源为LSE,1分频,即32768Hz。
3、配置ck_spre时钟; ck_spre时钟,默认1Hz时钟。
(1) 设置7位异步预分频,RTC_APREG:PREDIVA,默认127;
(2) 设置13(Medium)或15位同步预分频,RTC_SPRERx:PREDIV_S,默认255。
即:1Hz=32768/((127+1)(255+1))
ck_spre时钟可用于日历和定时唤醒时钟。
代码参考
//参数time 秒
void APP_EnterLP(uint32_t time )
{
MX_GPIO_Init_stop();
/ Enable Ultra low power mode /
HAL_PWREx_EnableUltraLowPower(); //使能超低功耗
/ Enable Fast WakeUP /
HAL_PWREx_EnableFastWakeUp(); //使能快速唤醒
/ Disable Wakeup Counter /
HAL_RTCEx_DeactivateWakeUpTimer(&hrtc);
/ Clear Wake Up Flag /
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
// HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, (uint32_t)(time 2048), RTC_WAKEUPCLOCK_RTCCLK_DIV16);//rtc LSE=32768k 2048Hz 488us-- 32秒
HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, time-1, RTC_WAKEUPCLOCK_CK_SPRE_16BITS); //wangxl@20190814 时钟选择1Hz 65535/60/60 ~18 可得到的唤醒时间为 1s 到 18h 左右
printf("进入停止模式\r\n");
/ Select MSI as system clock source after Wake Up from Stop mode /
__HAL_RCC_WAKEUPSTOP_CLK_CONFIG (RCC_STOP_WAKEUPCLOCK_HSI);
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON , PWR_STOPENTRY_WFI);
MX_GPIO_Init();
HAL_Delay(5); //wangxl@20190814 稳定时钟 必免串口打印乱码
printf("wake up\r\n");
}
打开CSDN,阅读体验更佳
STM32---RTC实时时钟,随机数发生器和待机唤醒_码字但很菜的博客-CSDN博
void RTC_AlarmSubSecondConfig(uint32_t RTC_Alarm, uint32_t RTC_AlarmSubSecondValue,uint32_t RTC_AlarmSubSecondMask) uint32_t RTC_GetAlarmSubSecond(uint32_t RTC_Alarm); RTC周期唤醒相关函数 void RTC_WakeUpClockConfig(
继续访问
STM32L051低功耗STOP模式下RTC唤醒_TonyIOT的博客_stm32l05
很多MCU都有低功耗模式,以满足对功耗要求苛刻的应用场景。STM32系列MCU的低功耗模式根据其内核与类型的不同也各不相同,网上有很多文章介绍。本文总结下STM32L051的STOP模式,通过RTC唤醒。
继续访问
最新发布 GD32F4—RTC闹钟及自动唤醒中断配置详解
GD32F4RTC闹钟及自动唤醒中断配置
继续访问
STM32RTC休眠唤醒(停机模式)、独立看门狗开启状态下
本文章基于STM32F103RC; 在开启独立看门狗的状态下,进入停机模式,由RTC定时闹钟唤醒系统。 直接上代码: #include "mainh" static void RTC_NVIC_Config(void) { EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructureNVIC_IRQChannel = RTCAlarm_IRQn;
继续访问
stm32f103 RTC周期性待机唤醒(一)_luck_horse的博客
我的RTC初始化部分有个“保存在备份寄存器的RTC标志是否已经被配置过的判断”,如果已经配置过,则进入else部分,但是这个else部分没有“要使能电源时钟,使能备份时钟,取消后备区的写保护”这些配置语句,而待机唤醒后程序从主函数执行,会执行
继续访问
RTC实时时钟_基尔霍夫原来是码农的博客_stm32 rtc 时间
RTC简介 STM32F4的RTC,是一个独立的BCD 定时器/计数器。STM32F4的RTC 提供一个日历时钟(包含年月日时分秒信息)、两个可编程闹钟(ALARM A和ALARM B)中断,以及一个具有中断功能的周期性可编程唤醒标志。RTC 还包含用于管理低功耗模式
继续访问
STM32L031低功耗深度睡眠RTC唤醒注意事项
1 发现进入睡眠后,电流12uA,满足要求。结果唤醒后,第二次进入睡眠后,电流跳到了19uA,且一直保持下去。结果看了>
以上就是关于hal库串口中断回调怎能延时全部的内容,包括:hal库串口中断回调怎能延时、细究STM32 HAL库的中断式串口接收、stm32寄存器开发的意义等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)