本帖最后由 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
-
代码中注释已经比较详细了,对照手册基本都能看懂。
以上均为我的原创
|