STM32/STM8技术论坛
直播中

jf_59297869

1年用户 9经验值
擅长:可编程逻辑 嵌入式技术
私信 关注
[问答]

STM32F107配置内部时钟,网上找了都是配置外部时钟的

已退回1积分

回帖(3)

醉清歌

2024-1-9 17:08:06
以下是一个简单的配置STM32F107内部时钟的例子:

```c
#include "stm32f10x.h"

void RCC_Configuration(void)
{
  /* Enable HSI */
  RCC_HSICmd(ENABLE);

  /* Wait till HSI is ready */
  while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);

  /* HCLK = SYSCLK = HSI */
  RCC_HCLKConfig(RCC_SYSCLK_Div1);

  /* PCLK2 = HCLK */
  RCC_PCLK2Config(RCC_HCLK_Div1);

  /* PCLK1 = HCLK/2 */
  RCC_PCLK1Config(RCC_HCLK_Div2);

  /* Select HSI as system clock source */
  RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);

  /* Wait till HSI is used as system clock source */
  while(RCC_GetSYSCLKSource() != 0x00);
}

int main(void)
{
  RCC_Configuration();

  /* Your code here */

  while (1);
}
```

该例程中,首先启用了HSI(内部高速时钟)并等待它准备就绪。然后将HCLK(AHB总线时钟)、PCLK2(APB2总线时钟)和PCLK1(APB1总线时钟)配置为HSI时钟。最后,将系统时钟配置为HSI并等待配置完成。

请根据需求修改主函数中的实际代码。
3 举报
  • jf_59297869: 你这个是直接把HSI配置为系统时钟,只有8M,我想用锁相环倍频后给系统时钟,但是遇见个问题,RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_9);
            RCC_PLLCmd(ENABLE);

            while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);这里一直返回的是RESET,还不知道问题在哪
  • jf_59297869: 这是我的时钟配置:static void Drv_Bsp_RCC_Configuration(void)
    {
           
            RCC_DeInit();

            RCC_HSICmd(ENABLE);
            while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);

            FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
            FLASH_SetLatency(FLASH_Latency_2);

            RCC_HCLKConfig(RCC_SYSCLK_Div1);   
            RCC_PCLK1Config(RCC_HCLK_Div2);
            RCC_PCLK2Config(RCC_HCLK_Div1);
           

            RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_9);
            RCC_PLLCmd(ENABLE);

            while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

            RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//

            while(RCC_GetSYSCLKSource() != 0x08);//

            RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
                   
                    /* Enable GPIOA GPIOB SPI1 and USART1 clocks */
                    /* Enable GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF, GPIOG and AFIO clocks */
                    RCC_APB2PeriphClockCmd(
                    RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC
                            | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE);
                   
                    GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST, ENABLE);    //改变制定管脚的映射,除JTRST外,SWJ完全使能(JTAG+SW+DP)
                    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);         //JTAG_DP失能,SW_DP使能
           
    }
  • jf_59297869: 你这个是直接将HSI给系统时钟,我想用锁相环倍频后给系统时钟但是遇到一个问题,static void Drv_Bsp_RCC_Configuration(void)
    {
           
            RCC_DeInit();

            RCC_HSICmd(ENABLE);
            while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);

            FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
            FLASH_SetLatency(FLASH_Latency_2);

            RCC_HCLKConfig(RCC_SYSCLK_Div1);   
            RCC_PCLK1Config(RCC_HCLK_Div2);
            RCC_PCLK2Config(RCC_HCLK_Div1);
           

            RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_9);
            RCC_PLLCmd(ENABLE);

            while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

            RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//

            while(RCC_GetSYSCLKSource() != 0x08);//

            RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
                   
                    /* Enable GPIOA GPIOB SPI1 and USART1 clocks */
                    /* Enable GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF, GPIOG and AFIO clocks */
                    RCC_APB2PeriphClockCmd(
                    RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC
                            | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE);
                   
                    GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST, ENABLE);    //改变制定管脚的映射,除JTRST外,SWJ完全使能(JTAG+SW+DP)
                    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);         //JTAG_DP失能,SW_DP使能
           
    }
    在while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
    这里一直返回的RESET,还没找到问题在哪

jf_59297869

2024-1-10 10:06:50
输了几次评论都被吞了,不知道为什么,我就直接在答案里输了。你的代码是直接用HSI作系统时钟,我想用锁相环倍频后作系统时钟,但是遇到一个问题:
static void Drv_Bsp_RCC_Configuration(void)
{
       
        RCC_DeInit();

        RCC_HSICmd(ENABLE);
        while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);

        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
        FLASH_SetLatency(FLASH_Latency_2);

        RCC_HCLKConfig(RCC_SYSCLK_Div1);   
        RCC_PCLK1Config(RCC_HCLK_Div2);
        RCC_PCLK2Config(RCC_HCLK_Div1);
       

        RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_9);
        RCC_PLLCmd(ENABLE);

        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//

        while(RCC_GetSYSCLKSource() != 0x08);//

        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
               
                /* Enable GPIOA GPIOB SPI1 and USART1 clocks */
                /* Enable GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF, GPIOG and AFIO clocks */
                RCC_APB2PeriphClockCmd(
                RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC
                        | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE);
               
                GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST, ENABLE);    //改变制定管脚的映射,除JTRST外,SWJ完全使能(JTAG+SW+DP)
                GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);         //JTAG_DP失能,SW_DP使能
       
}
在while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);这句代码一直返回的是RESET,还没找到问题在哪
举报

jf_59297869

2024-1-10 14:20:51
问题解决了,参考的是这个。https://www.bilibili.com/read/cv21874529/
举报

更多回帖

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