查看: 6435|回复: 11

[原创] KL26寄存器编程来了!!!

[复制链接]
  • TA的每日心情
    开心
    2019-3-22 20:15
  • 签到天数: 21 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    23

    主题

    341

    帖子

    1

    高级会员

    Rank: 4

    积分
    909
    最后登录
    2019-4-7
    发表于 2016-3-19 12:22:02 | 显示全部楼层 |阅读模式
    本帖最后由 噬猎者 于 2016-3-19 16:06 编辑

    经过费时两星期的时间终于写完这些程序,虽然网上有很多,不过我认为我写的是最简练的!!!
    1.超频(这个是最最重要的东西了!!!没有他的话,48M能干什么用啊!!!)
    (1)50M晶振超频(我基本都是用96M主频,尽管他可以超频到120不过稳定性和寿命都会严重降低)
    1. void SystemClockSetup(void)
    2. {
    3.                 SIM->SCGC5 |= (uint32_t)0x0200UL; /*  开启 PORTA 时钟门 */   
    4.                 SIM->CLKDIV1 = (uint32_t)0x10010000UL; /*  内核/系统2分频;Flash和总线2分频 */
    5.                 /* PORTA->PCR18: ISF=0,MUX=0 */
    6.                 PORTA->PCR[18] &= (uint32_t)~0x01000700UL;
    7.                 /* PORTA->PCR19: ISF=0,MUX=0 */
    8.                 PORTA->PCR[19] &= (uint32_t)~0x01000700UL;
    9.                 /* Switch to FBE Mode */
    10.                 /* OSC0->CR: ERCLKEN=1,??=0,EREFSTEN=0,??=0,SC2P=1,SC4P=0,SC8P=0,SC16P=1 */        
    11.                 OSC0->CR = (uint8_t)0x89U; //外部参考使能;
    12.                 /* MCG->C2: LOCRE0=0,??=0,RANGE0=2,HGO0=0,EREFS0=1,LP=0,IRCS=0 */
    13.                 MCG->C2 = (uint8_t)0x34U; //选择使用外部参考源;使用8-32Mhz晶振
    14.                 /* MCG->C1: CLKS=2,FRDIV=3,IREFS=0,IRCLKEN=1,IREFSTEN=0 */
    15.                 MCG->C1 = (uint8_t)0xBAU; //FLL外部参考,1536分频
    16.                 /* MCG->C4: DMX32=0,DRST_DRS=0 */
    17.                 MCG->C4 &= (uint8_t)~(uint8_t)0xE0U;
    18.                 /* MCG->C5: ??=0,PLLCLKEN0=0,PLLSTEN0=0,PRDIV0=1 */
    19.                 MCG->C5 = MCG_C5_PRDIV0(24);// PLL外部参考,25分频        (寄存器自加1,设置0为1分频,1为2分频,2为3分频,n为n+1分频)
    20.                
    21. //超频96M
    22.                 MCG->C6 = MCG_C6_VDIV0(24); //2M*48 = 96M   此寄存器自加24,设置0则为24倍频
    23.                 SIM->CLKDIV1 = (SIM_CLKDIV1_OUTDIV1(0) | SIM_CLKDIV1_OUTDIV4(2)); //Core=96M/1  Bus=96M/1/3=32M    n+1倍分频
    24.                 SystemCoreClock = 96000000;

    25.                 while((MCG->S & MCG_S_IREFST_MASK) != 0x00U) {}; /* Check that the source of the FLL reference clock is the external reference clock. */
    26.                 while((MCG->S & 0x0CU) != 0x08U) {};    /* Wait until external reference clock is selected as MCG output */
    27.                 /* Switch to PBE Mode */
    28.                 /* MCG->C6: LOLIE0=0,PLLS=1,CME0=0,VDIV0=0 */
    29.                 MCG->C6 |= (uint8_t)0x40U;
    30.                 while((MCG->S & 0x0CU) != 0x08U) {};    /* Wait until external reference clock is selected as MCG output */
    31.                 while((MCG->S & MCG_S_LOCK0_MASK) == 0x00U) {}; /* Wait until locked */
    32.                 /* Switch to PEE Mode */
    33.                 /* MCG->C1: CLKS=0,FRDIV=3,IREFS=0,IRCLKEN=1,IREFSTEN=0 */
    34.                 MCG->C1 = (uint8_t)0x1AU;
    35.                 while((MCG->S & 0x0CU) != 0x0CU) {};    /* Wait until output of the PLL is selected */                        
    36. }
    复制代码
    里面有个很重要的前提,就是在系统初始化的头文件中一定要先把时钟改成内部时钟,才能改50M晶振启动和超频!!!
    就是下面的这个程序SystemInit()
    1. void SystemInit (void) //系统启动项,不要更改。
    2. {
    3. /* Disable the WDOG module */
    4.   /* SIM_COPC: COPT=0,COPCLKS=0,COPW=0 */
    5.   SIM->COPC = (uint32_t)0x00u;
    6. /* (DISABLE_WDOG) */

    7.    /* 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 */
    8.   SIM->CLKDIV1 = (uint32_t)0x00020000UL; /* Update system prescalers */
    9.   /* Switch to FEI Mode */
    10.   /* MCG->C1: CLKS=0,FRDIV=0,IREFS=1,IRCLKEN=1,IREFSTEN=0 */
    11.   MCG->C1 = (uint8_t)0x06U;
    12.   /* MCG_C2: LOCRE0=0,??=0,RANGE0=0,HGO0=0,EREFS0=0,LP=0,IRCS=0 */
    13.   MCG->C2 = (uint8_t)0x00U;
    14.   /* MCG->C4: DMX32=0,DRST_DRS=1 */
    15.   MCG->C4 = (uint8_t)((MCG->C4 & (uint8_t)~(uint8_t)0xC0U) | (uint8_t)0x20U);
    16.   /* OSC0->CR: ERCLKEN=1,??=0,EREFSTEN=0,??=0,SC2P=0,SC4P=0,SC8P=0,SC16P=0 */
    17.   OSC0->CR = (uint8_t)0x80U;
    18.   /* MCG->C5: ??=0,PLLCLKEN0=0,PLLSTEN0=0,PRDIV0=0 */
    19.   MCG->C5 = (uint8_t)0x00U;
    20.   /* MCG->C6: LOLIE0=0,PLLS=0,CME0=0,VDIV0=0 */
    21.   MCG->C6 = (uint8_t)0x00U;
    22.   while((MCG->S & MCG_S_IREFST_MASK) == 0x00U) { /* Check that the source of the FLL reference clock is the internal reference clock. */
    23.   }
    24.   while((MCG->S & 0x0CU) != 0x00U) {    /* Wait until output of the FLL is selected */
    25.   }
    26. }
    复制代码
    最后一个工作就是把SystemClockSetup()放到main主函数中就可以了。
    (2)8M晶振超频,都差不多,首先都要用我的这个SystemInit(),保证初始化时选择内部时钟.
    只要将SystemClockSetup()内部数据改成这个就可以了!
    1. //====使用外部8M时钟源====//        
    2.                 SIM->SCGC5 |= (uint32_t)0x0200UL; //  开启时钟门   
    3.                 SIM->CLKDIV1 = (uint32_t)0x10010000UL; //  内核/系统2分频;Flash和总线2分频
    4.                 PORTA->PCR[18] &= (uint32_t)~0x01000700UL;
    5.                 PORTA->PCR[19] &= (uint32_t)~0x01000700UL;
    6.                 // Switch to FBE Mode
    7.                 OSC0->CR = (uint8_t)0x89U; //外部参考使能;
    8.                 MCG->C2 = (uint8_t)0x24U; //选择使用外部参考源;使用1-8Mhz晶振
    9.                 MCG->C1 = (uint8_t)0x9AU; //FLL外部参考,256分频
    10.                 MCG->C4 &= (uint8_t)~(uint8_t)0xE0U;
    11.                 MCG->C5 = MCG_C5_PRDIV0(3);  //8M/4 = 2M ;PLL外部参考,四分频(寄存器自加1,设置0为1分频,1为2分频,2为3分频,n为n+1分频)
    12. #if         0//CoreClock_48M:
    13.                                 MCG->C6 = MCG_C6_VDIV0(0); //2M*24 = 48M   此寄存器自加24,设置0则为24倍频
    14.                                 SIM->CLKDIV1 = (SIM_CLKDIV1_OUTDIV1(0) | SIM_CLKDIV1_OUTDIV4(1)); //Core=48M/1  Bus=48M/1/2   n+1倍分频
    15.                                 SystemCoreClock = 48000000;                        
    16. #elif 0//CoreClock_24M:        
    17.                                 MCG->C6 = MCG_C6_VDIV0(0); //2M*24 = 48M   此寄存器自加24,设置0则为24倍频
    18.                                 SIM->CLKDIV1 = (SIM_CLKDIV1_OUTDIV1(1) | SIM_CLKDIV1_OUTDIV4(0)); //Core=48M/2  Bus=48M/2/1    n+1倍分频
    19.                                 SystemCoreClock = 24000000;        
    20. #elif 1//CoreClock_96M:        
    21.                                 MCG->C6 = MCG_C6_VDIV0(24); //2M*48 = 96M   此寄存器自加24,设置0则为24倍频
    22.                                 SIM->CLKDIV1 = (SIM_CLKDIV1_OUTDIV1(0) | SIM_CLKDIV1_OUTDIV4(2)); //Core=96M/1  Bus=96M/1/3=32M    n+1倍分频
    23.                                 SystemCoreClock = 96000000;        
    24. #elif 0//CoreClock_80M:        
    25.                                 MCG->C6 = MCG_C6_VDIV0(16); //2M*40 = 80M   此寄存器自加24,设置0则为24倍频
    26.                                 SIM->CLKDIV1 = (SIM_CLKDIV1_OUTDIV1(0) | SIM_CLKDIV1_OUTDIV4(2)); //Core=80M/1  Bus=80M/1/3=26.667m    n+1倍分频
    27.                                 SystemCoreClock = 80000000;
    28. #elif 0//CoreClock_64M:        
    29.                                 MCG->C6 = MCG_C6_VDIV0(8); //2M*32 = 64M   此寄存器自加24,设置0则为24倍频
    30.                                 SIM->CLKDIV1 = (SIM_CLKDIV1_OUTDIV1(0) | SIM_CLKDIV1_OUTDIV4(1)); //Core=64M/1  Bus=64M/1/2=32M    n+1倍分频
    31.                                 SystemCoreClock = 64000000;        
    32. #elif 0//CoreClock_100M:        
    33.                                 MCG->C6 = MCG_C6_VDIV0(26); //2M*50 = 100M   此寄存器自加24,设置0则为24倍频
    34.                                 SIM->CLKDIV1 = (SIM_CLKDIV1_OUTDIV1(0) | SIM_CLKDIV1_OUTDIV4(2)); //Core=100M/1  Bus=100M/1/3=33.33M    n+1倍分频
    35.                                 SystemCoreClock = 100000000;
    36. #elif 0//CoreClock_110M:        
    37.                                 MCG->C6 = MCG_C6_VDIV0(31); //2M*55= 110M   此寄存器自加24,设置0则为24倍频
    38.                                 SIM->CLKDIV1 = (SIM_CLKDIV1_OUTDIV1(0) | SIM_CLKDIV1_OUTDIV4(2)); //Core=110M/1  Bus=110M/1/3=36.67M    n+1倍分频
    39.                                 SystemCoreClock = 110000000;
    40. #else//CoreClock_120M:
    41.         MCG->C5 = MCG_C5_PRDIV0(1);                                
    42.                                 MCG->C6 = MCG_C6_VDIV0(6); //4M*30 = 120M   此寄存器自加24,设置0则为24倍频
    43.                                 SIM->CLKDIV1 = (SIM_CLKDIV1_OUTDIV1(0) | SIM_CLKDIV1_OUTDIV4(3)); //Core=120M/1  Bus=120M/1/4=30M    n+1倍分频
    44.                                 SystemCoreClock = 120000000;
    45. #endif
    46.                 while((MCG->S & MCG_S_IREFST_MASK) != 0x00U) {};
    47.                 while((MCG->S & 0x0CU) != 0x08U) {};   
    48.          //现在已经进入了 FBE模式
    49.                 MCG->C6 |= (uint8_t)0x40U;
    50.                 while((MCG->S & 0x0CU) != 0x08U) {};  
    51.                 while((MCG->S & MCG_S_LOCK0_MASK) == 0x00U) {};
    52.                 MCG->C1 = (uint8_t)0x1AU;
    53.                 while((MCG->S & 0x0CU) != 0x0CU) {};  
    复制代码
    2.LED初始化(基本做任何东西都要点个灯的!!)
    好吧,我们先了解下基本的gpio的寄存器的一些知识
    1. /*****************************************
    2. 操作IO寄存器:
    3. PORTx_PCRn
    4. 0.  上下拉选择         0-下拉                 1-上拉
    5. 1.  上下拉使能         0-不使能         1-使能
    6. 2.        引脚为输出时,0-快速模式 1-慢速模式
    7. 3.  0

    8. 4.         无源滤波器         0-禁用                 1-启用
    9. 5.        开漏模式选择 0-禁用                1-启用
    10. 6.  驱动能力选择        0-低驱动                1-高驱动
    11. 7.  0

    12. 10-8.引脚复用控制        
    13.                 000        引脚禁用
    14.                 001 功能选择1 GPIO
    15.                 010        功能选择2
    16.                 011        功能选择3
    17.                 100        功能选择4
    18.                 101        功能选择5
    19.                 110        功能选择6
    20.                 111        功能选择7        (JTAG/NMI)
    21. 11.        0

    22. 12.        0
    23. 13.        0
    24. 14.        0
    25. 15.        是否锁定引脚寄存器        0-不锁定         1-锁定

    26. 19-16 中断配置
    27.                 0000 中断/DMA请求禁止
    28.                 0001 上升沿产生DMA请求
    29.                 0010 下降沿产生DMA请求
    30.                 0011 上升下降沿产生DMA请求
    31.                 0100 保留
    32.                 1000 逻辑0时产生中断
    33.                 1001 上升沿产生中断
    34.                 1010 下降沿产生中断
    35.                 1011 上升下降沿产生中断
    36.                 1100 逻辑1产生中断

    37. 23-20.         0

    38. 24.中断状态标识  0-未检测到中断        1-检测到中断/DMA
    39. 25.0
    40. 26.0
    41. 27.0

    42. 31-28.        0

    43. ******************************************/
    复制代码

    大家看下他的寄存器就可以自己更改IO的功能了,还有,给大家提供个小工具,帮助你写寄存器的:

    寄存器位查看小工具.zip (57.59 KB, 下载次数: 21)

    评分

    参与人数 1NXP金币 +30 收起 理由
    小七 + 30 赞一个!

    查看全部评分

    成功的小小喜悦里,大脑自身可以产生兴奋剂哦!
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2017-1-24 09:50
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    654

    主题

    3262

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    13266
    最后登录
    2019-1-27
    发表于 2016-3-22 10:00:55 | 显示全部楼层
    寄存器编程 ~ 厉害!
    回复 支持 1 反对 0

    使用道具 举报

    该用户从未签到

    40

    主题

    500

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1089
    最后登录
    2025-1-13
    发表于 2016-3-19 12:41:12 | 显示全部楼层
    谢谢分享,不过KL27不可以超频
    xingxiny75@gmail.com.png
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-1-12 00:23
  • 签到天数: 745 天

    连续签到: 1 天

    [LV.9]以坛为家II

    27

    主题

    1万

    帖子

    26

    金牌会员

    Rank: 6Rank: 6

    积分
    6868
    最后登录
    2020-7-15
    发表于 2016-3-19 12:42:45 | 显示全部楼层
    收藏学习。谢谢!
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    59

    帖子

    0

    注册会员

    Rank: 2

    积分
    152
    最后登录
    2016-5-11
    发表于 2016-3-19 16:42:29 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2019-2-14 16:49
  • 签到天数: 296 天

    连续签到: 1 天

    [LV.8]以坛为家I

    241

    主题

    2239

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    4473
    最后登录
    2020-4-14
    发表于 2016-3-19 16:59:37 | 显示全部楼层
    谢谢分享,收藏学习了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    4

    主题

    132

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    418
    最后登录
    2018-12-14
    发表于 2016-3-19 21:16:01 | 显示全部楼层
    牛逼,来支持一下
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-2-14 16:49
  • 签到天数: 296 天

    连续签到: 1 天

    [LV.8]以坛为家I

    241

    主题

    2239

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    4473
    最后登录
    2020-4-14
    发表于 2016-3-19 22:45:05 | 显示全部楼层
    楼主的SystemClockSetup()程序我安装到KL16上也能超到110MHz,但在120MHz时LCD不显示了,但程序好像还在工作。很好的程序共享,谢谢!学习了!有时间在KL27 mini上试试,我想改改应该也可以。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-5-23 06:13
  • 签到天数: 1082 天

    连续签到: 1 天

    [LV.10]以坛为家III

    18

    主题

    1974

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    6221
    最后登录
    2025-9-4
    发表于 2016-3-20 10:43:45 | 显示全部楼层
    收藏学习。谢谢!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-5-3 11:19
  • 签到天数: 10 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    50

    主题

    1万

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    14090
    最后登录
    2024-4-19
    发表于 2016-3-20 15:38:49 | 显示全部楼层
    很好,很强大。。。 null - 副本 - 副本 - 副本.png null - 副本 - 副本 (2).png null - 副本 - 副本 (3).png null - 副本 - 副本.png null - 副本 (2) - 副本.png null - 副本 (2).png null - 副本 (3).png null - 副本 (4).png null - 副本.png null.png
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-9-4 12:54 , Processed in 0.117075 second(s), 31 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表