[综合信息]

HC32F460 系统初始化代码【寄存器方式】分享

[复制链接]
34278|64
手机看帖
扫描二维码
随时随地手机跟帖
fxyc87|  楼主 | 2021-2-21 14:25 | 显示全部楼层 |阅读模式
本帖最后由 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
       

游客,如果您要查看本帖隐藏内容请回复

代码中注释已经比较详细了,对照手册基本都能看懂。

以上均为我的原创

使用特权

评论回复
杨寅辉| | 2021-2-22 19:40 | 显示全部楼层
厉害,现在基本上没有人用寄存器了,这样写代码太慢了,不过对于理解底层还是相当有用的。

使用特权

评论回复
yiyigirl2014| | 2021-2-22 22:00 | 显示全部楼层
隐藏了什么,看看。

使用特权

评论回复
xinpian101| | 2021-2-22 23:29 | 显示全部楼层
看看什么情况。

使用特权

评论回复
RobotRD| | 2021-2-23 15:46 | 显示全部楼层
支持原创

使用特权

评论回复
稳稳の幸福| | 2021-2-23 22:17 | 显示全部楼层
寄存器配置可是很重要的。

使用特权

评论回复
xixi2017| | 2021-2-24 14:29 | 显示全部楼层
看看隐藏的东西。

使用特权

评论回复
brosoon| | 2021-3-1 14:17 | 显示全部楼层
let me see !

使用特权

评论回复
suncl110| | 2021-3-3 13:46 | 显示全部楼层
let me see see!

使用特权

评论回复
单片小菜| | 2021-3-3 14:37 | 显示全部楼层
感谢楼主的分享,学习一下。

使用特权

评论回复
quark| | 2021-3-8 14:26 | 显示全部楼层
感谢楼主的分享,学习学习。

使用特权

评论回复
储小勇_526| | 2021-3-17 16:31 | 显示全部楼层
let me have a look

使用特权

评论回复
liumaoquan| | 2021-3-19 15:03 | 显示全部楼层
have a look

使用特权

评论回复
LUOTYB| | 2021-3-24 18:13 | 显示全部楼层
学习了

使用特权

评论回复
trucyw| | 2021-4-2 09:26 | 显示全部楼层

let me see see!

使用特权

评论回复
onono| | 2021-4-6 17:26 | 显示全部楼层
have a look look,华大的MCU感觉怪怪的

使用特权

评论回复
cp21210406| | 2021-4-12 10:31 | 显示全部楼层
谢谢楼主分享

使用特权

评论回复
wp053341| | 2021-4-16 09:00 | 显示全部楼层
谢谢楼主分享

使用特权

评论回复
uuu1234| | 2021-4-16 15:41 | 显示全部楼层
look

使用特权

评论回复
0520kuang| | 2021-4-21 11:28 | 显示全部楼层
开启隐藏的钥匙

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

104

帖子

1

粉丝