STM32F030F4P6单片机由外部时钟改为内部时钟的步骤

本文详细介绍了如何在STM32F030F4P6单片机中从外部时钟源切换到内部时钟源的过程。通过修改SetSysClock函数,实现内部RC时钟作为时钟源,包括使能内部时钟、等待起振、配置PLL等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

STM32F030F4P6单片机由外部时钟改为内部时钟的步骤

一.看程序运行的时候初始化时钟部分:
 

二.查看systeminit定义如下:
 


这就是打开的函数内容这就是使用外部时钟的配置,也就是库函数的默认配置):static void SetSysClock(void)
{
  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  
  /* SYSCLK, HCLK, PCLK configuration ----------------------------------------*/
/* Enable HSE */ //打开外部时钟开关
  RCC->CR |= ((uint32_t)RCC_CR_HSEON);

  /* Wait till HSE is ready and if Time out is reached exit *///判断外部时钟是否起振
  do
  {
    HSEStatus = RCC->CR & RCC_CR_HSERDY;
    StartUpCounter++;  
  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));

  if ((RCC->CR & RCC_CR_HSERDY) != RESET)
  {
    HSEStatus = (uint32_t)0x01;
  }
  else
  {
    HSEStatus = (uint32_t)0x00;
  }  

  if (HSEStatus == (uint32_t)0x01)
  {
/* Enable Prefetch Buffer and set Flash Latency */ //flash总线时钟使能
    FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;

    /* HCLK = SYSCLK *///外设AHB总线时钟等于系统时钟
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;

    /* PCLK = HCLK *///外设APB总线时钟等于系统时钟
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;

    /* PLL configuration = HSE * 6 = 48 MHz *///外部时钟6倍频 =系统时钟
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL6);

    /* Enable PLL *///使能锁相环倍频开关
    RCC->CR |= RCC_CR_PLLON;

    /* Wait till PLL is ready *///等待锁相环就绪
    while((RCC->CR & RCC_CR_PLLRDY) == 0)
    {
    }

/* Select PLL as system clock source *///选择锁相环输出时钟作为系统时钟
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;    

    /* Wait till PLL is used as system clock source *///等待锁相环输出时钟已经成为系统时钟
    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL)
    {
    }
  }
  else
  { /* If HSE fails to start-up, the application will have wrong clock 
         configuration. User can add here some code to deal with this error */
  }  
}

  1.  

复制代码

三.接下来我们想将系统时钟改为内部时钟,修改办法依旧是修改  SetSysClock()这个函数中的配置.首先我们要知道单片机内部的时钟到底是怎样一种结构,可以通过芯片文档来查找,另外比较方便的方法就是利用cubemx工具来查看,时钟结构如下:


四.那么我们就按照上图的结构配置来修改SetSysClock()中的配置即可采用内部RC时钟作为时钟源,蓝色字体为修改关键处):
static void SetSysClock(void)
{
  __IO uint32_t StartUpCounter = 0, HSIStatus = 0;
  
  /* SYSCLK, HCLK, PCLK configuration ----------------------------------------*/
/* Enable HSI*/ //使能内部时钟
  RCC->CR |= ((uint32_t)RCC_CR_HSION;

  /* Wait till HSI is ready and if Time out is reached exit */ //等待内部时钟起振
  do
  {
   HSIStatus = RCC->CR & RCC_CR_HSIRDY;
    StartUpCounter++;  
  } while((HSIStatus== 0) && (StartUpCounter != HSI_STARTUP_TIMEOUT));


  if ((RCC->CR & RCC_CR_HSIRDY) != RESET)
  {
  HSIStatus = (uint32_t)0x01;
  }
  else  
  {
  HSIStatus = (uint32_t)0x00;
  }  


  if (HSIStatus == (uint32_t)0x01)
  {
/* Enable Prefetch Buffer and set Flash Latency */ //flash总线时钟使能
    FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;

/* HCLK = SYSCLK *///外设AHB总线时钟等于系统时钟
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
      
/* PCLK = HCLK *///外设APB总线时钟等于系统时钟
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;

   /* PLL configuration = HSI/2 * 12= 48 MHz */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSI_Div2 | RCC_CFGR_PLLMULL12); //RC时钟2分频后 进行12倍频</font>

            
/* Enable PLL *///使能锁相环倍频开关 
    RCC->CR |= RCC_CR_PLLON;

/* Wait till PLL is ready *///等待锁相环就绪 
    while((RCC->CR & RCC_CR_PLLRDY) == 0)
    {
    }

/* Select PLL as system clock source *///选择锁相环输出时钟作为系统时钟 
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;    

/* Wait till PLL is used as system clock source *///等待锁相环输出时钟已经成为系统时钟 
    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL)
    {
    }
  }
  else
  { /* If HSI fails to start-up, the application will have wrong clock 
         configuration. User can add here some code to deal with this error */
                
  }  
}

  1.  

