STM32F103C8T6外接32.768KHz晶振,怎么用它设置毫秒级延时函数,设置的延时函数是每个GPIO口都可以用吗
时间: 2024-02-03 09:13:04 浏览: 120
使用外部32.768KHz晶振可以实现精确的毫秒级延时函数。首先需要在STM32的时钟设置中,将外部晶振作为RTC(实时时钟)的时钟源。然后可以使用RTC的时基来实现精确的毫秒级延时函数。
具体实现过程如下:
1. 配置RTC时钟源为外部32.768KHz晶振。
2. 配置RTC时基为1ms。
3. 在代码中编写延时函数,使用RTC时基来计算延时时间。
4. 在需要延时的地方调用延时函数即可。
以下是一个示例代码,以PA0引脚为例实现延时功能:
```c
#include "stm32f10x.h"
void RTC_Configuration(void)
{
/* Enable PWR and BKP clocks */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
/* Allow access to BKP Domain */
PWR_BackupAccessCmd(ENABLE);
/* Reset Backup Domain */
BKP_DeInit();
/* Enable LSE */
RCC_LSEConfig(RCC_LSE_ON);
/* Wait till LSE is ready */
while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);
/* Select LSE as RTC Clock Source */
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
/* Enable RTC Clock */
RCC_RTCCLKCmd(ENABLE);
/* Wait for RTC registers synchronization */
RTC_WaitForSynchro();
/* Set RTC prescaler: set RTC period to 1ms */
RTC_SetPrescaler(32768/1000-1);
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask();
}
void Delay_ms(uint32_t ms)
{
uint32_t start = RTC_GetCounter();
while ((RTC_GetCounter() - start) < ms);
}
int main(void)
{
/* RTC configuration */
RTC_Configuration();
/* Enable GPIOA clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
while (1)
{
GPIO_SetBits(GPIOA, GPIO_Pin_0);
Delay_ms(1000);
GPIO_ResetBits(GPIOA, GPIO_Pin_0);
Delay_ms(1000);
}
}
```
上述代码中,RTC_Configuration函数用于配置RTC时钟和时基,Delay_ms函数用于实现延时功能,main函数中使用PA0引脚进行闪烁测试。注意,在使用RTC时基进行延时时,需要注意RTC计数器的溢出问题。如果需要延时时间超过了RTC计数器的最大值,可以使用循环计数的方式来实现较长时间的延时。另外,延时函数对于所有GPIO口都是通用的,可以在任何需要延时的地方使用。
阅读全文