hal库串口中断回调怎能延时

hal库串口中断回调怎能延时,第1张

直接使用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寄存器开发的意义等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9879433.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存