在线时间96 小时
UID3167208
注册时间2015-10-21
NXP金币0
TA的每日心情 | 开心 2019-3-22 20:15 |
---|
签到天数: 21 天 连续签到: 1 天 [LV.4]偶尔看看III
高级会员

- 积分
- 909
- 最后登录
- 2019-4-7
|
本帖最后由 噬猎者 于 2016-3-19 16:06 编辑
经过费时两星期的时间终于写完这些程序,虽然网上有很多,不过我认为我写的是最简练的!!!
1.超频(这个是最最重要的东西了!!!没有他的话,48M能干什么用啊!!!)
(1)50M晶振超频(我基本都是用96M主频,尽管他可以超频到120不过稳定性和寿命都会严重降低)
- void SystemClockSetup(void)
- {
- SIM->SCGC5 |= (uint32_t)0x0200UL; /* 开启 PORTA 时钟门 */
- SIM->CLKDIV1 = (uint32_t)0x10010000UL; /* 内核/系统2分频;Flash和总线2分频 */
- /* PORTA->PCR18: ISF=0,MUX=0 */
- PORTA->PCR[18] &= (uint32_t)~0x01000700UL;
- /* PORTA->PCR19: ISF=0,MUX=0 */
- PORTA->PCR[19] &= (uint32_t)~0x01000700UL;
- /* Switch to FBE Mode */
- /* OSC0->CR: ERCLKEN=1,??=0,EREFSTEN=0,??=0,SC2P=1,SC4P=0,SC8P=0,SC16P=1 */
- OSC0->CR = (uint8_t)0x89U; //外部参考使能;
- /* MCG->C2: LOCRE0=0,??=0,RANGE0=2,HGO0=0,EREFS0=1,LP=0,IRCS=0 */
- MCG->C2 = (uint8_t)0x34U; //选择使用外部参考源;使用8-32Mhz晶振
- /* MCG->C1: CLKS=2,FRDIV=3,IREFS=0,IRCLKEN=1,IREFSTEN=0 */
- MCG->C1 = (uint8_t)0xBAU; //FLL外部参考,1536分频
- /* MCG->C4: DMX32=0,DRST_DRS=0 */
- MCG->C4 &= (uint8_t)~(uint8_t)0xE0U;
- /* MCG->C5: ??=0,PLLCLKEN0=0,PLLSTEN0=0,PRDIV0=1 */
- MCG->C5 = MCG_C5_PRDIV0(24);// PLL外部参考,25分频 (寄存器自加1,设置0为1分频,1为2分频,2为3分频,n为n+1分频)
-
- //超频96M
- MCG->C6 = MCG_C6_VDIV0(24); //2M*48 = 96M 此寄存器自加24,设置0则为24倍频
- SIM->CLKDIV1 = (SIM_CLKDIV1_OUTDIV1(0) | SIM_CLKDIV1_OUTDIV4(2)); //Core=96M/1 Bus=96M/1/3=32M n+1倍分频
- SystemCoreClock = 96000000;
- while((MCG->S & MCG_S_IREFST_MASK) != 0x00U) {}; /* Check that the source of the FLL reference clock is the external reference clock. */
- while((MCG->S & 0x0CU) != 0x08U) {}; /* Wait until external reference clock is selected as MCG output */
- /* Switch to PBE Mode */
- /* MCG->C6: LOLIE0=0,PLLS=1,CME0=0,VDIV0=0 */
- MCG->C6 |= (uint8_t)0x40U;
- while((MCG->S & 0x0CU) != 0x08U) {}; /* Wait until external reference clock is selected as MCG output */
- while((MCG->S & MCG_S_LOCK0_MASK) == 0x00U) {}; /* Wait until locked */
- /* Switch to PEE Mode */
- /* MCG->C1: CLKS=0,FRDIV=3,IREFS=0,IRCLKEN=1,IREFSTEN=0 */
- MCG->C1 = (uint8_t)0x1AU;
- while((MCG->S & 0x0CU) != 0x0CU) {}; /* Wait until output of the PLL is selected */
- }
复制代码 里面有个很重要的前提,就是在系统初始化的头文件中一定要先把时钟改成内部时钟,才能改50M晶振启动和超频!!!
就是下面的这个程序SystemInit()
- void SystemInit (void) //系统启动项,不要更改。
- {
- /* Disable the WDOG module */
- /* SIM_COPC: COPT=0,COPCLKS=0,COPW=0 */
- SIM->COPC = (uint32_t)0x00u;
- /* (DISABLE_WDOG) */
- /* SIM->CLKDIV1: OUTDIV1=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,OUTDIV4=2,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0 */
- SIM->CLKDIV1 = (uint32_t)0x00020000UL; /* Update system prescalers */
- /* Switch to FEI Mode */
- /* MCG->C1: CLKS=0,FRDIV=0,IREFS=1,IRCLKEN=1,IREFSTEN=0 */
- MCG->C1 = (uint8_t)0x06U;
- /* MCG_C2: LOCRE0=0,??=0,RANGE0=0,HGO0=0,EREFS0=0,LP=0,IRCS=0 */
- MCG->C2 = (uint8_t)0x00U;
- /* MCG->C4: DMX32=0,DRST_DRS=1 */
- MCG->C4 = (uint8_t)((MCG->C4 & (uint8_t)~(uint8_t)0xC0U) | (uint8_t)0x20U);
- /* OSC0->CR: ERCLKEN=1,??=0,EREFSTEN=0,??=0,SC2P=0,SC4P=0,SC8P=0,SC16P=0 */
- OSC0->CR = (uint8_t)0x80U;
- /* MCG->C5: ??=0,PLLCLKEN0=0,PLLSTEN0=0,PRDIV0=0 */
- MCG->C5 = (uint8_t)0x00U;
- /* MCG->C6: LOLIE0=0,PLLS=0,CME0=0,VDIV0=0 */
- MCG->C6 = (uint8_t)0x00U;
- while((MCG->S & MCG_S_IREFST_MASK) == 0x00U) { /* Check that the source of the FLL reference clock is the internal reference clock. */
- }
- while((MCG->S & 0x0CU) != 0x00U) { /* Wait until output of the FLL is selected */
- }
- }
复制代码 最后一个工作就是把SystemClockSetup()放到main主函数中就可以了。
(2)8M晶振超频,都差不多,首先都要用我的这个SystemInit(),保证初始化时选择内部时钟.
只要将SystemClockSetup()内部数据改成这个就可以了!
- //====使用外部8M时钟源====//
- SIM->SCGC5 |= (uint32_t)0x0200UL; // 开启时钟门
- SIM->CLKDIV1 = (uint32_t)0x10010000UL; // 内核/系统2分频;Flash和总线2分频
- PORTA->PCR[18] &= (uint32_t)~0x01000700UL;
- PORTA->PCR[19] &= (uint32_t)~0x01000700UL;
- // Switch to FBE Mode
- OSC0->CR = (uint8_t)0x89U; //外部参考使能;
- MCG->C2 = (uint8_t)0x24U; //选择使用外部参考源;使用1-8Mhz晶振
- MCG->C1 = (uint8_t)0x9AU; //FLL外部参考,256分频
- MCG->C4 &= (uint8_t)~(uint8_t)0xE0U;
- MCG->C5 = MCG_C5_PRDIV0(3); //8M/4 = 2M ;PLL外部参考,四分频(寄存器自加1,设置0为1分频,1为2分频,2为3分频,n为n+1分频)
- #if 0//CoreClock_48M:
- MCG->C6 = MCG_C6_VDIV0(0); //2M*24 = 48M 此寄存器自加24,设置0则为24倍频
- SIM->CLKDIV1 = (SIM_CLKDIV1_OUTDIV1(0) | SIM_CLKDIV1_OUTDIV4(1)); //Core=48M/1 Bus=48M/1/2 n+1倍分频
- SystemCoreClock = 48000000;
- #elif 0//CoreClock_24M:
- MCG->C6 = MCG_C6_VDIV0(0); //2M*24 = 48M 此寄存器自加24,设置0则为24倍频
- SIM->CLKDIV1 = (SIM_CLKDIV1_OUTDIV1(1) | SIM_CLKDIV1_OUTDIV4(0)); //Core=48M/2 Bus=48M/2/1 n+1倍分频
- SystemCoreClock = 24000000;
- #elif 1//CoreClock_96M:
- MCG->C6 = MCG_C6_VDIV0(24); //2M*48 = 96M 此寄存器自加24,设置0则为24倍频
- SIM->CLKDIV1 = (SIM_CLKDIV1_OUTDIV1(0) | SIM_CLKDIV1_OUTDIV4(2)); //Core=96M/1 Bus=96M/1/3=32M n+1倍分频
- SystemCoreClock = 96000000;
- #elif 0//CoreClock_80M:
- MCG->C6 = MCG_C6_VDIV0(16); //2M*40 = 80M 此寄存器自加24,设置0则为24倍频
- SIM->CLKDIV1 = (SIM_CLKDIV1_OUTDIV1(0) | SIM_CLKDIV1_OUTDIV4(2)); //Core=80M/1 Bus=80M/1/3=26.667m n+1倍分频
- SystemCoreClock = 80000000;
- #elif 0//CoreClock_64M:
- MCG->C6 = MCG_C6_VDIV0(8); //2M*32 = 64M 此寄存器自加24,设置0则为24倍频
- SIM->CLKDIV1 = (SIM_CLKDIV1_OUTDIV1(0) | SIM_CLKDIV1_OUTDIV4(1)); //Core=64M/1 Bus=64M/1/2=32M n+1倍分频
- SystemCoreClock = 64000000;
- #elif 0//CoreClock_100M:
- MCG->C6 = MCG_C6_VDIV0(26); //2M*50 = 100M 此寄存器自加24,设置0则为24倍频
- SIM->CLKDIV1 = (SIM_CLKDIV1_OUTDIV1(0) | SIM_CLKDIV1_OUTDIV4(2)); //Core=100M/1 Bus=100M/1/3=33.33M n+1倍分频
- SystemCoreClock = 100000000;
- #elif 0//CoreClock_110M:
- MCG->C6 = MCG_C6_VDIV0(31); //2M*55= 110M 此寄存器自加24,设置0则为24倍频
- SIM->CLKDIV1 = (SIM_CLKDIV1_OUTDIV1(0) | SIM_CLKDIV1_OUTDIV4(2)); //Core=110M/1 Bus=110M/1/3=36.67M n+1倍分频
- SystemCoreClock = 110000000;
- #else//CoreClock_120M:
- MCG->C5 = MCG_C5_PRDIV0(1);
- MCG->C6 = MCG_C6_VDIV0(6); //4M*30 = 120M 此寄存器自加24,设置0则为24倍频
- SIM->CLKDIV1 = (SIM_CLKDIV1_OUTDIV1(0) | SIM_CLKDIV1_OUTDIV4(3)); //Core=120M/1 Bus=120M/1/4=30M n+1倍分频
- SystemCoreClock = 120000000;
- #endif
- while((MCG->S & MCG_S_IREFST_MASK) != 0x00U) {};
- while((MCG->S & 0x0CU) != 0x08U) {};
- //现在已经进入了 FBE模式
- MCG->C6 |= (uint8_t)0x40U;
- while((MCG->S & 0x0CU) != 0x08U) {};
- while((MCG->S & MCG_S_LOCK0_MASK) == 0x00U) {};
- MCG->C1 = (uint8_t)0x1AU;
- while((MCG->S & 0x0CU) != 0x0CU) {};
复制代码 2.LED初始化(基本做任何东西都要点个灯的!!)
好吧,我们先了解下基本的gpio的寄存器的一些知识
- /*****************************************
- 操作IO寄存器:
- PORTx_PCRn
- 0. 上下拉选择 0-下拉 1-上拉
- 1. 上下拉使能 0-不使能 1-使能
- 2. 引脚为输出时,0-快速模式 1-慢速模式
- 3. 0
- 4. 无源滤波器 0-禁用 1-启用
- 5. 开漏模式选择 0-禁用 1-启用
- 6. 驱动能力选择 0-低驱动 1-高驱动
- 7. 0
- 10-8.引脚复用控制
- 000 引脚禁用
- 001 功能选择1 GPIO
- 010 功能选择2
- 011 功能选择3
- 100 功能选择4
- 101 功能选择5
- 110 功能选择6
- 111 功能选择7 (JTAG/NMI)
- 11. 0
- 12. 0
- 13. 0
- 14. 0
- 15. 是否锁定引脚寄存器 0-不锁定 1-锁定
- 19-16 中断配置
- 0000 中断/DMA请求禁止
- 0001 上升沿产生DMA请求
- 0010 下降沿产生DMA请求
- 0011 上升下降沿产生DMA请求
- 0100 保留
- 1000 逻辑0时产生中断
- 1001 上升沿产生中断
- 1010 下降沿产生中断
- 1011 上升下降沿产生中断
- 1100 逻辑1产生中断
- 23-20. 0
- 24.中断状态标识 0-未检测到中断 1-检测到中断/DMA
- 25.0
- 26.0
- 27.0
- 31-28. 0
- ******************************************/
复制代码
大家看下他的寄存器就可以自己更改IO的功能了,还有,给大家提供个小工具,帮助你写寄存器的:
寄存器位查看小工具.zip
(57.59 KB, 下载次数: 21)
|
评分
-
查看全部评分
|