STM32
直播中

百合子

9年用户 984经验值
擅长:控制/MCU
私信 关注
[问答]

STM32F103VBT6利用RTC输出秒脉冲,为什么无法实现?

芯片用的是STM32F103VBT6,目前程序已经可以在tamper(PC13)引脚上输出校正时钟,其时钟频率为RTC时钟除以64。但调了好几天都无法输出秒脉冲,求大神搭救。


/****************************************************************/
#include  quot;stm32f10x.h quot;
void RTC_Configuration(void);
int main(void)
{

   RTC_Configuration();
   PWR_BackupAccessCmd(ENABLE);   //使能或失能RTC和后备寄存器访问
   BKP_TamperPinCmd(DISABLE); //该函数使能或失能管脚的侵入检测功能  
   BKP_RTCOutputConfig(BKP_RTCOutputSource_Second); //tamper脚输出秒脉冲实现不了,当把           //BKP_RTCOutputSource_Second改为BKP_RTCOutputSource_CalibClock时可正常输出校正脉冲,
   //请问如何才能输出秒脉冲,谢谢!
}

void RTC_Configuration(void)
{
  //启用PWR和BKP的时钟(from APB1)
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
  PWR_BackupAccessCmd(ENABLE); //使能后备寄存器访问
  BKP_DeInit();    //将BKP的全部寄存器重设为缺省值
  RCC_LSEConfig(RCC_LSE_ON); //设置外部低速晶振(LSE)32.768K  
  while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
  {}
  RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);  //RTC时钟源配置成LSE(外部32.768K)
  RCC_RTCCLKCmd(ENABLE);//RTC开启
  RTC_WaitForSynchro();  //开启后需要等待APB1时钟与RTC时钟同步,才能读写寄存器
  RTC_WaitForLastTask();
  RTC_EnterConfigMode();
  RTC_WaitForLastTask();
  RTC_SetPrescaler(32767);
  RTC_WaitForLastTask();
  RTC_SetCounter(0);
  RTC_WaitForLastTask();
  RTC_ExitConfigMode();
  RTC_WaitForLastTask();
}

回帖(1)

刘伟

2024-5-17 18:03:15
首先,我们需要确保STM32F103VBT6的RTC配置正确。以下是一些关键步骤和可能的问题:

1. 确保时钟已经正确配置。RTC时钟需要从LSI或LSE时钟源获取。

2. 初始化RTC。在`RTC_Configuration()`函数中,确保已经正确设置了RTC的时钟源、预分频器和分频器。

3. 配置Tamper(PC13)引脚。确保PC13引脚已经被配置为Tamper模式。

4. 使能Tamper中断。在`RTC_Configuration()`函数中,确保已经使能了Tamper中断。

5. 配置NVIC。确保已经使能了RTC中断。

6. 在主循环中,使用`BKP_TamperPinCmd(ENABLE);`启用Tamper引脚。

7. 实现Tamper中断处理函数。在`void RTC_Tamper_IRQHandler(void)`中,处理Tamper中断。

以下是修改后的代码示例:

```c
#include "stm32f10x.h"

void RTC_Configuration(void);
void RTC_Tamper_IRQHandler(void);

int main(void)
{
    RTC_Configuration();
    PWR_BackupAccessCmd(ENABLE); // 使能或失能RTC和后备寄存器访问

    // 使能Tamper引脚
    BKP_TamperPinCmd(ENABLE);

    // 使能NVIC中断
    NVIC_EnableIRQ(RTC_Tamper_IRQn);

    while (1)
    {
        // 主循环
    }
}

void RTC_Configuration(void)
{
    // RTC时钟配置
    RCC_LSICmd(ENABLE);
    while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET);

    RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
    RCC_RTCCLKCmd(ENABLE);

    // RTC初始化
    RTC_InitTypeDef RTC_InitStructure;
    RTC_StructInit(&RTC_InitStructure);
    RTC_InitStructure.RTC_AsynchPrediv = 0x7F;
    RTC_InitStructure.RTC_SynchPrediv = 0xFF;
    RTC_Init(&RTC_InitStructure);

    // 使能Tamper中断
    RTC_ITConfig(RTC_IT_TAMP1, ENABLE);
}

void RTC_Tamper_IRQHandler(void)
{
    if (RTC_GetITStatus(RTC_IT_TAMP1) != RESET)
    {
        // 处理Tamper中断
        RTC_ClearITPendingBit(RTC_IT_TAMP1);
    }
}
```

请确保您的`RTC_Configuration()`函数中的配置与您的硬件和需求相匹配。如果问题仍然存在,请检查您的硬件连接和引脚配置。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分