搜索

[综合信息] HC32F460 系统初始化代码【寄存器方式】分享

[复制链接]
590|10
 楼主 | 2021-2-21 14:25 | 显示全部楼层 |阅读模式
本帖最后由 fxyc87 于 2021-2-21 14:26 编辑

#申请原创# 我没有用官方库来初始化
对着手册用寄存器方式来初始化的
对于想了解底层或学习的可以用这种方式
直接上代码,fxyc87原创
  1. <div class="blockcode"><blockquote>  //使用FPU必须加上
  2.                 SCB->CPACR |= ((3UL << 20) | (3UL << 22)); /* set CP10 and CP11 Full Access */

  3.         GPIO_UNLOCK();
  4.         M4_PORT->POERB|=        BIT(1);

  5.         //系统时钟倍频        8/1*50/2=200Mhz
  6.         //x*m*n 240-480mhz
  7.         //m*n/p=200mhz
  8.         //m=1,n=50,p=2
  9.        
  10.         REG_WRITE_EN();                                                                                                        //系统寄存器可以写
  11.         //开始晶振
  12.         M4_SYSREG->CMU_XTALCFGR_f.XTALDRV=2;                //XTAL驱动能力选择                                        10:小驱动能力(建议8~16MHz晶振)
  13.         M4_SYSREG->CMU_XTALCR=0;                                                                //XTAL振荡器开启停止位                        0: XTAL振荡器振荡
  14.         //注意,必需先检测稳定后才能开启故障复位,否则会一直复位
  15.         //检查晶振稳定  
  16.         while(bM4_SYSREG_CMU_OSCSTBSR_XTALSTBF==0);                                                                                                        //1: XTAL稳定
  17.         //开启晶振 故障复位
  18.         bM4_SYSREG_CMU_XTALSTDCR_XTALSTDE=1;                //XTAL振荡故障检测功能允许        1:允许XTAL振荡故障检测
  19.         bM4_SYSREG_CMU_XTALSTDCR_XTALSTDRIS=1;        //XTAL振荡故障复位中断选择        1: XTAL振荡故障产生复位
  20.         bM4_SYSREG_CMU_XTALSTDCR_XTALSTDRE=1;                //XTAL振荡故障复位允许                        1:允许XTAL振荡故障复位
  21.         //PLL配置
  22.         M4_SYSREG->CMU_PLLCFGR_f.MPLLP=1;                                //MPLL分频                                                                         0001: 2分频
  23.         M4_SYSREG->CMU_PLLCFGR_f.MPLLN=(50-1);        //MPLL倍频系数                                                         50倍
  24.         M4_SYSREG->CMU_PLLCFGR_f.PLLSRC=0;                        //MPLL/UPLL输入时钟                                        0:选择外部高速振荡器作为MPLL/UPLL的输入时钟
  25.         M4_SYSREG->CMU_PLLCFGR_f.MPLLM=0;                                //MPLL输入时钟分频                                        00000: 1分频
  26.         M4_SYSREG->CMU_PLLCR=0;                                                                        //0: MPLL动作开始
  27.         //检查MPLL稳定
  28.         while(bM4_SYSREG_CMU_OSCSTBSR_MPLLSTBF==0);                                                                                                        //1: MPLL稳定
  29.         //hclk 200m
  30.         M4_SYSREG->CMU_SCFGR_f.HCLKS=0;                                        //000:系统时钟的1分频                200/1
  31.         //pclk0 200m
  32.         M4_SYSREG->CMU_SCFGR_f.PCLK0S=0;                                //00:系统时钟的1分频                        200/1
  33.         //pclk1 100m
  34.         M4_SYSREG->CMU_SCFGR_f.PCLK1S=1;                                //001:系统时钟的2分频                200/2=100
  35.         //pclk2 max 60m
  36.         M4_SYSREG->CMU_SCFGR_f.PCLK2S=2;                                //010:系统时钟的4分频                200/4=50
  37.         //pclk3 50m
  38.         M4_SYSREG->CMU_SCFGR_f.PCLK3S=2;                                //010:系统时钟的4分频                200/4=50
  39.         //pclk4 100m
  40.         M4_SYSREG->CMU_SCFGR_f.PCLK4S=1;                                //001:系统时钟的2分频                200/2
  41.         //exclk 100m
  42.         //M4_SYSREG->CMU_SCFGR_f.EXCKS=
  43.         //
  44.         //FLASH 5个周期
  45.         M4_EFM->FAPRT=0x0123;                                                                                //解除FLASH保护1
  46.         M4_EFM->FAPRT=0x3210;                                                                                //解除FLASH保护2
  47.         M4_EFM->FRMC_f.CACHE=1;                                                                        //1:缓存功能使能
  48.         M4_EFM->FRMC_f.FLWT=5;                                                                        //FLASH读插入的等待                                0101b:插入5个等待周期
  49.         M4_EFM->FAPRT=0;                                                                                                //继续保护
  50.        
  51.        
  52.         //ram 除ramh外,其它均100mhz
  53.         M4_SRAMC->WTPR=(0x3b<<1)|1;                                                        //sram控制寄存器允许写入
  54.         M4_SRAMC->WTCR_f.SRAMR_RWT=1;                                                //001b: 2周期
  55.         M4_SRAMC->WTCR_f.SRAMR_WWT=1;                                                //001b: 2周期
  56.         M4_SRAMC->WTCR_f.SRAMH_RWT=0;                                                //000b: 1周期
  57.         M4_SRAMC->WTCR_f.SRAMH_WWT=0;                                                //000b: 1周期
  58.         M4_SRAMC->WTCR_f.SRAM3_RWT=1;                                                //001b: 2周期
  59.         M4_SRAMC->WTCR_f.SRAM3_WWT=1;                                                //001b: 2周期
  60.         M4_SRAMC->WTCR_f.SRAM12_RWT=1;                                        //001b: 2周期
  61.         M4_SRAMC->WTCR_f.SRAM12_WWT=1;                                        //001b: 2周期
  62.         M4_SRAMC->WTPR=(0x3b<<1)|0;                                                        //sram控制寄存器禁止写入
  63.        
  64.         //切换系统主时钟
  65.         M4_SYSREG->CMU_CKSWR_f.CKSW=5;                                        //系统时钟源切换                                                1 0 1:选择MPLL作为系统时钟
  66.         //
  67.         //开启时钟
  68.         REG_WRITE_DI();                                                                                                        //系统寄存器禁止写
  69.        
  70.         SystemCoreClockUpdate();
  71.        
  72.        
  73.         //看门狗初始化   1秒内必须喂狗一次   CR只能赋值一次
  74.         //
  75.         M4_WDT->CR=2  |  (13<<4)  | BIT(31)  ;
  76.         /*
  77.         M4_WDT->CR_f.WDPT=0;                                //0-100%
  78.         M4_WDT->CR_f.ITS=0;                                        //复位MCU,狗溢出时
  79.         M4_WDT->CR_f.CKS=13;                                //1101: PCLK3/8192
  80.         M4_WDT->CR_f.PERI=3;                                //1=4096 2=16384 3=65536
  81.         */
  82.         DOG();
  83.         //pclk3 50m   50M/8192/4096=0.67S左右
  84.                                                                 //16384=2.68s
  85.                                                                 //65536=10.7s
  86.        
  87.        
  88.         //===========GPIO初始化
  89.         M4_PORT->PCCR_f.RDWT=3;                                        //设置读寄存器PIDRx, PCRxy时插入的等待周期数                        11 3周期 126~200MHz
  90.        
复制代码

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

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

以上均为我的原创

使用特权

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

使用特权

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

使用特权

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

使用特权

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

使用特权

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

使用特权

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

使用特权

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

使用特权

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

使用特权

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

使用特权

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

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 我要提问 投诉建议 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表