【沁恒蓝牙mesh】CH58x 将RTC时钟切换为LSE外部低速时钟

本文主要记录了【沁恒蓝牙mesh】CH58x 如何将RTC时钟切换为外部时钟

1. 硬件设计

  • ·X32MO X32MI引脚外接32M时钟,作为MCU系统运行的高速时钟
  • PA11 PA10引脚外接 32.768K 时钟

关于 CH58X·时钟计算可参考我的博文:
【沁恒蓝牙mesh】CH58x系统时钟配置与计算
在这里插入图片描述

2. 软件配置

软件默认使用的是 系统内部时钟

void HAL_TimeInit(void)
{
#if(CLK_OSC32K)
    sys_safe_access_enable();
    R8_CK32K_CONFIG &= ~(RB_CLK_OSC32K_XT | RB_CLK_XT32K_PON);
    sys_safe_access_enable();
    R8_CK32K_CONFIG |= RB_CLK_INT32K_PON;
    sys_safe_access_disable();
    Lib_Calibration_LSI();
#else
    sys_safe_access_enable();
    R8_CK32K_CONFIG |= RB_CLK_OSC32K_XT | RB_CLK_INT32K_PON | RB_CLK_XT32K_PON;
    sys_safe_access_disable();
#endif
    RTC_InitTime(2020, 1, 1, 0, 0, 0); //RTC时钟初始化当前时间
    TMOS_TimerInit(0);
}

3. 切换RTC时钟为LSE外部时钟

配置流程参考官方手册:
在这里插入图片描述

// 首先不要将PA10 PA11引脚配置为输出
sys_safe_access_enable();
//                    切换LSE           内部32K使能                开启外部晶振         
R8_CK32K_CONFIG |= RB_CLK_OSC32K_XT | RB_CLK_INT32K_PON |     RB_CLK_XT32K_PON;
sys_safe_access_enable();
R16_CLK_SYS_CFG |= RB_CLK_SYS_MOD;   // 32k 作为 HCLK
sys_safe_access_disable();
#include "CH58x_common.h"

void DebugInit(void)
{
    GPIOA_SetBits(GPIO_Pin_9);
    GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeIN_PU);
    GPIOA_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP_5mA);
    UART1_DefInit();
}
__HIGH_CODE
void test1(void){
//外部32K,需要屏蔽PA10/PA11的IO翻转(32K晶振引脚)
    sys_safe_access_enable();
    R8_CK32K_CONFIG |= RB_CLK_OSC32K_XT | RB_CLK_INT32K_PON | RB_CLK_XT32K_PON;
    sys_safe_access_enable();
    R16_CLK_SYS_CFG |= RB_CLK_SYS_MOD;
    sys_safe_access_disable();
}

__HIGH_CODE
int main()
{
    uint8_t      i;
    SetSysClock(CLK_SOURCE_PLL_60MHz);
    GPIOB_ModeCfg(GPIO_Pin_4,  GPIO_ModeOut_PP_5mA);   //设置模式 输出
    GPIOB_SetBits(GPIO_Pin_4);
    //GPIOA_ModeCfg(GPIO_Pin_10 | GPIO_Pin_11,  GPIO_ModeOut_PP_5mA); //设置模式 输出,验证内部32k作为主频时,外部32k是不工作的。
    //GPIOA_ResetBits(GPIO_Pin_10);
    //GPIOA_SetBits(GPIO_Pin_11);
    mDelaymS(3000);     //等待60M稳定
    test1();
    while(1);
}


参考:

CH573F 使用LSI时如何关闭外部晶振

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是使用 STM32F10X RTC 实时时钟的计数代码示例: ```c #include "stm32f10x.h" #include "stm32f10x_rtc.h" void RTC_Configuration(void); int main(void) { RTC_Configuration(); while (1) { RTC_TimeTypeDef RTC_TimeStruct; RTC_DateTypeDef RTC_DateStruct; RTC_GetTime(RTC_Format_BIN, &RTC_TimeStruct); RTC_GetDate(RTC_Format_BIN, &RTC_DateStruct); // 访问 RTC 时间和日期结构体以获取实时计数值 uint32_t rtc_count = RTC_GetCounter(); // 将实时计数值显示到 LCD 或串口等外设上 } } void RTC_Configuration(void) { // 使能 PWR 和 BKP 外设时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); // 使能写入保护 PWR_BackupAccessCmd(ENABLE); // 检查备份寄存器是否有效,如果无效则初始化 RTC if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5) { RCC_LSEConfig(RCC_LSE_ON); // 使能外部低速晶体振荡器 (LSE) // 等待 LSE 稳定 while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET); RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); // 选择 LSE 作为 RTC 时钟源 RCC_RTCCLKCmd(ENABLE); // 使能 RTC 时钟 RTC_WaitForSynchro(); // 等待 RTC 同步完成 RTC_InitTypeDef RTC_InitStruct; RTC_InitStruct.RTC_HourFormat = RTC_HourFormat_24; RTC_InitStruct.RTC_AsynchPrediv = 0x7F; RTC_InitStruct.RTC_SynchPrediv = 0xFF; RTC_Init(&RTC_InitStruct); BKP_WriteBackupRegister(BKP_DR1, 0xA5A5); // 标记备份寄存器已经被初始化 } else { RTC_WaitForSynchro(); // 等待 RTC 同步完成 } } ``` 在上述代码中,我们首先定义了一个 `RTC_Configuration` 函数,它用于初始化 RTC。在此函数中,我们首先使能了 PWR 和 BKP 外设时钟,并使能了写入保护。然后,我们检查备份寄存器是否有效,如果无效则初始化 RTC。在 RTC 初始化期间,我们使用外部低速晶体振荡器 (LSE) 作为 RTC 时钟源,并设置 RTC 的分频器以获得 1 秒时钟。最后,我们使用 `BKP_WriteBackupRegister` 函数在备份寄存器中标记 RTC 已经被初始化。 在 `main` 函数中,我们使用 `RTC_GetTime` 和 `RTC_GetDate` 函数获取 RTC 的时间和日期,然后使用 `RTC_GetCounter` 函数获取实时计数值,并将其显示到外设上。 请注意,上述代码仅提供了一个 RTC 实现的基本示例。你需要根据你的具体应用程序要求对其进行修改和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

积跬步、至千里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值