[demo程序] NV32F100x 库文件ics.c中文注释

[复制链接]
1389|1
 楼主| jp_chen 发表于 2017-7-26 16:43 | 显示全部楼层 |阅读模式
  1. /*****************************************************************************
  2. * [url=home.php?mod=space&uid=247401]@brief[/url] providing APIs for configuring internal clock sources (ICS).
  3. *
  4. *******************************************************************************
  5. *
  6. * provide APIs for configuring internal clock sources (ICS)
  7. ******************************************************************************/
  8. #include "common.h"
  9. #include "ics.h"

  10. /******************************************************************************
  11. * Global variables
  12. ******************************************************************************/

  13. /******************************************************************************
  14. * Constants and macros
  15. ******************************************************************************/

  16. /*ICS与OSC模块各寄存器的复位值*/
  17. #define ICS_C1_DEFAULT  0x04            
  18. #define ICS_C2_DEFAULT  0x20
  19. #define ICS_C3_DEFAULT  0x54
  20. #define ICS_C4_DEFAULT  0x00
  21. #define ICS_S_DEFAULT   0x50
  22. #define OSC_CR_DEFAULT  0


  23. /******************************************************************************
  24. * Local types
  25. ******************************************************************************/

  26. /******************************************************************************
  27. * Local function prototypes
  28. ******************************************************************************/


  29. /******************************************************************************
  30. * Local variables
  31. ******************************************************************************/

  32. /******************************************************************************
  33. * Local functions
  34. ******************************************************************************/

  35. /******************************************************************************
  36. * Global functions
  37. ******************************************************************************/


  38. /*****************************************************************************//*!
  39.    *
  40.    * [url=home.php?mod=space&uid=72445]@[/url] ICS的工作模式由当前的FEI模式切换为FEE模式,对选中的时钟源做2分频
  41.          *
  42.          * @ OSC模块的输出时钟选择振荡器时钟源
  43.    *
  44.    * @ 输入 pConfig  指向ICS配置结构体
  45.    *
  46.    * @ 无返回
  47.    *
  48.    *****************************************************************************/
  49. void FEI_to_FEE(ICS_ConfigType *pConfig)
  50. {
  51.         /* 使能OSC
  52.          *
  53.          */
  54.         OSC_Init(&pConfig->oscConfig); /*OSC模块初始化*/
  55.        
  56.         /* 对外部参考时钟进行分频,可将外部时钟分频到31.25k~39.0625k之间
  57.          *
  58.          */

  59.     ICS_SetClkDivider(pConfig->u32ClkFreq);

  60.         /*将FLL的参考时钟选择为外部时钟*/
  61.         ICS->C1 =  ICS->C1 & ~ICS_C1_IREFS_MASK;
  62.          
  63.        
  64.         /*等待FLL参考时钟变为外部时钟*/
  65. #if defined(IAR)        
  66.         asm(
  67.                 "nop \n"
  68.                 "nop \n"
  69.         );
  70. #elif defined(__MWERKS__)
  71.         asm{
  72.                 nop
  73.                 nop
  74. };        
  75. #endif        
  76.         while(ICS->S & ICS_S_IREFST_MASK);
  77.        
  78.         /* 等待FLL时钟成为ICS输出时钟源*/
  79.         while(!(ICS->S & ICS_S_LOCK_MASK));
  80.                
  81.         /* 现在FLL输出时钟变时钟频率等于FLL参考时钟分频结果乘以FLL的倍频系数
  82.          * FLL的倍频系数请参考参考手册
  83.          */
  84. #if defined(CPU_NV32)

  85. /*对选中的是时钟源做2分频*/

  86.         if(((ICS->C2 & ICS_C2_BDIV_MASK)>>5) != 1)
  87.         {
  88.                 ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(1);
  89.         }
  90. #else
  91.     ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(0);
  92. #endif
  93.         /*  完成对选中的时钟源做2分频,系统/总线时钟时频率为设置的目标频率
  94.          *
  95.          */
  96.         /*lols清0*/
  97.         ICS->S |= ICS_S_LOLS_MASK;       
  98. }

  99. /*****************************************************************************//*!
  100.    *
  101.    * @ ICS的工作模式由当前的FEI模式转变成FBI模式,内部时钟源分频参数设置为2
  102.    *        
  103.    * @ 输入  pConfig    指向ICS配置结构体.
  104.    *
  105.    * @ 无返回
  106.    *
  107.    *****************************************************************************/
  108. void FEI_to_FBI(ICS_ConfigType *pConfig)
  109. {
  110.         /*输出时钟源选择内部参考时钟*/
  111.         ICS->C1 = (ICS->C1 & ~(ICS_C1_CLKS_MASK)) | ICS_C1_CLKS(1);   
  112.         ICS->C2 = ICS->C2 & ~(ICS_C2_LP_MASK);             /*在bypass模式FLL不会被禁止*/
  113.         /*等待内部时钟成为时钟输出源*/
  114. #if defined(IAR)        
  115.         asm(
  116.                 "nop \n"
  117.                 "nop \n"
  118.         );
  119. #elif defined(__MWERKS__)
  120.         asm{
  121.                 nop
  122.                 nop
  123.         };        
  124. #endif        
  125.         while(((ICS->S & ICS_S_CLKST_MASK) >> ICS_S_CLKST_SHIFT) !=1);
  126.                        
  127.         /* 现在内部参考时钟为输出时钟源
  128.          *
  129.          */
  130. #if defined(BUS_CLK_EQU_CORE_DIVIDE_BY_2)||defined(CPU_NV32)
  131.                                
  132.                 /*对选中的时钟源做2分频*/
  133.         if(((ICS->C2 & ICS_C2_BDIV_MASK)>>5) != 1)
  134.         {
  135.                 ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(1);
  136.         }

  137. #else
  138.         ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK));     
  139. #endif        
  140.         /*LOLS清零*/
  141.         ICS->S |= ICS_S_LOLS_MASK;       
  142. }

  143. /*****************************************************************************//*!
  144.    *
  145.    * @ ICS的工作模式由当前的FEI模式转换成FBE模式,对选中的内部时钟源做2分频
  146.    *  
  147.    * @ OSC模块的输出时钟选择振荡器时钟源
  148.    *
  149.    * @  pConfig   指向ICS的配置结构体 .
  150.    *
  151.    * @ 无返回
  152.    *
  153.    *****************************************************************************/
  154. void FEI_to_FBE(ICS_ConfigType *pConfig)
  155. {
  156.         OSC_Init(&pConfig->oscConfig); /* 初始化OSC 模块*/

  157.         /*设置FLL的参考时钟为外部时钟*/
  158.     ICS->C1 =  ICS->C1 & ~(ICS_C1_IREFS_MASK);
  159.         ICS->C1 = (ICS->C1 & ~(ICS_C1_CLKS_MASK)) | ICS_C1_CLKS(2);  /*外部时钟做为ICS输出时钟源*/
  160.         ICS->C2 = ICS->C2 & ~(ICS_C2_LP_MASK);                     /*在bypass模式FLL不会被禁止*/
  161.         
  162.         /*等在参考时钟发生改变*/
  163. #if defined(IAR)        
  164.         asm(
  165.                 "nop \n"
  166.                 "nop \n"
  167.         );
  168. #elif defined(__MWERKS__)
  169.         asm{
  170.                 nop
  171.                 nop
  172.         };        
  173. #endif        

  174.         while(((ICS->S & ICS_S_CLKST_MASK) >> ICS_S_CLKST_SHIFT) !=2);  /*外部时钟成为ICS时钟输出源*/
  175.         while(ICS->S & ICS_S_IREFST_MASK);    /*FLL参考时钟成为外部时钟*/
  176.                        
  177.         /* 现在外部时钟成为时钟输出源
  178.          *
  179.          */
  180. #if defined(CPU_NV32)
  181.                 /*对选中的时钟源做2分频*/       
  182.         if(((ICS->C2 & ICS_C2_BDIV_MASK)>>5) != 1)
  183.         {
  184.                 ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(1);
  185.         }
  186. #else
  187.     ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(0);
  188. #endif
  189.         /* 现在系统/总线时钟变为外部参考时钟的2分频
  190.          *
  191.          */
  192.         /* lols清零 */
  193.         ICS->S |= ICS_S_LOLS_MASK;       
  194. }

  195. /*****************************************************************************//*!
  196.    *
  197.    * @ ICS的工作模式由当前的FEI模式转换成FBE模式?
  198.    *
  199.    * @ OSC输出时钟选择EEXTAL引脚的外部时钟源
  200.    *
  201.    * @ 对选中的内部时钟源做2分频   
  202.    *
  203.    * @ 输入 pConfig  指向配置结构体.
  204.    *
  205.    * @ 无返回
  206.    *
  207.    *****************************************************************************/
  208. void FEI_to_FBE_OSC(ICS_ConfigType *pConfig)
  209. {
  210.    
  211.         OSC_Init(&pConfig->oscConfig); /* 初始化OSC */

  212.         /*设置参考时钟的分频系数,将参考时钟的分频结果设定在26K~40K内
  213.          *
  214.          */
  215.     ICS_SetClkDivider(pConfig->u32ClkFreq);
  216.    
  217.         /* 假设外部晶振为8Mhz/4Mhz
  218.          *
  219.          */
  220.         /*改变参考时钟源*/
  221.    ICS->C1 =  ICS->C1 & ~(ICS_C1_IREFS_MASK);/*将FLL的参考时钟设置为而外部参考时钟*/
  222.         ICS->C1 = (ICS->C1 & ~(ICS_C1_CLKS_MASK)) | ICS_C1_CLKS(2);   /*输出时钟源选择外部时钟*/
  223.         ICS->C2 = ICS->C2 & ~(ICS_C2_LP_MASK);   
  224.         
  225.         /* 等待参考时钟发生改变*/
  226. #if defined(IAR)        
  227.         asm(
  228.                 "nop \n"
  229.                 "nop \n"
  230.         );
  231. #elif defined(__MWERKS__)
  232.         asm{
  233.                 nop
  234.                 nop
  235.         };        
  236. #endif     
  237.         while(((ICS->S & ICS_S_CLKST_MASK) >> ICS_S_CLKST_SHIFT) !=2);/*外部时钟成为ICS时钟输出时钟源*/
  238.         while(ICS->S & ICS_S_IREFST_MASK);          /*外部时钟成为FLL参考时钟*/
  239.                        
  240.         /* 现在外部时钟成为FLL参考时钟和ICS输出时钟源
  241.          *
  242.          */
  243. #if defined(CPU_NV32)
  244.                                 /*对选中的时钟源做2分频*/
  245.         if(((ICS->C2 & ICS_C2_BDIV_MASK)>>5) != 1)
  246.         {
  247.                 ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(1);
  248.         }
  249. #else
  250.     ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(0);
  251. #endif
  252.         /* 现在系统/系统总线时钟为选中时钟源的2分频
  253.          *
  254.          */
  255.         /*lols 清零*/
  256.         ICS->S |= ICS_S_LOLS_MASK;       
  257. }

  258. /*****************************************************************************//*!
  259.    *
  260.    * @ ICS的工作模式由当前的FEI模式转换FEE模式?
  261.    *
  262.    * @ 对选中的内部时钟源做2分频
  263.    *
  264.    * @ OSC输出时钟选择EEXTAL引脚的外部时钟源
  265.    *
  266.    * @ 输入  pConfig    指向配置结构体
  267.    *
  268.    * @ 无返回
  269.    *
  270.    *****************************************************************************/
  271. void FEI_to_FEE_OSC(ICS_ConfigType *pConfig)
  272. {

  273.         OSC_Init(&pConfig->oscConfig); /*初始化OSC */

  274.         /* 设置参考时钟的分频系数,将参考时钟的分频结果设定在26K~40K
  275.          *
  276.          */
  277.     ICS_SetClkDivider(pConfig->u32ClkFreq);

  278.         /* 将FLL的参考时钟设置为外部时钟 */
  279.     ICS->C1 =  ICS->C1 & ~(ICS_C1_IREFS_MASK);
  280.        
  281.         /*等待参考时钟变化*/
  282. #if defined(IAR)        
  283.         asm(
  284.                 "nop \n"
  285.                 "nop \n"
  286.         );
  287. #elif defined(__MWERKS__)
  288.         asm{
  289.                 nop
  290.                 nop
  291.         };        
  292. #endif     
  293.         while(ICS->S & ICS_S_IREFST_MASK);    /*FLL参考时钟变为外部时钟*/
  294.        
  295.         /*等待FLL成为时钟输出源 */
  296.         while(!(ICS->S & ICS_S_LOCK_MASK));   
  297. #if defined(CPU_NV32)               
  298.                                 /*对选中的时钟源做2分频*/
  299.         if(((ICS->C2 & ICS_C2_BDIV_MASK)>>5) != 1)
  300.         {
  301.                 ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(1);
  302.         }
  303. #else
  304.     ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(0);
  305. #endif
  306.         /* 现在系统/总线时钟为选中时钟源的2分频
  307.          *
  308.          */
  309.         /* LOLS清零 */
  310.         ICS->S |= ICS_S_LOLS_MASK;       
  311. }


  312. /*****************************************************************************//*!
  313.    *
  314.    * @ 将ICS的工作模式由当前的FEE模式转换成FEI模式.
  315.    *        
  316.    * @ 输入 pConfig  指向配置结构体
  317.    *
  318.    * @ 无返回
  319.    *
  320.    *****************************************************************************/
  321. void FEE_to_FEI(ICS_ConfigType *pConfig)
  322. {
  323.         /*选择内部时钟作为FLL的参考时钟*/
  324.     ICS->C1 =  ICS->C1 | (ICS_C1_IREFS_MASK);
  325.        
  326.         /*等待参考时钟发生改变*/
  327. #if defined(IAR)        
  328.         asm(
  329.                 "nop \n"
  330.                 "nop \n"
  331.         );
  332. #elif defined(__MWERKS__)
  333.         asm{
  334.                 nop
  335.                 nop
  336.         };        
  337. #endif     
  338.         while(!(ICS->S & ICS_S_IREFST_MASK));/*FLL参考时钟成为内部时钟*/
  339.        
  340.         /*FLL时钟做为ICS输出时钟源 */
  341.         while(!(ICS->S & ICS_S_LOCK_MASK));

  342.         /*LOLS清零*/
  343.         ICS->S |= ICS_S_LOLS_MASK;

  344.         /* 现在FLL输出成为ICS输出时钟源?
  345.          *
  346.          */
  347. #if defined(CPU_NV32)
  348.                         /*对选中的时钟源做2分频*/
  349.         if(((ICS->C2 & ICS_C2_BDIV_MASK)>>5) != 1)
  350.         {
  351.                 ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(1);
  352.         }
  353. #else
  354.     ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(0);
  355. #endif
  356.         /* 现在系统/总线时钟大约为 16MHz
  357.          *
  358.          */
  359.             ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(0);
  360.       OSC_Disable();            /* 禁用 OSC */
  361. }

  362. /*****************************************************************************//*!
  363.    *
  364.    * @ 将ICS的工作模式由当前的FEE模式转换成FBI模式.
  365.    *        
  366.    * @ 输入 pConfig    指向配置结构体
  367.    *
  368.    * @ 无返回
  369.    *
  370.    *****************************************************************************/
  371. void FEE_to_FBI(ICS_ConfigType *pConfig)
  372. {
  373.         /*LOLS清零*/
  374.         ICS->S |= ICS_S_LOLS_MASK;
  375.        
  376.         /* 选择内部时钟作为输出时钟源 */
  377.         /* 选择内部时钟作为FLL参考时钟 */
  378.         /* LP = 0 在bypass模式FLL不会被禁止*/

  379.     ICS->C1 =  ICS->C1 | (ICS_C1_IREFS_MASK);
  380.         ICS->C1 = (ICS->C1 & ~(ICS_C1_CLKS_MASK)) | ICS_C1_CLKS(1);   
  381.         ICS->C2 = ICS->C2 & ~(ICS_C2_LP_MASK);
  382.        
  383.         /* 等待参考时钟发生改变 */
  384. #if defined(IAR)        
  385.         asm(
  386.                 "nop \n"
  387.                 "nop \n"
  388.         );
  389. #elif defined(__MWERKS__)
  390.         asm{
  391.                 nop
  392.                 nop
  393.         };        
  394. #endif     
  395.         while(!(ICS->S & ICS_S_IREFST_MASK));  /*FLL参考时钟成为内部时钟*/
  396.         while(((ICS->S & ICS_S_CLKST_MASK) >> ICS_S_CLKST_SHIFT) !=1);  /*内部时成为ICS输出时钟源*/
  397.        
  398. #if defined(BUS_CLK_EQU_CORE_DIVIDE_BY_2)||defined(CPU_NV32)   
  399.    /*对所选时钟源做2分频*/                               
  400.         if(((ICS->C2 & ICS_C2_BDIV_MASK)>>5) != 1)
  401.         {
  402.                 ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(1);
  403.         }

  404. #else
  405.         ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK));
  406.       
  407. #endif   
  408.         OSC_Disable();            
  409. }


  410. /*****************************************************************************//*!
  411.    *
  412.    * @ 将ICS的工作模式由当前的FEE模式转变成FBE模式
  413.    *        
  414.    * @ 输入 pConfig  指向配置结构体
  415.    *
  416.    * @ 无返回
  417.    *
  418.    *****************************************************************************/
  419. void FEE_to_FBE(ICS_ConfigType *pConfig)
  420. {
  421.         /*LOLS清零*/
  422.         ICS->S |= ICS_S_LOLS_MASK;
  423.        
  424.         /*选择外部时钟作为输出时钟源*/
  425.         /* LP = 0 在bypass模式FLL不会被禁止*/
  426.         ICS->C1 = (ICS->C1 & ~(ICS_C1_CLKS_MASK)) | ICS_C1_CLKS(2);   
  427.         ICS->C2 = ICS->C2 & ~(ICS_C2_LP_MASK);
  428.        
  429.         /*等待输出时钟源发生改变*/
  430. #if defined(IAR)        
  431.         asm(
  432.                 "nop \n"
  433.                 "nop \n"
  434.         );
  435. #elif defined(__MWERKS__)
  436.         asm{
  437.                 nop
  438.                 nop
  439.         };        
  440. #endif     
  441.         while(((ICS->S & ICS_S_CLKST_MASK) >> ICS_S_CLKST_SHIFT) !=2);/*外部时钟成为ICS输出时钟源*/
  442.        
  443.         /* 现在ICS输出时钟源选择外部时钟源
  444.          * 注释: 确保外部时钟频率在20Mhz以内
  445.          */
  446. #if defined(CPU_NV32)         
  447.                 /*对选择的时钟源做2分频*/
  448.         if(((ICS->C2 & ICS_C2_BDIV_MASK)>>5) != 1)
  449.         {
  450.                 ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(1);
  451.         }       
  452. #else
  453.     ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(0);
  454. #endif
  455. }
  456. /*****************************************************************************//*!
  457.    *
  458.    * @ 将ICS的工作模式由当前的FBI模式转换成FBE模式
  459.    *        
  460.    * @ 输入  pConfig   指向配置结构体.
  461.    *
  462.    * @ 无返回
  463.    *
  464.    *****************************************************************************/
  465. void FBI_to_FBE(ICS_ConfigType *pConfig)
  466. {
  467.         OSC_Init(&pConfig->oscConfig); /* 初始化OSC */
  468.    
  469.         /* 选择外部时钟做为FLL的参考时钟 */
  470.         /*选择外部时钟作为输出时钟源*/

  471.     ICS->C1 =  ICS->C1 & ~(ICS_C1_IREFS_MASK);
  472.         ICS->C1 = (ICS->C1 & ~(ICS_C1_CLKS_MASK)) | ICS_C1_CLKS(2);   
  473.        
  474.         /* 等待输出时钟源发生改变 */
  475. #if defined(IAR)        
  476.         asm(
  477.                 "nop \n"
  478.                 "nop \n"
  479.         );
  480. #elif defined(__MWERKS__)
  481.         asm{
  482.                 nop
  483.                 nop
  484.         };        
  485. #endif     
  486.         while(((ICS->S & ICS_S_CLKST_MASK) >> ICS_S_CLKST_SHIFT) !=2);  /*外部时钟成为输出时钟源*/
  487.         while((ICS->S & ICS_S_IREFST_MASK));             /*外部时钟成为FLL的参考时钟*/
  488.        
  489.         /* 现在系统时钟源是外部参考时钟
  490.          * 注释:确保外部时钟源的频率在20Mhz
  491.          */
  492. #if defined(CPU_NV32)
  493.                 /*对选中的时钟源做2分频*/
  494.         if(((ICS->C2 & ICS_C2_BDIV_MASK)>>5) != 1)
  495.         {
  496.                 ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(1);
  497.         }       
  498. #else
  499.     ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(0);
  500. #endif
  501. }

 楼主| jp_chen 发表于 2017-7-26 16:44 | 显示全部楼层
  1. /*****************************************************************************//**
  2. *
  3. * @ 将ICS的工作模式由当前的FBI模式转换成FEE模式
  4. *
  5. * @ pConfig 指向配置结构体
  6. *
  7. * @ 无返回
  8. *
  9. *****************************************************************************/
  10. void FBI_to_FEE(ICS_ConfigType *pConfig)
  11. {
  12. OSC_Init(&pConfig->oscConfig); /* 初始化OSC */

  13. /* 选择外部时钟作为FLL的参考时钟 */
  14. /* 选择FLL输出作为做为ICS输出时钟源*/

  15. ICS->C1 = ICS->C1 & ~(ICS_C1_IREFS_MASK);
  16. ICS->C1 = (ICS->C1 & ~(ICS_C1_CLKS_MASK));

  17. /*等待时钟源改变*/
  18. #if defined(IAR)
  19. asm(
  20. "nop \n"
  21. "nop \n"
  22. );
  23. #elif defined(__MWERKS__)
  24. asm{
  25. nop
  26. nop
  27. };
  28. #endif

  29. while((ICS->S & ICS_S_CLKST_MASK));/*FLL时钟成为ICS输出时钟源*/
  30. while((ICS->S & ICS_S_IREFST_MASK));/*外部时钟成为FLL参考时钟*/


  31. /* 现在系统时钟源为外部时钟
  32. * 注释: 确保外部时钟源的频率在20Mhz内
  33. */
  34. #if defined(CPU_NV32)
  35. /*对选中的时钟源做2分频*/
  36. if(((ICS->C2 & ICS_C2_BDIV_MASK)>>5) != 1)
  37. {
  38. ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(1);
  39. }
  40. #else
  41. ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(0);
  42. #endif
  43. /*lols清零*/
  44. ICS->S |= ICS_S_LOLS_MASK;       
  45. }

  46. /*****************************************************************************//*!
  47. *
  48. * @ 将ICS的工作模式由当前的FBI模式转换成FBIP模式
  49. *
  50. * @ pConfig 输出指向配置结构体
  51. *
  52. * @ 无返回
  53. *
  54. * @ 警告 必须运行在调试接口没有没有接线
  55. *
  56. *****************************************************************************/
  57. void FBI_to_FBILP(ICS_ConfigType *pConfig)
  58. {
  59. /*假设外部晶振时8mhz或者4mhz
  60. *
  61. */
  62. ICS->C2 |= ICS_C2_LP_MASK;        /*进入低功耗模式*/
  63. }


  64. /*****************************************************************************//*!
  65. *
  66. * @ 将ICS的工作模式由当前的FBI模式转变为FEI模式
  67. *
  68. * @ 输入 pConfig 指向配置结构体.
  69. *
  70. * @ 无返回
  71. *
  72. *****************************************************************************/
  73. void FBI_to_FEI(ICS_ConfigType *pConfig)
  74. {
  75. /* 选择内部时钟为FLL的参考时钟 */
  76. /*选择FLL输出作为ICS输出时钟源*/
  77. ICS->C1 = ICS->C1 | (ICS_C1_IREFS_MASK);
  78. ICS->C1 = (ICS->C1 & ~(ICS_C1_CLKS_MASK));

  79. /*等待时钟源发生改变*/
  80. #if defined(IAR)
  81. asm(
  82. "nop \n"
  83. "nop \n"
  84. );
  85. #elif defined(__MWERKS__)
  86. asm{
  87. nop
  88. nop
  89. };
  90. #endif
  91. while((ICS->S & ICS_S_CLKST_MASK)); /*FLL输出成为ICS输出时钟源*/
  92. while(!(ICS->S & ICS_S_IREFST_MASK));/*FLL的参考时钟选择为外部时钟*/


  93. /* 现在系统时钟源为FLL输出
  94. *
  95. */
  96. #if defined(CPU_NV32)
  97. /*对选中的时钟源做2分频*/
  98. if(((ICS->C2 & ICS_C2_BDIV_MASK)>>5) != 1)
  99. {
  100. ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(1);
  101. }       
  102. #else
  103. ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(0);
  104. #endif
  105. /*LOLS清零 */
  106. ICS->S |= ICS_S_LOLS_MASK;       
  107. }



  108. /*****************************************************************************//*!
  109. *
  110. * @ 将ICS的工作模式由当前的FBE模式转换成FBI模式
  111. *
  112. * @ pConfig 指向配置结构体
  113. *
  114. * @ 无返回
  115. *
  116. *****************************************************************************/
  117. void FBE_to_FBI(ICS_ConfigType *pConfig)
  118. {
  119. /*选择内部时钟作为FLL的参考时钟*/
  120. /*选择内部时钟作为ICS输出时钟源*/
  121. ICS->C1 = ICS->C1 | (ICS_C1_IREFS_MASK);
  122. ICS->C1 = (ICS->C1 & ~(ICS_C1_CLKS_MASK)) | ICS_C1_CLKS(1);

  123. /*等待时钟源发生改变*/
  124. #if defined(IAR)
  125. asm(
  126. "nop \n"
  127. "nop \n"
  128. );
  129. #elif defined(__MWERKS__)
  130. asm{
  131. nop
  132. nop
  133. };
  134. #endif
  135. while(((ICS->S & ICS_S_CLKST_MASK) >> ICS_S_CLKST_SHIFT) != 1);/*内部时钟成为ICS输出时钟源*/
  136. while(!(ICS->S & ICS_S_IREFST_MASK)); /*内部时钟成为FLL的参考时钟*/

  137. /* 现在系统时钟源时内部时钟
  138. *
  139. */

  140. #if defined(CPU_NV32)
  141. /*对选中的时钟源做2分频*/
  142. if(((ICS->C2 & ICS_C2_BDIV_MASK)>>5) != 1)
  143. {
  144. ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(1);
  145. }       
  146. #else
  147. ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(0);
  148. #endif

  149. /* 禁用OSC
  150. */
  151. OSC_Disable();
  152. }

  153. /*****************************************************************************//*!
  154. *
  155. * @ 将ICS的工作模式由当前的FBE模式转换成FEE模式
  156. *
  157. * @ 输入 pConfig 指向配置结构体.
  158. *
  159. * @ 无返回
  160. *
  161. *****************************************************************************/
  162. void FBE_to_FEE(ICS_ConfigType *pConfig)
  163. {
  164. /*选择FLL输出作为输出时钟源*/
  165. ICS->C1 = (ICS->C1 & ~(ICS_C1_CLKS_MASK));

  166. /*等待输出时钟源发生改变*/
  167. #if defined(IAR)
  168. asm(
  169. "nop \n"
  170. "nop \n"
  171. );
  172. #elif defined(__MWERKS__)
  173. asm{
  174. nop
  175. nop
  176. };
  177. #endif
  178. while(ICS->S & ICS_S_CLKST_MASK);


  179. /* 现在系统时钟源为FLL输出
  180. * 注释: 外部时钟频率 <= 20MHz
  181. */
  182. #if defined(CPU_NV32)
  183. /*对选中的时钟源做2分频*/
  184. if(((ICS->C2 & ICS_C2_BDIV_MASK)>>5) != 1)
  185. {
  186. ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(1);
  187. }       
  188. #else
  189. ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(0);
  190. #endif       
  191. /* LOLS清零 */
  192. ICS->S |= ICS_S_LOLS_MASK;       
  193. }


  194. /*****************************************************************************//*!
  195. *
  196. * @ 将ICS的工作模式由当前的FBE模式转变成FEI模式
  197. *
  198. * @ 输入 pConfig 指向配置结构体
  199. *
  200. * @ 无返回
  201. *
  202. *****************************************************************************/
  203. void FBE_to_FEI(ICS_ConfigType *pConfig)
  204. {
  205. /* 选择内部时钟作为FLL的参考时钟*/
  206. /*选择FLL输出做为ICS输出时钟源*/

  207. ICS->C1 = ICS->C1 | (ICS_C1_IREFS_MASK);
  208. ICS->C1 = (ICS->C1 & ~(ICS_C1_CLKS_MASK));

  209. /*等待时钟源改变*/
  210. #if defined(IAR)
  211. asm(
  212. "nop \n"
  213. "nop \n"
  214. );
  215. #elif defined(__MWERKS__)
  216. asm{
  217. nop
  218. nop
  219. };
  220. #endif
  221. while((ICS->S & ICS_S_CLKST_MASK)); /*FLL输出成为ICS输出时钟源*/
  222. while(!(ICS->S & ICS_S_IREFST_MASK)); /*内部时钟中成为FLL参考时钟*/
  223. /* 现在FLL输出成为输出时钟源
  224. *
  225. */       

  226. #if defined(CPU_NV32)       
  227. /*对选中的时钟源做2分频*/
  228. if(((ICS->C2 & ICS_C2_BDIV_MASK)>>5) != 1)
  229. {
  230. ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(1);
  231. }
  232. #else
  233. ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(0);
  234. #endif       
  235. /*LOLS清零*/
  236. ICS->S |= ICS_S_LOLS_MASK;       

  237. /* 禁用OSC
  238. */
  239. OSC_Disable();
  240. }

  241. /*****************************************************************************//*!
  242. *
  243. * @ 将ICS的工作模式由当前的FBE模式转变为FBEL模式
  244. *
  245. * @ 输入 pConfig 指向配置结构体.
  246. *
  247. * @ 无返回
  248. *
  249. *****************************************************************************/
  250. void FBE_to_FBELP(ICS_ConfigType *pConfig)
  251. {
  252. /*低功耗使能*/
  253. ICS->C2 = ICS->C2 | (ICS_C2_LP_MASK);
  254. }


  255. /*****************************************************************************//*!
  256. *
  257. * @ 将ICS的工作模式由当前的FBELP模式转换成FBE模式
  258. *
  259. * @ 输入 pConfig 指向配置结构体.
  260. *
  261. * @ 无返回
  262. *
  263. *****************************************************************************/
  264. void FBELP_to_FBE(ICS_ConfigType *pConfig)
  265. {
  266. /*禁用低功耗模式*/
  267. ICS->C2 = ICS->C2 & ~(ICS_C2_LP_MASK);
  268. }

  269. /*****************************************************************************//*!
  270. *
  271. * @ 将ICS的工作模式由当前的FBILP.
  272. *
  273. * @ 输入 pConfig 指向配置结构体.
  274. *
  275. * @ 无返回
  276. *
  277. *****************************************************************************/
  278. void FBILP_to_FBI(ICS_ConfigType *pConfig)
  279. {
  280. /* 禁用功耗*/
  281. ICS->C2 = ICS->C2 & ~(ICS_C2_LP_MASK);
  282. }

  283. /******************************************************************************
  284. * define ICS API list
  285. *
  286. *//*! @addtogroup ics_api_list
  287. * @{
  288. *******************************************************************************/


  289. /*****************************************************************************//*!
  290. *
  291. * @ 调整内部内部时钟 (IRC).
  292. *
  293. * @ 输入 u16TrimValue 调整值
  294. *
  295. * @ 无返回
  296. *
  297. *****************************************************************************/

  298. void ICS_Trim(uint16_t u16TrimValue)
  299. {
  300. ICS->C3 = (uint8_t) u16TrimValue; /*将调整值写入寄存器*/
  301. ICS->C4 = (ICS->C4 & ~(ICS_C4_SCFTRIM_MASK)) | ((u16TrimValue>>8) & 0x01);
  302. while(!(ICS->S & ICS_S_LOCK_MASK));
  303. }


  304. /*****************************************************************************//*!
  305. *
  306. * @ 对外部参考时钟进行分频,使得分频结果在26k~40k内
  307. *
  308. * @ u32ClkFreqKHz 参考时钟频率.
  309. *
  310. * @ 无返回
  311. *
  312. *****************************************************************************/

  313. void ICS_SetClkDivider(uint32_t u32ClkFreqKHz)
  314. {

  315. switch(u32ClkFreqKHz)
  316. {
  317. case 8000L:
  318. case 10000L:
  319. /* 8MHz or 10MHz */
  320. ICS->C1 = (ICS->C1 & ~(ICS_C1_RDIV_MASK)) | ICS_C1_RDIV(3);        /* 现在分频结果是 8000/256 = 31.25K */
  321. /* 分频结果 10000/256 = 39.0625K */
  322. break;
  323. case 4000L:
  324. /* 4MHz */
  325. ICS->C1 = (ICS->C1 & ~(ICS_C1_RDIV_MASK)) | ICS_C1_RDIV(2);        /* 分频结果 4000/128 = 31.25K */
  326. break;
  327. case 16000L:
  328. /* 16MHz */
  329. ICS->C1 = (ICS->C1 & ~(ICS_C1_RDIV_MASK)) | ICS_C1_RDIV(4);        /* 分频结果 16000/512 = 31.25K */
  330. break;
  331. case 20000L:
  332. /* 20MHz */
  333. ICS->C1 = (ICS->C1 & ~(ICS_C1_RDIV_MASK)) | ICS_C1_RDIV(4); /* 分频结果 20000/512 = 39.0625K */
  334. break;
  335. case 32L:
  336. /* 32KHz */
  337. ICS->C1 &= ~(ICS_C1_RDIV_MASK);
  338. break;
  339. default:
  340. break;
  341. }
  342. }

  343. /*****************************************************************************//*!
  344. *
  345. * @ 初始化ICS模块定义所需要的总线时钟频率.
  346. *
  347. * @ pConfig 指向配置结构体.
  348. *
  349. * @ 无返回
  350. *
  351. *****************************************************************************/

  352. void ICS_Init(ICS_ConfigType *pConfig)
  353. {
  354. if(pConfig->u8ClkMode == ICS_CLK_MODE_FEE)
  355. {
  356. pConfig->oscConfig.bIsCryst = 1; /*OSC的输出选择选择振动器时钟源*/
  357. pConfig->oscConfig.bWaitInit = 1; /* 等待振荡器初始化化完成 */
  358. FEI_to_FEE(pConfig); /*选择FEE模式,使用振荡器时钟源*/
  359. }
  360. else if (pConfig->u8ClkMode == ICS_CLK_MODE_FEE_OSC)
  361. {
  362. pConfig->oscConfig.bIsCryst = 0; /*OSC输出时钟选择EEXTAL引脚的外部时钟源*/
  363. FEI_to_FEE_OSC(pConfig); /*选择FEE工作模式*/
  364. }
  365. else if (pConfig->u8ClkMode == ICS_CLK_MODE_FBE_OSC)
  366. {
  367. pConfig->oscConfig.bIsCryst = 0; /* OSC输出时钟选择EEXTAL引脚的外部时钟源*/
  368. FEI_to_FBE_OSC(pConfig); /* 选择FBE工作模式*/
  369. }
  370. else if(pConfig->u8ClkMode == ICS_CLK_MODE_FBELP )
  371. {
  372. pConfig->oscConfig.bIsCryst = 1; /*OSC的输出时钟选择选择振动器时钟源*/
  373. pConfig->oscConfig.bWaitInit = 1; /*等待振荡器初始化化完成 */       
  374. FEI_to_FBE(pConfig); /*先选择PBE模式*/
  375. FBE_to_FBELP(pConfig); /*选择FBELP*/
  376. ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(0);
  377. }
  378. else if(pConfig->u8ClkMode == ICS_CLK_MODE_FBILP )
  379. {
  380. pConfig->oscConfig.bIsCryst = 0; /* OSC输出时钟选择EXTAL引脚的外部时钟源*/
  381. FEI_to_FBI(pConfig); /*选择FBI工作模式*/
  382. FBI_to_FBILP(pConfig); /*选择FBILP工作模式*/
  383. ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(0);
  384. }
  385. else
  386. {
  387. /*默认工作模式FEI模式*/
  388. #if defined(CPU_NV32)
  389. /*对所选时钟源进行2分频*/
  390. if(((ICS->C2 & ICS_C2_BDIV_MASK)>>5) != 1)
  391. {
  392. ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(1);
  393. }
  394. #else
  395. ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(0);
  396. #endif
  397. ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(0);
  398. }
  399. ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(0);
  400. }

  401. /*****************************************************************************//*!
  402. *
  403. * @ 对ICS模块各寄存器进行复位.
  404. *
  405. * @ 无输入
  406. *
  407. * @ 无返回

  408. *****************************************************************************/

  409. void ICS_DeInit(void)
  410. {
  411. ICS->C1 = ICS_C1_DEFAULT;
  412. ICS->C2 = ICS_C2_DEFAULT;
  413. ICS->C3 = ICS_C3_DEFAULT;
  414. ICS->C4 = ICS_C4_DEFAULT;
  415. while(ICS->S != ICS_S_DEFAULT)
  416. ;
  417. }

  418. /*! @} End of ics_api_list */


  419. /******************************************************************************
  420. * define OSC API list
  421. *
  422. *//*! @addtogroup osc_api_list
  423. * @{
  424. *******************************************************************************/

  425. /*****************************************************************************//*!
  426. *
  427. * @ 使用给定的参数初始化XOSC : GAIN, RANGE in control structure.
  428. *
  429. * @ pConfig 指向osc配置结构体
  430. *
  431. * @ 无返回
  432. *

  433. *****************************************************************************/
  434. void OSC_Init(OSC_ConfigType *pConfig)
  435. {
  436. uint8 cr = 0;
  437. /*
  438. *
  439. */
  440. if(pConfig->bGain) /*高增益振荡器选择*/
  441. {
  442. /* 选择高增益模式 */
  443. cr |= OSC_CR_HGO_MASK ;        /* 变阻器必须增加到200K */
  444. }

  445. if(pConfig->bRange) /*频率范围的选择*/
  446. {
  447. cr |= OSC_CR_RANGE_MASK; /*选择高频范围*/       
  448. }

  449. if(pConfig->bStopEnable) /*停止模式下的OSC使能*/
  450. {
  451. cr |= OSC_CR_OSCSTEN_MASK; /*OSC在停止模式下保持使能*/
  452. }

  453. if(pConfig->bIsCryst) /*OSC输出选择*/
  454. {
  455. cr |= OSC_CR_OSCOS_MASK; /*选择振荡器时钟*/
  456. }

  457. if(pConfig->bEnable) /*OSC使能*/
  458. {
  459. cr |= OSC_CR_OSCEN_MASK;
  460. }

  461. OSC->CR = cr; /*数值写入控制寄存器*/

  462. if(pConfig->bWaitInit) /*等待出书化完成*/
  463. {

  464. /* wait for OSC to be initialized
  465. *
  466. */
  467. while(!(OSC->CR & OSC_CR_OSCINIT_MASK));

  468. }
  469. }

  470. /*****************************************************************************//*!
  471. *
  472. * @ 初始化OSC模块,使其恢复到默认状态.
  473. *
  474. * @ 无输入
  475. *
  476. * @ 无返回
  477. *
  478. *****************************************************************************/

  479. void OSC_DeInit(void)
  480. {
  481. OSC->CR = OSC_CR_DEFAULT;
  482. }


  483. /*! @} End of osc_api_list */


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

本版积分规则

20

主题

113

帖子

0

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