STM32F103C8T6外接32.768KHz晶振,应该怎么用它设置延时函数
时间: 2023-08-16 14:06:28 浏览: 155
STM32F103C8通过定时器中断实现精确毫秒延时
5星 · 资源好评率100%
使用外部晶振的时候,我们可以使用RTC模块来实现延时功能,具体步骤如下:
1. 首先需要开启RTC时钟,可以使用RCC_APB1PeriphClockCmd函数来开启,如下:
```
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); // 开启PWR和BKP模块时钟
PWR_BackupAccessCmd(ENABLE); // 允许访问RTC和后备寄存器
RCC_LSEConfig(RCC_LSE_ON); // 开启外部低速晶振
while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET); // 等待晶振稳定
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); // 选择RTC时钟源为LSE
RCC_RTCCLKCmd(ENABLE); // 使能RTC时钟
RTC_WaitForSynchro(); // 等待RTC寄存器同步
```
2. 设置RTC预分频器,使得RTC时钟频率为1Hz,即每秒钟产生一个中断,可以使用RTC_SetPrescaler函数来设置,如下:
```
RTC_SetPrescaler(32767); // 预分频器值为32767,使得RTC时钟频率为1Hz
```
3. 开启RTC中断,可以使用RTC_ITConfig函数来开启,如下:
```
RTC_ITConfig(RTC_IT_SEC, ENABLE); // 开启RTC秒中断
```
4. 在RTC中断处理函数中实现延时功能,可以使用RTC_GetCounter函数来获取当前的计数值,从而实现延时,如下:
```
void RTC_IRQHandler(void)
{
if (RTC_GetITStatus(RTC_IT_SEC) != RESET) // 判断是否是秒中断
{
RTC_ClearITPendingBit(RTC_IT_SEC); // 清除中断标志位
counter++; // 计数器加1
}
}
void Delay(uint32_t ms)
{
counter = 0; // 计数器清零
while (counter < ms); // 等待计数器达到指定的值
}
```
需要注意的是,RTC计数器是一个32位的自动递增计数器,当计数值达到最大值时会自动清零,因此最大的延时时间为2^32/32768 ≈ 131秒。如果需要更长的延时时间,可以通过多次调用Delay函数来实现。
阅读全文