本帖最后由 fxyc87 于 2021-2-21 14:26 编辑
#申请原创# 我没有用官方库来初始化
对着手册用寄存器方式来初始化的
对于想了解底层或学习的可以用这种方式
直接上代码,fxyc87原创
<div class="blockcode"><blockquote> //使用FPU必须加上
SCB->CPACR |= ((3UL << 20) | (3UL << 22)); /* set CP10 and CP11 Full Access */
GPIO_UNLOCK();
M4_PORT->POERB|= BIT(1);
//系统时钟倍频 8/1*50/2=200Mhz
//x*m*n 240-480mhz
//m*n/p=200mhz
//m=1,n=50,p=2
REG_WRITE_EN(); //系统寄存器可以写
//开始晶振
M4_SYSREG->CMU_XTALCFGR_f.XTALDRV=2; //XTAL驱动能力选择 10:小驱动能力(建议8~16MHz晶振)
M4_SYSREG->CMU_XTALCR=0; //XTAL振荡器开启停止位 0: XTAL振荡器振荡
//注意,必需先检测稳定后才能开启故障复位,否则会一直复位
//检查晶振稳定
while(bM4_SYSREG_CMU_OSCSTBSR_XTALSTBF==0); //1: XTAL稳定
//开启晶振 故障复位
bM4_SYSREG_CMU_XTALSTDCR_XTALSTDE=1; //XTAL振荡故障检测功能允许 1:允许XTAL振荡故障检测
bM4_SYSREG_CMU_XTALSTDCR_XTALSTDRIS=1; //XTAL振荡故障复位中断选择 1: XTAL振荡故障产生复位
bM4_SYSREG_CMU_XTALSTDCR_XTALSTDRE=1; //XTAL振荡故障复位允许 1:允许XTAL振荡故障复位
//PLL配置
M4_SYSREG->CMU_PLLCFGR_f.MPLLP=1; //MPLL分频 0001: 2分频
M4_SYSREG->CMU_PLLCFGR_f.MPLLN=(50-1); //MPLL倍频系数 50倍
M4_SYSREG->CMU_PLLCFGR_f.PLLSRC=0; //MPLL/UPLL输入时钟 0:选择外部高速振荡器作为MPLL/UPLL的输入时钟
M4_SYSREG->CMU_PLLCFGR_f.MPLLM=0; //MPLL输入时钟分频 00000: 1分频
M4_SYSREG->CMU_PLLCR=0; //0: MPLL动作开始
//检查MPLL稳定
while(bM4_SYSREG_CMU_OSCSTBSR_MPLLSTBF==0); //1: MPLL稳定
//hclk 200m
M4_SYSREG->CMU_SCFGR_f.HCLKS=0; //000:系统时钟的1分频 200/1
//pclk0 200m
M4_SYSREG->CMU_SCFGR_f.PCLK0S=0; //00:系统时钟的1分频 200/1
//pclk1 100m
M4_SYSREG->CMU_SCFGR_f.PCLK1S=1; //001:系统时钟的2分频 200/2=100
//pclk2 max 60m
M4_SYSREG->CMU_SCFGR_f.PCLK2S=2; //010:系统时钟的4分频 200/4=50
//pclk3 50m
M4_SYSREG->CMU_SCFGR_f.PCLK3S=2; //010:系统时钟的4分频 200/4=50
//pclk4 100m
M4_SYSREG->CMU_SCFGR_f.PCLK4S=1; //001:系统时钟的2分频 200/2
//exclk 100m
//M4_SYSREG->CMU_SCFGR_f.EXCKS=
//
//FLASH 5个周期
M4_EFM->FAPRT=0x0123; //解除FLASH保护1
M4_EFM->FAPRT=0x3210; //解除FLASH保护2
M4_EFM->FRMC_f.CACHE=1; //1:缓存功能使能
M4_EFM->FRMC_f.FLWT=5; //FLASH读插入的等待 0101b:插入5个等待周期
M4_EFM->FAPRT=0; //继续保护
//ram 除ramh外,其它均100mhz
M4_SRAMC->WTPR=(0x3b<<1)|1; //sram控制寄存器允许写入
M4_SRAMC->WTCR_f.SRAMR_RWT=1; //001b: 2周期
M4_SRAMC->WTCR_f.SRAMR_WWT=1; //001b: 2周期
M4_SRAMC->WTCR_f.SRAMH_RWT=0; //000b: 1周期
M4_SRAMC->WTCR_f.SRAMH_WWT=0; //000b: 1周期
M4_SRAMC->WTCR_f.SRAM3_RWT=1; //001b: 2周期
M4_SRAMC->WTCR_f.SRAM3_WWT=1; //001b: 2周期
M4_SRAMC->WTCR_f.SRAM12_RWT=1; //001b: 2周期
M4_SRAMC->WTCR_f.SRAM12_WWT=1; //001b: 2周期
M4_SRAMC->WTPR=(0x3b<<1)|0; //sram控制寄存器禁止写入
//切换系统主时钟
M4_SYSREG->CMU_CKSWR_f.CKSW=5; //系统时钟源切换 1 0 1:选择MPLL作为系统时钟
//
//开启时钟
REG_WRITE_DI(); //系统寄存器禁止写
SystemCoreClockUpdate();
//看门狗初始化 1秒内必须喂狗一次 CR只能赋值一次
//
M4_WDT->CR=2 | (13<<4) | BIT(31) ;
/*
M4_WDT->CR_f.WDPT=0; //0-100%
M4_WDT->CR_f.ITS=0; //复位MCU,狗溢出时
M4_WDT->CR_f.CKS=13; //1101: PCLK3/8192
M4_WDT->CR_f.PERI=3; //1=4096 2=16384 3=65536
*/
DOG();
//pclk3 50m 50M/8192/4096=0.67S左右
//16384=2.68s
//65536=10.7s
//===========GPIO初始化
M4_PORT->PCCR_f.RDWT=3; //设置读寄存器PIDRx, PCRxy时插入的等待周期数 11 3周期 126~200MHz
代码中注释已经比较详细了,对照手册基本都能看懂。
以上均为我的原创
|