|
int8_t RTCx_config(void)
{
uint8_t errCnt = 200;
GPIO_InitTypeDef GPIO_InitStructure;//定义GPIO初始化结构体变量
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14 ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推免输出
GPIO_Init(GPIOB, &GPIO_InitStructure);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|BIT(9) /*| RCC_APB1Periph_BKP*/, ENABLE);// 使能 PWR 和 BKP 时钟
PWR_BackupAccessCmd(ENABLE); // 使能 BKP Domain 的访问
RCC->BDCR |= RCC_LSE_ON; //使能外部时钟 LSE (32.768KHz)
errCnt = 200;
while(errCnt--){
if( RCC->BDCR & BIT(1))// 等待外部时钟 LSE 就绪
break;
OS_TimeDly(1);
}
if (errCnt == 0) {
pr_debug("LSE error\n");
return 1;
}
RCC->BDCR &= ~(3<<8);
RCC->BDCR |= (1<<8);// 选择外部时钟 LSE 为 RTC 时钟
RCC->BDCR |= BIT(15);// 使能 RTC 时钟
pr_debug("LSE clk enable:BDCR %x\n", RCC->BDCR);
pr_debug("RTC CRL:%02x\n", RTC->CRL);
if(RTC_WaitForLastTask())
return 1;
RTC->CRL |= RTC_CRL_CNF;
// RTC_WaitForSynchro(); // 等待 RTC 寄存器同步
// RTC_WaitForLastTask(); // 等待上次写入 RTC 寄存器完成
RTC_SetPrescaler(32767); // 设置 RTC 间隔为1秒 计算公式为 RTC period = RTCCLK / RTC_PR = (32.768 KHz) / (32767 + 1)
RTC->CRL &= ~RTC_CRL_CNF;
return RTC_WaitForLastTask();
} |
|