完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
//注意,因为RCT的中断并没有直接连接到 NVIC ,它的中断应该了外中断,所以在配置 初始化时,应该要配置外中断
应用外部低速时间 32.768KHz 异步分频128 同步分频 256 32768 / (128*256 ) = 1Hz RTC模块和时钟配置是在后备区域,即在系统复位或者待机模式唤醒后RTC的设置和时间维持不变,只要后备区域供电正常,RTC将一直工作下去。但是在系统复位之后会自动禁止访问后备区域和RTC,以防止意外操作,所以在设置时间之前,要先取消后备区域写保护。 1.0 初始化 2.0 设置时钟 3.0 设置闹钟功能 4.0 设置 RTC 周期性唤醒中断 日历时间(RTC_TR)和日期(RTC_DR)寄存器 (BCD STM32F4 的 RTC 日历时间(RTC_TR)和日期(RTC_DR)寄存器,用于存储时间和日期(也可以用于设置时间和日期) , 可以通过与 PCLK1 (APB1 时钟) 同步的影子寄存器来访问,这些时间和日期寄存器也可以直接访问,这样可避免等待同步的持续时间。 每隔 2 个 RTCCLK 周期,当前日历值便会复制到影子寄存器,并置位 RTC_ISR 寄存器的RSF 位。我们可以读取 RTC_TR 和 RTC_DR 来得到当前时间和日期信息,不过需要注意的是:时间和日期都是以 BCD 码的格式存储的,读出来要转换一下,才可以得到十进制的数据。 uint16_t RTC_BinToBcd4(uint16_t Value) { return ((Value / 1000) 《《 12) + ((Value / 100 % 10) 《《 8) + ((Value % 100 / 10) 《《 4) + (Value % 10); } 预装载寄存器 影子寄存器 影子寄存器在这里实际上才是在比较的时候起作用的,也就是为预装载寄存器做缓冲,目的是为了当预装载寄存器ARR中的值更新后,影子寄存器仍然保持原来的值(这是在ARPE=1的情况下),参与比较操作的是影子寄存器,所以这样不会影响到计数器的工作误差。它在更新事件发生之后影子寄存器的值才从ARR寄存器那里获得更新,它也有同步的作用,使所有的相关寄存器数值都同时更新。 当ARPE为0时,影子寄存器是立即更新的,不等待更新事件 的发生。 ● 复用功能输出 (RTC_OUT),可选择以下两个输出之一: — RTC_CALIB:512 Hz 或 1 Hz 时钟输出(LSE 频率为 32.768 kHz)。 可通过将 RTC_CR 寄存器中的 COE[23] 位置 1 来使能此输出。该输出可连接到器 件 RTC_AF1 功能。 — RTC_ALARM(闹钟 A、闹钟 B 或唤醒)。 可通过配置 RTC_CR 寄存器的 OSEL[1:0] 位选择此输出。该输出可连接到器件 RTC_AF1 功能。 RTC 时间寄存器 (RTC_TR) RTC 日期寄存器 (RTC_DR) RTC 控制寄存器 (RTC_CR) RTC 初始化和状态寄存器 (RTC_ISR) RTC 预分频器寄存器 (RTC_PRER) RTC 唤醒定时器寄存器 (RTC_WUTR) RTC 校准寄存器 (RTC_CALIBR) RTC 闹钟 A 寄存器 (RTC_ALRMAR) RTC 闹钟 B 寄存器 (RTC_ALRMBR) RTC 写保护寄存器 (RTC_WPR) RTC 亚秒寄存器 (RTC_SSR) 中断与事件 中断是软件处理 事件是硬件处理 ①使能PWR时钟:RCC_APB1PeriphClockCmd(); ② 使能后备寄存器访问: PWR_BackupAccessCmd(); ③ 配置RTC时钟源,使能RTC时钟: RCC_RTCCLKConfig(); RCC_RTCCLKCmd(); 如果使用LSE,要打开LSE:RCC_LSEConfig(RCC_LSE_ON); ④ 初始化RTC(同步/异步分频系数和时钟格式):RTC_Init (); ⑤ 设置时间:RTC_SetTime (); ⑥设置日期:RTC_SetDate(); 1)使能电源时钟,并使能 RTC 及 RTC 后备寄存器写访问。 要访问 RTC 和 RTC 备份区域就必须先使能电源时钟, 然后使能 RTC即后备区域访问。电源时钟使能,通过 RCC_APB1ENR 寄存器来设置;RTC 及 RTC 备份寄存器的写访问,通过 PWR_CR 寄存器的 DBP 位设置。库函数设置方法为: //使能 PWR 时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE); //使能后备寄存器访问 PWR_BackupAccessCmd(ENABLE); 2 )开启外部低速振荡器择 ,选择 RTC 时钟,并使能。 这个步骤,只需要在 RTC 初始化的时候执行一次即可,不需要每次上电都执行,这些操作都是通过 RCC_BDCR 寄存器来实现的。 开启 LSE 的库函数为: RCC_LSEConfig(RCC_LSE_ON);//LSE 开启 同时,选择 RTC 时钟源以及使能时钟函数为: //设选择 LSE 作为 RTC 时钟 RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //使能 RTC 时钟 RCC_RTCCLKCmd(ENABLE); 3)初始化 RTC,设置 RTC 的分频,以及配置 RTC 参数。 初始化参数结构体 RTC_InitTypeDef typedef struct { uint32_t RTC_HourFormat; uint32_t RTC_AsynchPrediv; uint32_t RTC_SynchPrediv; }RTC_InitTypeDef; RTC_HourFormat设置RTC时间格式: 24小时制:RTC_HourFormat_24 12小时制: RTC_HourFormat_12 RTC_AsynchPrediv 设置RTC的异步预分频系数:(PREDV_A),因为异步预分频系数是 7 位,所以最大值为 0x7F,所以不能超过这个值。 RTC_SynchPrediv设置RTC的同步预分频系数:(PREDIV_S),因为同步预分频系数也是 15 位,所以最大值为 0x7FFF,不能超过这个值。 在设置 RTC 相关参数之前, 会先取消 RTC 写保护,这个操作通过向寄存器RTC_WPR 写入 0XCA 和 0X53 两个数据实现。所以 RTC_Init 函数体开头会有下面两行代码用来取消 RTC 写保护: RTC-》WPR = 0xCA; RTC-》WPR = 0x53; 在取消写保护之后,我们要对 RTC_PRER、RTC_TR 和 RTC_DR 等寄存器的写操作,必须进入 RTC 初始化模式,才可以进行,库函数中进入初始化模式的函数为: ErrorStatus RTC_EnterInitMode(void); 进入初始化模式之后,RTC_init 函数才去设置 RTC-》CR 以及 RTC-》PRER 寄存器的值。在设置完值之后,我们还要退出初始化模式,函数为: void RTC_ExitInitMode(void) 最后再开启 RTC 写保护,往 RTC_WPR 寄存器写入值 0xFF 即可。 库函数中:可以直接调用: RTC_DeInit(); 4)设置 RTC 的时间。 库函数中,设置 RTC 时间的函数为: ErrorStatus RTC_SetTime(uint32_t RTC_Format, RTC_TimeTypeDef* RTC_TimeStruct); 第一个参数 RTC_Format,用来设置输入的时间格式为 BIN 格式还是BCD 格式, 可选值为 RTC_Format_BIN 和 RTC_Format_BCD。 初始化参数结构体 RTC_TimeTypeDef 的定义: typedef struct { uint8_t RTC_Hours; //小时 uint8_t RTC_Minutes; //分钟 uint8_t RTC_Seconds; //秒钟 uint8_t RTC_H12; //上午或下午RTC_H12_AM RTC_H12_PM }RTC_TimeTypeDef; 位 31:24 保留,必须保持复位值。 位 23 COE:校准输出使能 (Calibration output enable) 该位使能 RTC_CALIB 输出 0:禁止校准输出 1:使能校准输出 位 22:21 OSEL[1:0]:输出选择 (Output selection) 这些位用于选择要连接到 RTC_ALARM 输出的标志 00:禁止输出 01:使能闹钟 A 输出 10:使能闹钟 B 输出 11:使能唤醒输出 位 20 POL:输出极性 (Output polarity) 该位用于配置 RTC_ALARM 输出的极性 0:当 ALRAF/ALRBF/WUTF 置 1 时(取决于 OSEL[1:0]),该引脚为高电平 1:当 ALRAF/ALRBF/WUTF 置 1 时(取决于 OSEL[1:0]),该引脚为低电平 位 19 COSEL:校准输出选择 (Calibration output selection) 当 COE=1 时,该位可选择 RTC_CALIB 上输出的信号。 0:校准输出为 512 Hz 1:校准输出为 1 Hz 在 RTCCLK 为 32.768 kHz 且预分频器为其默认值(PREDIV_A=127 且 PREDIV_S=255) 的条件下,这些频率有效。请参见第 23.3.14 节:校准时钟输出。 位 18 BKP:备份 (Backup) 用户可对此位执行写操作以记录是否已对夏令时进行更改。 位 17 SUB1H:减少 1 小时(冬季时间更改)(Subtract 1 hour (winter time change)) 当该位在初始化模式以外的模式下置 1 时,如果当前小时不是 0,则日历时间将减少 1 小 时。此位始终读为 0。 当前小时为 0 时,将此位置 1 没有任何作用。 0:无作用。 1:将当前时间减少 1 小时。这可用于冬季时间更改。 位 16 ADD1H:增加 1 小时(夏季时间更改)(Add 1 hour (summer time change)) 当该位在初始化模式以外的模式下置 1 时,日历时间将增加 1 小时。此位始终读为 0。 0:无作用。 1:将当前时间增加 1 小时。这可用于夏季时间更改 位 15 TSIE:时间戳中断使能 (Timestamp interrupt enable) 0:禁止时间戳中断 1:使能时间戳中断 位 14 WUTIE:使能唤醒定时器使能 (Wakeup timer interrupt enable) 0:禁止唤醒定时器中断 1:使能唤醒定时器中断 位 13 ALRBIE:闹钟 B 中断使能 (Alarm B interrupt enable) 0:闹钟 B 中断禁止 1:闹钟 B 中断使能 位 12 ALRAIE:闹钟 A 中断使能 (Alarm A interrupt enable) 0:禁止闹钟 A 中断 1:使能闹钟 A 中断 位 11 TSE:时间戳使能 (Time stamp enable) 0:禁止时间戳 1:使能时间戳 位 10 WUTE:唤醒定时器使能 (Wakeup timer enable) 0:禁止唤醒定时器 1:使能唤醒定时器 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1621 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1546 浏览 1 评论
980 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
686 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1599 浏览 2 评论
1867浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
648浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
518浏览 3评论
534浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
506浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-23 18:14 , Processed in 0.816402 second(s), Total 76, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号