这个图片清晰明了,寄存器配置从下往上即可。

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"

void flash_init(){
	// 2. Flash配置(升频前必须)
    FLASH->ACR &= ~(0x03);
    FLASH->ACR |= 0x02;                // LATENCY=2,72M需要2个等待周期
    FLASH->ACR |= (1UL << 4);          // 预取缓冲
}

void rcc_init(){
	
	//使能HSE并等待使能成功
	RCC->CR |= (1ul << 16);
	while( !(RCC->CR & (1UL << 17)) );
	
	
	flash_init();

	//HSE直接给PLL,不走二分频
	RCC->CFGR &= ~(1ul << 17);

	
	//配置PLL倍频
	RCC->CFGR &= ~(0x0F << 18);
	RCC->CFGR |= (0x07 << 18);
	
	//使能PLL并等待使能成功
	RCC->CR |= (1ul << 24);
	while(!(RCC->CR & (1ul << 25)));
	
	//选择PLL为系统时钟
	RCC->CFGR |= (1ul << 1);
	RCC->CFGR &= (1ul << 0);
	
	//设置总线分频
	RCC->CFGR &= ~(1ul << 7);	//AHB不分频
	
	RCC->CFGR |= (1ul << 10);
	RCC->CFGR &= ~((1ul << 8) | (1ul << 9));	//APB1二分频
	
	RCC->CFGR &= ~(1ul << 13);	//APB2不分频
	
	//关闭HSL
	RCC->CR &= ~(1ul << 0);
}


int main(void)
{
	
	while (1)
	{

	}
}

reset and clock contorl(rcc),时钟树配置流程:

1、使能HSE并等待

2、flash等待2周期并开启指令

3、设置HSE直接给PLL还是先2分频,HSE为4~16M

4、设置PLL的倍频系数

5、使能PLL并等待完成

6、选择PLL为系统时钟

7、设置APB1,APB2,AHB三条总线的分频,其中APB1规定不能超过36M

8、关闭HSL

关于flash,就是cpu从flash取指令,如果cpu主频太高,flash处理不过来,指令预取我认为算是提高一个传输效率吧。

有关于flash的操作要在使能PLL前完成。

注意,板子上电时先运行systeminit,系统帮配好时钟树,再运送main,如果想验证自己写的对不对,那就注释掉这个systeminit。

来财,来。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