STM32 RCC系统初始化失败 单片机跑不起来
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32 RCC系统初始化失败 单片机跑不起来相关的知识,希望对你有一定的参考价值。
这个是源代码
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
GPIO_InitTypeDef GPIO_InitStructure;
#define LED1_ON GPIO_SetBits(GPIOB,GPIO_Pin_5);
#define LED1_OFF GPIO_ResetBits(GPIOB,GPIO_Pin_5);
void RCC_Configuration(void);
void GPIO_Configuration(void);
int main(void)
RCC_Configuration();
GPIO_Configuration();
while(1)
LED1_ON;
void RCC_Configuration(void)
ErrorStatus HSEStartUpStatus;
RCC_DeInit();
/* Enable HSE */
RCC_HSEConfig(RCC_HSE_ON);
/* Wait till HSE is ready */
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS)
/* HCLK = SYSCLK */
RCC_HCLKConfig(RCC_SYSCLK_Div1);
/* PCLK2 = HCLK */
RCC_PCLK2Config(RCC_HCLK_Div1);
/* PCLK1 = HCLK/2 */
RCC_PCLK1Config(RCC_HCLK_Div2);
/* Flash 2 wait state */
//FLASH_SetLatency(FLASH_Latency_2);
/* Enable Prefetch Buffer */
//FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
/* PLLCLK = 8MHz * 9 = 72 MHz */
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
/* Enable PLL */
RCC_PLLCmd(ENABLE);
/* Wait till PLL is ready */
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
/* Select PLL as system clock source */
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
/* Wait till PLL is used as system clock source */
while(RCC_GetSYSCLKSource() != 0x08)
void GPIO_Configuration(void)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB,&GPIO_InitStructure);
//FLASH_SetLatency(FLASH_Latency_2);
/* Enable Prefetch Buffer */
//FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
不能被注释掉,这是在配置flash的等待周期,48 MHz < SYSCLK ≤ 72 MHz
时是需要有两个等待周期得,否则flash有可能进入写保护,详细请看St的STM32F10xxx Flash programming这个文档,其中FLASH_ACR寄存器的最低3位就是配置等待周期的,这是必须要配的
或者你直接调用Systeminit就不用自己配时钟了 参考技术A /* Flash 2 wait state */
//FLASH_SetLatency(FLASH_Latency_2);
/* Enable Prefetch Buffer */
//FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
这处的 //FLASH_SetLatency(FLASH_Latency_2);
//FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
不能注释掉。我去掉注释试过了。一切正常。
Pioneer开发板--初识STM32/CH32
作者:南叶SLea
前言
本章通过分析STM32时钟系统,初步了解STM32的架构以及编程思维
参考资料:STM32中文手册
STM32时钟系统分析
时钟是每个单片机的心脏,其重要性不言而喻,接下来就对STM32时钟树进行详细分析
1.RCC-复位时钟控制
复位的方式有三种:系统复位、上电复位和备份区域复位,由于比较复位比较简单,详情请参考手册第六章复位部分。
2.时钟树分析
ST官方推荐的最稳定的时钟源为72M,下面就介绍72M是怎么来的。
2.1 HSE时钟
HSE时钟为外部高速时钟,采用4--16M的无源晶振,一般为8M的无源晶振。通过OSC_OUT和OSC_IN接入单片机电路,由RCC_CR时钟寄存器的第16位HSEON控制开启或者关闭。
根据时钟树来看,SHE产生震荡信号后,主要有三个去向:1是往RCC_CFGR寄存器走,2是进行2分频后进入RCC_CFGR,分频还是不分频由寄存器的第17位PLLXTPRE控制,3是经过128分频后进入RTCCLK,我们这里分析1和2。
2.2 PLLCLK
PLLCLK锁相环时钟,锁相环的主要作用就是能将频率较低的震荡信号变成频率较高的震荡信号,简单来说就是倍频。震荡信号经过PLLXTPRE之后来到PLLSRC,PLLSRC是RCC_CFGR第16位,作用是控制PLL的输入时钟源,PLL时钟的来源有两个,1是来自SHE时钟,2是来自HSI时钟,HSI是芯片内部的高速时钟,也是8M,但是它是作为备用存在的,一般不会使用它。所以PLL时钟就只能来源于SHE,SHE时钟有两种方式进入PLL时钟,一种不分频,一种2分频,如何选择呢?暂且一放,继续往下分析。下面就到了PLLMUL,这个同样是RCC_CFGR寄存器的其中一位,作用是选择倍频,可以2倍频,3倍频,,,,一直到16倍频,最终输出PLL时钟的频率。
2.3 SYSCLK
SYSCLK,系统时钟,官方推荐稳定频率为72M,其来源有三个,1是来源于HSI(内部时钟),2是来源于PLLCLK(锁相环时钟),3是来源于HSE(高速外部时钟)。前面我们说过,HSI一般为备用,所以PASS掉,而HSE频率只有8M,太低,PASS,所以,SYSCLK一般来源于PLLCLK,也就是说,PLLCLK的频率和SYSCLK的频率相等,现在可以回答HSE进入PLL是分频还是不分频了。官方推荐为72M,如果HSE 2分频进入PLL,那么就是8/2为4M,就算PLLMUL最大为16倍频,最终PLL的频率为64M,低于官方的推荐频率,所以不可行。如果HSE不分频,PLL选择9倍频,就是8*9=72M,符合官方推荐的频率。 现在线路很明确,HSE--->不分频--->PLLCLK--->SYSCLK
3总结
以上是关于STM32 RCC系统初始化失败 单片机跑不起来的主要内容,如果未能解决你的问题,请参考以下文章