复制代码

好了,以上就是外部时钟源改为内部时钟源的总结.

<think>好的,我需要帮助用户查找关于如何配置STM32F030F4P6TR单片机中PA0引脚寄存器的信息。首先,我需要确认用户的需求,他们需要的是具体的配置教程或文档。根据用户提供的引用,特别是引用[1]和[2],这两份手册应该包含相关的寄存器配置信息。 首先,引用[1]提到的是STM32F030系列的官方参考手册中文版,里面应该详细介绍了内存结构和外围接口的使用,包括GPIO的配置。而引用[2]是关于STM32G030F6P6的中文手册,虽然型号不同,但可能结构类似,可以作为参考。但用户的具体型号是STM32F030F4P6TR,所以应以引用[1]为主。 接下来,我需要回忆STM32的GPIO配置一般涉及哪些寄存器。通常包括GPIO模式寄存器(MODER)、输出类型寄存器(OTYPER)、速度寄存器(OSPEEDR)、上拉下拉寄存器(PUPDR)、输入数据寄存器(IDR)和输出数据寄存器(ODR)。此外,复用功能选择寄存器(AFR)用于配置引脚的其他功能,比如ADC或USART。 在配置PA0时,用户可能需要设置该引脚为输入、输出、模拟或复用模式。例如,如果用作ADC输入,需要配置为模拟模式,并启用ADC通道。根据引用[3],PA0对应ADC1_IN0,这可能在配置ADC时需要参考。 然后,我需要指导用户如何查找具体的寄存器配置步骤。首先查阅引用[1]的文档,找到GPIO寄存器部分,通常在GPIO章节。然后根据PA0的具体功能需求,设置相应的寄存器位。例如,设置MODER为输入模式,可能需要将对应的位设置为00;若为输出模式,则设置为01。 同时,用户可能需要代码示例。比如,使用STM32的标准外设库或HAL库来配置PA0。虽然用户没有提到库的使用,但提供示例代码可以更直观。例如,使用寄存器直接操作,或者HAL_GPIO_Init函数。 另外,需要注意时钟配置。在配置GPIO之前,必须启用GPIOA的时钟,通常通过RCC寄存器设置。例如,在RCC_AHBENR寄存器中启用GPIOA的时钟。 可能的问题点包括:是否启用了时钟,是否正确配置了模式寄存器,以及复用功能是否正确选择。如果用户遇到问题,可以建议他们检查这些步骤。 最后,根据用户提供的引用,特别是引用[1]和[2],需要指出具体文档的位置,可能是在GPIO配置章节或具体外设章节。例如,引用[1]的文档应详细说明每个寄存器的位定义和配置方法。 总结步骤:查找官方手册的GPIO章节,确定PA0的寄存器地址和配置方法,根据功能需求设置模式、速度、上下拉等,并启用相关时钟。同时,参考ADC配置部分(如需要)来设置复用功能。</think>根据STM32F030系列的技术文档[^1][^2],配置PA0引脚需通过GPIO相关寄存器完成。以下是具体步骤和关键寄存器说明: ### 一、GPIO寄存器配置流程 1. **启用GPIOA时钟** 在RCC_AHBENR寄存器中启用GPIOA时钟: ```c RCC->AHBENR |= RCC_AHBENR_GPIOAEN; // 使能GPIOA时钟 ``` 2. **配置引脚模式** GPIOx_MODER寄存器控制引脚模式: - 输入模式:`MODER0[1:0] = 00` - 输出模式:`MODER0[1:0] = 01` - 复用模式:`MODER0[1:0] = 10` - 模拟模式:`MODER0[1:0] = 11`(用于ADC) **示例代码(模拟输入模式)**: ```c GPIOA->MODER |= GPIO_MODER_MODER0; // 设置PA0为模拟模式 ``` 3. **配置其他参数**(按需) - **输出类型**(GPIOx_OTYPER):推挽/开漏 - **速度**(GPIOx_OSPEEDR):2/10/50MHz - **上拉/下拉**(GPIOx_PUPDR):内部电阻配置 ### 二、特殊功能配置(如ADC) 若需将PA0用作ADC输入通道: 1. 设置模拟模式(如上) 2. 在ADC模块中启用通道0[^3]: ```c ADC1->CHSELR |= ADC_CHSELR_CHSEL0; // 选择通道0 ``` ### 三、文档参考位置 - **GPIO寄存器详解**:参考手册第8章《GPIO and AFIO》 - **ADC配置细节**:参考手册[^1]第14章《Analog-to-digital converter (ADC)》 - **完整寄存器映射表**:参考手册第3章《Memory and bus architecture》
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值