123
返回列表 发新帖
楼主: bsdpgsql

[求助] 求助一个锁的问题

[复制链接]

该用户从未签到

3

主题

143

帖子

0

中级会员

Rank: 3Rank: 3

积分
443
最后登录
2020-10-29
 楼主| 发表于 2014-12-24 18:01:25 | 显示全部楼层
本帖最后由 bsdpgsql 于 2014-12-24 18:05 编辑
FSL_TICS_ZJJ 发表于 2014-12-24 15:21
把systeminit部分调整的地方贴出来看看。

就是keil自己带的啊,这段代码和它的头文件不存在移植性问题,所以我没修改直接放到kds工程里面了。
用keil自己的工程编译之后下下去不会锁,用上面楼的工程搞出来下下去会锁。
我知道一定问题是出在我那个工程的某个地方,只是我检查很多遍,确实看不出哪里能导致芯片锁(虽然要被锁,但是所有外设功能都是正常使用的,,,)


  1. /*
  2. ** ###################################################################
  3. **     Processors:          MKL02Z32CAF4
  4. **                          MKL02Z32VFG4
  5. **                          MKL02Z16VFG4
  6. **                          MKL02Z8VFG4
  7. **                          MKL02Z32VFK4
  8. **                          MKL02Z16VFK4
  9. **                          MKL02Z32VFM4
  10. **                          MKL02Z16VFM4
  11. **
  12. **     Compilers:           ARM Compiler
  13. **                          Freescale C/C++ for Embedded ARM
  14. **                          GNU C Compiler
  15. **                          IAR ANSI C/C++ Compiler for ARM
  16. **
  17. **     Reference manual:    KL02RM, Rev.2, Dec 2012
  18. **     Version:             rev. 1.0, 2012-10-04
  19. **
  20. **     Abstract:
  21. **         Provides a system configuration function and a global variable that
  22. **         contains the system frequency. It configures the device and initializes
  23. **         the oscillator (PLL) that is part of the microcontroller device.
  24. **
  25. **     Copyright: 2012 Freescale, Inc. All Rights Reserved.
  26. **
  27. **     http:                 www.freescale.com
  28. **     mail:                 support@freescale.com
  29. **
  30. **     Revisions:
  31. **     - rev. 1.0 (2012-10-04)
  32. **         Initial version.
  33. **
  34. ** ###################################################################
  35. */

  36. /**
  37. * @file MKL02Z4
  38. * @version 1.0
  39. * @date 2012-10-04
  40. * @brief Device specific configuration file for MKL02Z4 (implementation file)
  41. *
  42. * Provides a system configuration function and a global variable that contains
  43. * the system frequency. It configures the device and initializes the oscillator
  44. * (PLL) that is part of the microcontroller device.
  45. */

  46. #include <stdint.h>
  47. #include "MKL02Z4.h"

  48. #define DISABLE_WDOG    1

  49. #define CLOCK_SETUP     0
  50. /* Predefined clock setups
  51.    0 ... Multipurpose Clock Generator (MCG) in FLL Engaged Internal (FEI) mode
  52.          Reference clock source for MCG module is the slow internal clock source 32.768kHz
  53.          Core clock = 41.94MHz, BusClock = 13.98MHz
  54.    1 ... Multipurpose Clock Generator (MCG) in FLL Engaged External (FEE) mode
  55.          Reference clock source for MCG module is an external crystal 32.768kHz
  56.          Core clock = 47.97MHz, BusClock = 23.984MHz
  57.    2 ... Multipurpose Clock Generator (MCG) in FLL Bypassed Low Power Internal (BLPI) mode
  58.          Core clock/Bus clock derived directly from an fast internal 4MHz clock with no multiplication
  59.          Core clock = 4MHz, BusClock = 4MHz
  60. */

  61. /*----------------------------------------------------------------------------
  62.   Define clock source values
  63. *----------------------------------------------------------------------------*/
  64. #if (CLOCK_SETUP == 0)
  65.     #define CPU_XTAL_CLK_HZ                 32768u   /* Value of the external crystal or oscillator clock frequency in Hz */
  66.     #define CPU_INT_SLOW_CLK_HZ             32768u   /* Value of the slow internal oscillator clock frequency in Hz  */
  67.     #define CPU_INT_FAST_CLK_HZ             4000000u /* Value of the fast internal oscillator clock frequency in Hz  */
  68.     #define DEFAULT_SYSTEM_CLOCK            41943040u /* Default System clock value */
  69. #elif (CLOCK_SETUP == 1)
  70.     #define CPU_XTAL_CLK_HZ                 32768u   /* Value of the external crystal or oscillator clock frequency in Hz */
  71.     #define CPU_INT_SLOW_CLK_HZ             32768u   /* Value of the slow internal oscillator clock frequency in Hz  */
  72.     #define CPU_INT_FAST_CLK_HZ             4000000u /* Value of the fast internal oscillator clock frequency in Hz  */
  73.     #define DEFAULT_SYSTEM_CLOCK            47972352u /* Default System clock value */
  74. #elif (CLOCK_SETUP == 2)
  75.     #define CPU_XTAL_CLK_HZ                 32768u /* Value of the external crystal or oscillator clock frequency in Hz */
  76.     #define CPU_INT_SLOW_CLK_HZ             32768u   /* Value of the slow internal oscillator clock frequency in Hz  */
  77.     #define CPU_INT_FAST_CLK_HZ             4000000u /* Value of the fast internal oscillator clock frequency in Hz  */
  78.     #define DEFAULT_SYSTEM_CLOCK            4000000u /* Default System clock value */
  79. #endif /* (CLOCK_SETUP == 2) */


  80. /* ----------------------------------------------------------------------------
  81.    -- Core clock
  82.    ---------------------------------------------------------------------------- */

  83. uint32_t SystemCoreClock = DEFAULT_SYSTEM_CLOCK;

  84. /* ----------------------------------------------------------------------------
  85.    -- SystemInit()
  86.    ---------------------------------------------------------------------------- */

  87. void SystemInit (void) {
  88. #if (DISABLE_WDOG)
  89.   /* Disable the WDOG module */
  90.   /* SIM_COPC: COPT=0,COPCLKS=0,COPW=0 */
  91.   SIM->COPC = (uint32_t)0x00u;
  92. #endif /* (DISABLE_WDOG) */
  93. #if (CLOCK_SETUP == 0)
  94.   /* SIM->CLKDIV1: OUTDIV1=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,OUTDIV4=1,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0 */
  95.   SIM->CLKDIV1 = (SIM_CLKDIV1_OUTDIV1(0x00) | SIM_CLKDIV1_OUTDIV4(0x01)); /* Update system prescalers */
  96.   /* Switch to FEI Mode */
  97.   /* MCG->C1: CLKS=0,FRDIV=0,IREFS=1,IRCLKEN=1,IREFSTEN=0 */
  98.   MCG->C1 = MCG_C1_CLKS(0x00) |
  99.            MCG_C1_FRDIV(0x00) |
  100.            MCG_C1_IREFS_MASK |
  101.            MCG_C1_IRCLKEN_MASK;
  102.   /* MCG_C2: LOCRE0=0,RANGE0=0,HGO0=0,EREFS0=0,LP=0,IRCS=0 */
  103.   MCG->C2 &= (uint8_t)~(uint8_t)(
  104.              MCG_C2_LOCRE0_MASK |
  105.              MCG_C2_RANGE0(0x03) |
  106.              MCG_C2_HGO0_MASK |
  107.              MCG_C2_EREFS0_MASK |
  108.              MCG_C2_LP_MASK |
  109.              MCG_C2_IRCS_MASK
  110.             );
  111.   /* MCG->C4: DMX32=0,DRST_DRS=1 */
  112.   MCG->C4 = (uint8_t)((MCG->C4 & (uint8_t)~(uint8_t)(
  113.             MCG_C4_DMX32_MASK |
  114.             MCG_C4_DRST_DRS(0x02)
  115.            )) | (uint8_t)(
  116.             MCG_C4_DRST_DRS(0x01)
  117.            ));
  118.   /* OSC0->CR: ERCLKEN=1,??=0,EREFSTEN=0,??=0,SC2P=0,SC4P=0,SC8P=0,SC16P=0 */
  119.   OSC0->CR = OSC_CR_ERCLKEN_MASK;
  120.   while((MCG->S & MCG_S_IREFST_MASK) == 0x00U) { /* Check that the source of the FLL reference clock is the internal reference clock. */
  121.   }
  122.   while((MCG->S & 0x0CU) != 0x00U) {    /* Wait until output of the FLL is selected */
  123.   }
  124. #elif (CLOCK_SETUP == 1)
  125.   /* SIM->SCGC5: PORTA=1 */
  126.   SIM->SCGC5 |= SIM_SCGC5_PORTA_MASK; /* Enable clock gate for ports to enable pin routing */
  127.   /* SIM->CLKDIV1: OUTDIV1=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,OUTDIV4=1,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0 */
  128.   SIM->CLKDIV1 = (SIM_CLKDIV1_OUTDIV1(0x00) | SIM_CLKDIV1_OUTDIV4(0x01)); /* Update system prescalers */
  129.   /* PORTA->PCR3: ISF=0,MUX=0 */
  130.   PORTA->PCR[3] &= (uint32_t)~(uint32_t)((PORT_PCR_ISF_MASK | PORT_PCR_MUX(0x07)));
  131.   /* PORTA->PCR4: ISF=0,MUX=0 */
  132.   PORTA->PCR[4] &= (uint32_t)~(uint32_t)((PORT_PCR_ISF_MASK | PORT_PCR_MUX(0x07)));
  133.   /* Switch to FEE Mode */
  134.   /* MCG->C2: LOCRE0=0,RANGE0=0,HGO0=0,EREFS0=1,LP=0,IRCS=0 */
  135.   MCG->C2 = (uint8_t)((MCG->C2 & (uint8_t)~(uint8_t)(
  136.             MCG_C2_LOCRE0_MASK |
  137.             MCG_C2_RANGE0(0x03) |
  138.             MCG_C2_HGO0_MASK |
  139.             MCG_C2_LP_MASK |
  140.             MCG_C2_IRCS_MASK
  141.            )) | (uint8_t)(
  142.             MCG_C2_EREFS0_MASK
  143.            ));
  144.   /* OSC0->CR: ERCLKEN=1,??=0,EREFSTEN=0,??=0,SC2P=0,SC4P=0,SC8P=0,SC16P=0 */
  145.   OSC0->CR = OSC_CR_ERCLKEN_MASK;
  146.   /* MCG->C1: CLKS=0,FRDIV=0,IREFS=0,IRCLKEN=1,IREFSTEN=0 */
  147.   MCG->C1 = (MCG_C1_CLKS(0x00) | MCG_C1_FRDIV(0x00) | MCG_C1_IRCLKEN_MASK);
  148.   /* MCG->C4: DMX32=1,DRST_DRS=1 */
  149.   MCG->C4 = (uint8_t)((MCG->C4 & (uint8_t)~(uint8_t)(
  150.             MCG_C4_DRST_DRS(0x02)
  151.            )) | (uint8_t)(
  152.             MCG_C4_DMX32_MASK |
  153.             MCG_C4_DRST_DRS(0x01)
  154.            ));
  155.   while((MCG->S & MCG_S_IREFST_MASK) != 0x00U) { /* Check that the source of the FLL reference clock is the external reference clock. */
  156.   }
  157.   while((MCG->S & 0x0CU) != 0x00U) {    /* Wait until output of the FLL is selected */
  158.   }
  159. #elif (CLOCK_SETUP == 2)
  160.   /* SIM->CLKDIV1: OUTDIV1=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,OUTDIV4=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0 */
  161.   SIM->CLKDIV1 = (SIM_CLKDIV1_OUTDIV1(0x00) | SIM_CLKDIV1_OUTDIV4(0x00)); /* Update system prescalers */
  162.   /* MCG->SC: FCRDIV=0 */
  163.   MCG->SC &= (uint8_t)~(uint8_t)(MCG_SC_FCRDIV(0x07));
  164.   /* Switch to FBI Mode */
  165.   /* MCG->C1: CLKS=1,FRDIV=0,IREFS=1,IRCLKEN=1,IREFSTEN=0 */
  166.   MCG->C1 = MCG_C1_CLKS(0x01) |
  167.            MCG_C1_FRDIV(0x00) |
  168.            MCG_C1_IREFS_MASK |
  169.            MCG_C1_IRCLKEN_MASK;
  170.   /* MCG_C2: LOCRE0=0,RANGE0=0,HGO0=0,EREFS0=0,LP=0,IRCS=1 */
  171.   MCG->C2 = (uint8_t)((MCG->C2 & (uint8_t)~(uint8_t)(
  172.             MCG_C2_LOCRE0_MASK |
  173.             MCG_C2_RANGE0(0x03) |
  174.             MCG_C2_HGO0_MASK |
  175.             MCG_C2_EREFS0_MASK |
  176.             MCG_C2_LP_MASK
  177.            )) | (uint8_t)(
  178.             MCG_C2_IRCS_MASK
  179.            ));
  180.   /* MCG->C4: DMX32=0,DRST_DRS=0 */
  181.   MCG->C4 &= (uint8_t)~(uint8_t)((MCG_C4_DMX32_MASK | MCG_C4_DRST_DRS(0x03)));
  182.   /* OSC0->CR: ERCLKEN=1,??=0,EREFSTEN=0,??=0,SC2P=0,SC4P=0,SC8P=0,SC16P=0 */
  183.   OSC0->CR = OSC_CR_ERCLKEN_MASK;
  184.   while((MCG->S & MCG_S_IREFST_MASK) == 0x00U) { /* Check that the source of the FLL reference clock is the internal reference clock. */
  185.   }
  186.   while((MCG->S & 0x0CU) != 0x04U) {    /* Wait until internal reference clock is selected as MCG output */
  187.   }
  188.   /* Switch to BLPI Mode */
  189.   /* MCG->C2: LOCRE0=0,RANGE0=0,HGO0=0,EREFS0=0,LP=1,IRCS=1 */
  190.   MCG->C2 = (uint8_t)((MCG->C2 & (uint8_t)~(uint8_t)(
  191.             MCG_C2_LOCRE0_MASK |
  192.             MCG_C2_RANGE0(0x03) |
  193.             MCG_C2_HGO0_MASK |
  194.             MCG_C2_EREFS0_MASK
  195.            )) | (uint8_t)(
  196.             MCG_C2_LP_MASK |
  197.             MCG_C2_IRCS_MASK
  198.            ));
  199.   while((MCG->S & MCG_S_IREFST_MASK) == 0x00U) { /* Check that the source of the FLL reference clock is the internal reference clock. */
  200.   }
  201.   while((MCG->S & MCG_S_IRCST_MASK) == 0x00U) { /* Check that the fast external reference clock is selected. */
  202.   }
  203. #endif /* (CLOCK_SETUP == 2) */
  204. }

  205. /* ----------------------------------------------------------------------------
  206.    -- SystemCoreClockUpdate()
  207.    ---------------------------------------------------------------------------- */

  208. void SystemCoreClockUpdate (void) {
  209.   uint32_t MCGOUTClock;                                                        /* Variable to store output clock frequency of the MCG module */
  210.   uint8_t Divider;

  211.   if ((MCG->C1 & MCG_C1_CLKS_MASK) == 0x0u) {
  212.     /* Output of FLL is selected */
  213.     if ((MCG->C1 & MCG_C1_IREFS_MASK) == 0x0u) {
  214.       /* External reference clock is selected */
  215.       MCGOUTClock = CPU_XTAL_CLK_HZ;                                       /* System oscillator drives MCG clock */
  216.       Divider = (uint8_t)(1u << ((MCG->C1 & MCG_C1_FRDIV_MASK) >> MCG_C1_FRDIV_SHIFT));
  217.       MCGOUTClock = (MCGOUTClock / Divider);  /* Calculate the divided FLL reference clock */
  218.     } else { /* (!((MCG->C1 & MCG_C1_IREFS_MASK) == 0x0u)) */
  219.       MCGOUTClock = CPU_INT_SLOW_CLK_HZ;                                     /* The slow internal reference clock is selected */
  220.     } /* (!((MCG->C1 & MCG_C1_IREFS_MASK) == 0x0u)) */
  221.     /* Select correct multiplier to calculate the MCG output clock  */
  222.     switch (MCG->C4 & (MCG_C4_DMX32_MASK | MCG_C4_DRST_DRS_MASK)) {
  223.       case 0x0u:
  224.         MCGOUTClock *= 640u;
  225.         break;
  226.       case 0x20u:
  227.         MCGOUTClock *= 1280u;
  228.         break;
  229.       case 0x40u:
  230.         MCGOUTClock *= 1920u;
  231.         break;
  232.       case 0x60u:
  233.         MCGOUTClock *= 2560u;
  234.         break;
  235.       case 0x80u:
  236.         MCGOUTClock *= 732u;
  237.         break;
  238.       case 0xA0u:
  239.         MCGOUTClock *= 1464u;
  240.         break;
  241.       case 0xC0u:
  242.         MCGOUTClock *= 2197u;
  243.         break;
  244.       case 0xE0u:
  245.         MCGOUTClock *= 2929u;
  246.         break;
  247.       default:
  248.         break;
  249.     }
  250.   } else if ((MCG->C1 & MCG_C1_CLKS_MASK) == 0x40u) {
  251.     /* Internal reference clock is selected */
  252.     if ((MCG->C2 & MCG_C2_IRCS_MASK) == 0x0u) {
  253.       MCGOUTClock = CPU_INT_SLOW_CLK_HZ;                                       /* Slow internal reference clock selected */
  254.     } else { /* (!((MCG->C2 & MCG_C2_IRCS_MASK) == 0x0u)) */
  255.       MCGOUTClock = CPU_INT_FAST_CLK_HZ / (1 << ((MCG->SC & MCG_SC_FCRDIV_MASK) >> MCG_SC_FCRDIV_SHIFT));  /* Fast internal reference clock selected */
  256.     } /* (!((MCG->C2 & MCG_C2_IRCS_MASK) == 0x0u)) */
  257.   } else if ((MCG->C1 & MCG_C1_CLKS_MASK) == 0x80u) {
  258.     /* External reference clock is selected */
  259.     MCGOUTClock = CPU_XTAL_CLK_HZ;                                           /* System oscillator drives MCG clock */
  260.   } else { /* (!((MCG->C1 & MCG_C1_CLKS_MASK) == 0x80u)) */
  261.     /* Reserved value */
  262.     return;
  263.   } /* (!((MCG->C1 & MCG_C1_CLKS_MASK) == 0x80u)) */
  264.   SystemCoreClock = (MCGOUTClock / (1u + ((SIM->CLKDIV1 & SIM_CLKDIV1_OUTDIV1_MASK) >> SIM_CLKDIV1_OUTDIV1_SHIFT)));
  265. }
复制代码
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

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

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

GMT+8, 2025-7-20 20:32 , Processed in 0.133626 second(s), 20 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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