diff options
| author | chichen113 <[email protected]> | 2023-04-23 02:22:19 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-04-22 19:22:19 +0100 |
| commit | 7ff6fe7c0d6b3ab8982556a452de4430945334ef (patch) | |
| tree | da090dc8a96366e418913920239909b38c2195b6 | |
| parent | a894aef494f234b989b516eb01d2a180ff800a58 (diff) | |
[HUST CSE]github上正常但导入vscode出现乱码
| -rw-r--r-- | bsp/nv32f100x/lib/src/ics.c | 1378 | ||||
| -rw-r--r-- | bsp/smartfusion2/CMSIS/startup_arm/retarget.c | 8 |
2 files changed, 693 insertions, 693 deletions
diff --git a/bsp/nv32f100x/lib/src/ics.c b/bsp/nv32f100x/lib/src/ics.c index 8e7a791218..3a89cce722 100644 --- a/bsp/nv32f100x/lib/src/ics.c +++ b/bsp/nv32f100x/lib/src/ics.c @@ -1,16 +1,16 @@ -/*************************************************************! - * �������ۣ�QQȺ 123763203 - * ���� ��www.navota.com +/*************************************************************! + * 技术讨论:QQ群 123763203 + * 官网 :www.navota.com * * @file ics.c - * @brief ʱ��ģ�飨ICS)������ + * @brief 时钟模块(ICS)函数库 * @author Navota * @date 2017-1-1 ****************************************************************/ #include "common.h" #include "ics.h" -/* ��λ��ICS��OSCģ��Ĵ�����Ĭ��ֵ */ +/* 复位后ICS和OSC模块寄存器的默认值 */ #define ICS_C1_DEFAULT 0x04 #define ICS_C2_DEFAULT 0x20 #define ICS_C3_DEFAULT 0x54 @@ -20,457 +20,457 @@ /*****************************************************************************//*! - * - * @ ��Ҫ ICS�Ĺ���ģʽ�ɵ�ǰ��FEIģʽ�л�ΪFEEģʽ����ѡ�е�ʱ��Դ��1��Ƶ - * OSCģ������ʱ��ѡ������ʱ��Դ - * - * @ ���������롿 pConfig ָ��ICS���ýṹ�� * - * @ ���� + * @ 概要 ICS的工作模式由当前的FEI模式切换为FEE模式,对选中的时钟源做1分频 + * OSC模块的输出时钟选择振荡器时钟源 * - * @ �ɹ�/ʧ�ܵı� ���� + * @ 参数【输入】 pConfig 指向ICS配置结构体 + * + * @ 无返回 + * + * @ 成功/失败的标准 :无 *****************************************************************************/ void FEI_to_FEE(ICS_ConfigType *pConfig) { - /* - * ʹ��OSCģ�� - */ - OSC_Init(&pConfig->oscConfig); /*OSCģ���ʼ�� */ - - /* - * ���ⲿ�ο�ʱ�ӽ��з�Ƶ���ɽ��ⲿʱ�ӷ�Ƶ��31.25k~39.0625k֮�� - */ - + /* + * 使能OSC模块 + */ + OSC_Init(&pConfig->oscConfig); /*OSC模块初始化 */ + + /* + * 对外部参考时钟进行分频,可将外部时钟分频到31.25k~39.0625k之间 + */ + ICS_SetClkDivider(pConfig->u32ClkFreq); - /*��FLL�IJο�ʱ��ѡ��Ϊ�ⲿʱ��*/ - ICS->C1 = ICS->C1 & ~ICS_C1_IREFS_MASK; - - /*�ȴ�FLL�ο�ʱ�ӱ�Ϊ�ⲿʱ��*/ + /*将FLL的参考时钟选择为外部时钟*/ + ICS->C1 = ICS->C1 & ~ICS_C1_IREFS_MASK; + + /*等待FLL参考时钟变为外部时钟*/ -#if defined(IAR) - asm( - "nop \n" - "nop \n" - ); +#if defined(IAR) + asm( + "nop \n" + "nop \n" + ); #elif defined(__MWERKS__) - asm{ - nop - nop -}; -#endif - while(ICS->S & ICS_S_IREFST_MASK); - - /* �ȴ�FLLʱ�ӳ�ΪICS���ʱ��Դ*/ - while(!(ICS->S & ICS_S_LOCK_MASK)); - - /* - *����FLL���ʱ�ӱ�ʱ��Ƶ�ʵ���FLL�ο�ʱ�ӷ�Ƶ�������FLL�ı�Ƶϵ�� - * FLL�ı�Ƶϵ����ο��ο��ֲ� - */ + asm{ + nop + nop +}; +#endif + while(ICS->S & ICS_S_IREFST_MASK); + + /* 等待FLL时钟成为ICS输出时钟源*/ + while(!(ICS->S & ICS_S_LOCK_MASK)); + + /* + *现在FLL输出时钟变时钟频率等于FLL参考时钟分频结果乘以FLL的倍频系数 + * FLL的倍频系数请参考参考手册 + */ #if defined(CPU_NV32) - /*��ѡ�е�ICS���ʱ��Դ��1��Ƶ*/ - if(((ICS->C2 & ICS_C2_BDIV_MASK)>>5) == 1) - { - ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(0); - } + /*对选中的ICS输出时钟源做1分频*/ + if(((ICS->C2 & ICS_C2_BDIV_MASK)>>5) == 1) + { + ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(0); + } #else ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(0); #endif - - /* - * ��ɶ�ѡ�е�ʱ��Դ��1��Ƶ��ϵͳ/����ʱ��ʱƵ��Ϊ���õ�Ŀ��Ƶ�� - */ - /*LOLS��0*/ - ICS->S |= ICS_S_LOLS_MASK; + + /* + * 完成对选中的时钟源做1分频,系统/总线时钟时频率为设置的目标频率 + */ + /*LOLS清0*/ + ICS->S |= ICS_S_LOLS_MASK; } /*****************************************************************************//*! * - * @ ��Ҫ ICS�Ĺ���ģʽ�ɵ�ǰ��FEIģʽת���FBIģʽ����ѡ�е�ICS���ʱ��Դ - * ����2��Ƶ - * - * @ ���� pConfig ָ��ICS���ýṹ��. + * @ 概要 ICS的工作模式由当前的FEI模式转变成FBI模式,对选中的ICS输出时钟源 + * 进行2分频 + * + * @ 参数 pConfig 指向ICS配置结构体. * - * @ ���� + * @ 无返回 * - * @ �ɹ�/ʧ�ܵı� ���� - * @ �ο� ICS_ConfigType + * @ 成功/失败的标准 :无 + * @ 参看 ICS_ConfigType *****************************************************************************/ void FEI_to_FBI(ICS_ConfigType *pConfig) { - /*ICS���ʱ��Դѡ���ڲ��ο�ʱ��*/ - ICS->C1 = (ICS->C1 & ~(ICS_C1_CLKS_MASK)) | ICS_C1_CLKS(1); - ICS->C2 = ICS->C2 & ~(ICS_C2_LP_MASK); - /*�ȴ��ڲ�ʱ�ӳ�ΪICS���ʱ��Դ*/ -#if defined(IAR) - asm( - "nop \n" - "nop \n" - ); + /*ICS输出时钟源选择内部参考时钟*/ + ICS->C1 = (ICS->C1 & ~(ICS_C1_CLKS_MASK)) | ICS_C1_CLKS(1); + ICS->C2 = ICS->C2 & ~(ICS_C2_LP_MASK); + /*等待内部时钟成为ICS输出时钟源*/ +#if defined(IAR) + asm( + "nop \n" + "nop \n" + ); #elif defined(__MWERKS__) - asm{ - nop - nop - }; -#endif - while(((ICS->S & ICS_S_CLKST_MASK) >> ICS_S_CLKST_SHIFT) !=1); - - /* - * �����ڲ��ο�ʱ��ΪICS���ʱ��Դ - */ -#if defined(BUS_CLK_EQU_CORE_DIVIDE_BY_2)||defined(CPU_NV32) - /*��ѡ�е�ICS���ʱ��Դ��2��Ƶ*/ - if(((ICS->C2 & ICS_C2_BDIV_MASK)>>5) != 1) - { - ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(1); - } + asm{ + nop + nop + }; +#endif + while(((ICS->S & ICS_S_CLKST_MASK) >> ICS_S_CLKST_SHIFT) !=1); + + /* + * 现在内部参考时钟为ICS输出时钟源 + */ +#if defined(BUS_CLK_EQU_CORE_DIVIDE_BY_2)||defined(CPU_NV32) + /*对选中的ICS输出时钟源做2分频*/ + if(((ICS->C2 & ICS_C2_BDIV_MASK)>>5) != 1) + { + ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(1); + } #else - ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)); -#endif - - /*LOLS����*/ - ICS->S |= ICS_S_LOLS_MASK; + ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)); +#endif + + /*LOLS清零*/ + ICS->S |= ICS_S_LOLS_MASK; } /*****************************************************************************//*! * - * @ ��Ҫ ICS�Ĺ���ģʽ�ɵ�ǰ��FEIģʽת����FBEģʽ����ѡ�е�ICS���ʱ��Դ��2��Ƶ - * OSCģ������ʱ��ѡ������ʱ��Դ + * @ 概要 ICS的工作模式由当前的FEI模式转换成FBE模式,对选中的ICS输出时钟源做2分频 + * OSC模块的输出时钟选择振荡器时钟源 * - * @ ���� pConfig ָ��ICS�����ýṹ�� . + * @ 参数 pConfig 指向ICS的配置结构体 . * - * @ ���� + * @ 无返回 * - * @ �ɹ�/ʧ�ܵı� ���� - * @ �ο� ICS_ConfigType + * @ 成功/失败的标准 :无 + * @ 参看 ICS_ConfigType *****************************************************************************/ void FEI_to_FBE(ICS_ConfigType *pConfig) { - OSC_Init(&pConfig->oscConfig); /*��ʼ��OSC ģ�� */ + OSC_Init(&pConfig->oscConfig); /*初始化OSC 模块 */ - /*����FLL�IJο�ʱ��Ϊ�ⲿʱ��*/ + /*设置FLL的参考时钟为外部时钟*/ ICS->C1 = ICS->C1 & ~(ICS_C1_IREFS_MASK); - ICS->C1 = (ICS->C1 & ~(ICS_C1_CLKS_MASK)) | ICS_C1_CLKS(2); - ICS->C2 = ICS->C2 & ~(ICS_C2_LP_MASK); - - /*���ڲο�ʱ�ӷ����ı�*/ -#if defined(IAR) - asm( - "nop \n" - "nop \n" - ); + ICS->C1 = (ICS->C1 & ~(ICS_C1_CLKS_MASK)) | ICS_C1_CLKS(2); + ICS->C2 = ICS->C2 & ~(ICS_C2_LP_MASK); + + /*等在参考时钟发生改变*/ +#if defined(IAR) + asm( + "nop \n" + "nop \n" + ); #elif defined(__MWERKS__) - asm{ - nop - nop - }; -#endif + asm{ + nop + nop + }; +#endif + + while(((ICS->S & ICS_S_CLKST_MASK) >> ICS_S_CLKST_SHIFT) !=2); /*外部时钟成为ICS时钟输出源*/ + while(ICS->S & ICS_S_IREFST_MASK); /*FLL参考时钟成为外部时钟*/ - while(((ICS->S & ICS_S_CLKST_MASK) >> ICS_S_CLKST_SHIFT) !=2); /*�ⲿʱ�ӳ�ΪICSʱ�����Դ*/ - while(ICS->S & ICS_S_IREFST_MASK); /*FLL�ο�ʱ�ӳ�Ϊ�ⲿʱ��*/ - - /* - * �����ⲿʱ�ӳ�ΪICS���ʱ��Դ - */ + /* + * 现在外部时钟成为ICS输出时钟源 + */ #if defined(CPU_NV32) - /*��ѡ�е�ICS���ʱ��Դ��2��Ƶ*/ - if(((ICS->C2 & ICS_C2_BDIV_MASK)>>5) != 1) - { - ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(1); - } + /*对选中的ICS输出时钟源做2分频*/ + if(((ICS->C2 & ICS_C2_BDIV_MASK)>>5) != 1) + { + ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(1); + } #else ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(0); #endif - /* - * ����ICS���ʱ��Ƶ��Ϊѡ�е����ʱ��Դ��2��Ƶ - */ - /* LOLS���� */ - ICS->S |= ICS_S_LOLS_MASK; + /* + * 现在ICS输出时钟频率为选中的输出时钟源的2分频 + */ + /* LOLS清零 */ + ICS->S |= ICS_S_LOLS_MASK; } /*****************************************************************************//*! * - * @ ��Ҫ ICS�Ĺ���ģʽ�ɵ�ǰ��FEIģʽת����FBEģʽ����ѡ�е����ʱ��Դ��2��Ƶ - * OSC���ʱ��ѡ��EXTAL���ŵ��ⲿʱ��Դ + * @ 概要 ICS的工作模式由当前的FEI模式转换成FBE模式,对选中的输出时钟源做2分频 + * OSC输出时钟选择EXTAL引脚的外部时钟源 * - * @ ���� pConfig ָ�����ýṹ��. + * @ 参数 pConfig 指向配置结构体. * - * @ ���� + * @ 无返回 * - * @ �ɹ�/ʧ�ܵı� ���� - * @ �ο� ICS_ConfigType + * @ 成功/失败的标准 :无 + * @ 参看 ICS_ConfigType *****************************************************************************/ void FEI_to_FBE_OSC(ICS_ConfigType *pConfig) { - - OSC_Init(&pConfig->oscConfig); /* ��ʼ��OSC */ - /* - * �����ⲿ�ο�ʱ�ӵķ�Ƶϵ�������ο�ʱ�ӵķ�Ƶ����趨��FLL����������31.25k~39.0625k��Χ�ڣ� - */ + OSC_Init(&pConfig->oscConfig); /* 初始化OSC */ + + /* + * 设置外部参考时钟的分频系数,将参考时钟的分频结果设定在FLL可以锁定的31.25k~39.0625k范围内, + */ ICS_SetClkDivider(pConfig->u32ClkFreq); - - /*�ı�ο�ʱ��Դ����FLL�IJο�ʱ������Ϊ���ⲿʱ��*/ - ICS->C1 = ICS->C1 & ~(ICS_C1_IREFS_MASK);/*��FLL�IJο�ʱ������Ϊ���ⲿʱ��*/ - ICS->C1 = (ICS->C1 & ~(ICS_C1_CLKS_MASK)) | ICS_C1_CLKS(2); /*���ʱ��Դѡ���ⲿʱ��*/ - ICS->C2 = ICS->C2 & ~(ICS_C2_LP_MASK); - - /* �ȴ��ο�ʱ�ӷ����ı�*/ -#if defined(IAR) - asm( - "nop \n" - "nop \n" - ); + /*改变参考时钟源,将FLL的参考时钟设置为而外部时钟*/ + ICS->C1 = ICS->C1 & ~(ICS_C1_IREFS_MASK);/*将FLL的参考时钟设置为而外部时钟*/ + ICS->C1 = (ICS->C1 & ~(ICS_C1_CLKS_MASK)) | ICS_C1_CLKS(2); /*输出时钟源选择外部时钟*/ + ICS->C2 = ICS->C2 & ~(ICS_C2_LP_MASK); + + /* 等待参考时钟发生改变*/ + +#if defined(IAR) + asm( + "nop \n" + "nop \n" + ); #elif defined(__MWERKS__) - asm{ - nop - nop - }; -#endif - while(((ICS->S & ICS_S_CLKST_MASK) >> ICS_S_CLKST_SHIFT) !=2);/*�ⲿʱ�ӳ�ΪICSʱ�����ʱ��Դ*/ - while(ICS->S & ICS_S_IREFST_MASK); /*�ⲿʱ�ӳ�ΪFLL�ο�ʱ��*/ - - /* - * �����ⲿʱ�ӳ�ΪFLL�ο�ʱ�Ӻ�ICS���ʱ��Դ - */ + asm{ + nop + nop + }; +#endif + while(((ICS->S & ICS_S_CLKST_MASK) >> ICS_S_CLKST_SHIFT) !=2);/*外部时钟成为ICS时钟输出时钟源*/ + while(ICS->S & ICS_S_IREFST_MASK); /*外部时钟成为FLL参考时钟*/ + + /* + * 现在外部时钟成为FLL参考时钟和ICS输出时钟源 + */ #if defined(CPU_NV32) - /*��ѡ�е�ICS���ʱ��Դ��2��Ƶ*/ - if(((ICS->C2 & ICS_C2_BDIV_MASK)>>5) != 1) - { - ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(1); - } + /*对选中的ICS输出时钟源做2分频*/ + if(((ICS->C2 & ICS_C2_BDIV_MASK)>>5) != 1) + { + ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(1); + } #else ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(0); #endif - /* - * ����ICS�����ʱ��Ƶ�ʣ�Ϊ�ⲿ�ο�ʱ�ӵ�2��Ƶ - */ - /*LOLS ����*/ - ICS->S |= ICS_S_LOLS_MASK; + /* + * 现在ICS的输出时钟频率,为外部参考时钟的2分频 + */ + /*LOLS 清零*/ + ICS->S |= ICS_S_LOLS_MASK; } /*****************************************************************************//*! * - * @ ��Ҫ ICS�Ĺ���ģʽ�ɵ�ǰ��FEIģʽת��FEEģʽ����ѡ�е�ICS���ʱ��Դ��2��Ƶ - * OSC���ʱ��ѡ��EXTAL���ŵ��ⲿʱ��Դ + * @ 概要 ICS的工作模式由当前的FEI模式转换FEE模式,对选中的ICS输出时钟源做2分频 + * OSC输出时钟选择EXTAL引脚的外部时钟源 * - * @ ���� pConfig ָ�����ýṹ�� + * @ 参数 pConfig 指向配置结构体 * - * @ ���� + * @ 无返回 * - * @ �ɹ�/ʧ�ܵı� ���� - * @ �ο� ICS_ConfigType + * @ 成功/失败的标准 :无 + * @ 参看 ICS_ConfigType *****************************************************************************/ void FEI_to_FEE_OSC(ICS_ConfigType *pConfig) { - OSC_Init(&pConfig->oscConfig); /* ��ʼ��OSC */ + OSC_Init(&pConfig->oscConfig); /* 初始化OSC */ - /* - * �����ⲿ�ο�ʱ�ӵķ�Ƶϵ�������ο�ʱ�ӵķ�Ƶ����趨��FLL����������31.25k~39.0625k��Χ�� - */ + /* + * 设置外部参考时钟的分频系数,将参考时钟的分频结果设定在FLL可以锁定的31.25k~39.0625k范围内 + */ ICS_SetClkDivider(pConfig->u32ClkFreq); - /* ��FLL�IJο�ʱ������Ϊ�ⲿʱ�� */ - + /* 将FLL的参考时钟设置为外部时钟 */ + ICS->C1 = ICS->C1 & ~(ICS_C1_IREFS_MASK); - /*�ȴ��ο�ʱ�ӱ仯*/ -#if defined(IAR) - asm( - "nop \n" - "nop \n" - ); + /*等待参考时钟变化*/ +#if defined(IAR) + asm( + "nop \n" + "nop \n" + ); #elif defined(__MWERKS__) - asm{ - nop - nop - }; -#endif - while(ICS->S & ICS_S_IREFST_MASK); /*FLL�ο�ʱ�ӱ�Ϊ�ⲿʱ��*/ - - /*�ȴ�FLL��ΪICS���ʱ��Դ */ - while(!(ICS->S & ICS_S_LOCK_MASK)); -#if defined(CPU_NV32) - /*��ѡ�е�ʱ��Դ��2��Ƶ*/ - if(((ICS->C2 & ICS_C2_BDIV_MASK)>>5) != 1) - { - ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(1); - } + asm{ + nop + nop + }; +#endif + while(ICS->S & ICS_S_IREFST_MASK); /*FLL参考时钟变为外部时钟*/ + + /*等待FLL成为ICS输出时钟源 */ + while(!(ICS->S & ICS_S_LOCK_MASK)); +#if defined(CPU_NV32) + /*对选中的时钟源做2分频*/ + if(((ICS->C2 & ICS_C2_BDIV_MASK)>>5) != 1) + { + ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(1); + } #else ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(0); #endif - /* - * ����ICS���ʱ��Ƶ�ʣ���ΪҪ���õ�Ŀ��Ƶ�� - */ + /* + * 现在ICS输出时钟频率,成为要设置的目标频率 + */ - /* LOLS���� */ - ICS->S |= ICS_S_LOLS_MASK; + /* LOLS清零 */ + ICS->S |= ICS_S_LOLS_MASK; } /*****************************************************************************//*! * - * @ ��Ҫ ��ICS�Ĺ���ģʽ�ɵ�ǰ��FEEģʽת����FEIģʽ. - * - * @ ���� pConfig ָ�����ýṹ�� + * @ 概要 将ICS的工作模式由当前的FEE模式转换成FEI模式. + * + * @ 参数 pConfig 指向配置结构体 * - * @ ���� + * @ 无返回 * - * @ �ɹ�/ʧ�ܵı� ���� - * @ �ο� ICS_ConfigType + * @ 成功/失败的标准 :无 + * @ 参看 ICS_ConfigType *****************************************************************************/ void FEE_to_FEI(ICS_ConfigType *pConfig) { - /*ѡ���ڲ�ʱ����ΪFLL�IJο�ʱ��*/ + /*选择内部时钟作为FLL的参考时钟*/ ICS->C1 = ICS->C1 | (ICS_C1_IREFS_MASK); - - /*�ȴ��ο�ʱ�ӷ����ı�*/ -#if defined(IAR) - asm( - "nop \n" - "nop \n" - ); + + /*等待参考时钟发生改变*/ +#if defined(IAR) + asm( + "nop \n" + "nop \n" + ); #elif defined(__MWERKS__) - asm{ - nop - nop - }; -#endif - while(!(ICS->S & ICS_S_IREFST_MASK)); /*FLL�ο�ʱ�ӳ�Ϊ�ڲ�ʱ��*/ - - /*FLLʱ�ӳ�ΪICS���ʱ��Դ */ - while(!(ICS->S & ICS_S_LOCK_MASK)); - /*LOLS����*/ - ICS->S |= ICS_S_LOLS_MASK; + asm{ + nop + nop + }; +#endif + while(!(ICS->S & ICS_S_IREFST_MASK)); /*FLL参考时钟成为内部时钟*/ + + /*FLL时钟成为ICS输出时钟源 */ + while(!(ICS->S & ICS_S_LOCK_MASK)); + /*LOLS清零*/ + ICS->S |= ICS_S_LOLS_MASK; - /* - * ����FLL�����ΪICS���ʱ��Դ - */ + /* + * 现在FLL输出成为ICS输出时钟源 + */ #if defined(CPU_NV32) - /*��ѡ�е�ICS���ʱ��Դ��2��Ƶ*/ - if(((ICS->C2 & ICS_C2_BDIV_MASK)>>5) != 1) - { - ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(1); - } + /*对选中的ICS输出时钟源做2分频*/ + if(((ICS->C2 & ICS_C2_BDIV_MASK)>>5) != 1) + { + ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(1); + } #else ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(0); #endif - /* - * ����ϵͳ/����ʱ�Ӵ�ԼΪ 16MHz - */ - ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(0); - OSC_Disable(); /* ���� OSCģ�� */ + /* + * 现在系统/总线时钟大约为 16MHz + */ + ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(0); + OSC_Disable(); /* 禁用 OSC模块 */ } /*****************************************************************************//*! * - * @ ��Ҫ ��ICS�Ĺ���ģʽ�ɵ�ǰ��FEEģʽת����FBIģʽ. - * - * @ ���� pConfig ָ�����ýṹ�� + * @ 概要 将ICS的工作模式由当前的FEE模式转换成FBI模式. * - * @ ���� + * @ 参数 pConfig 指向配置结构体 * - * @ �ɹ�/ʧ�ܵı� ���� - * @ �ο� ICS_ConfigType + * @ 无返回 + * + * @ 成功/失败的标准 :无 + * @ 参看 ICS_ConfigType *****************************************************************************/ void FEE_to_FBI(ICS_ConfigType *pConfig) { - /*LOLS����*/ - ICS->S |= ICS_S_LOLS_MASK; - - /* ѡ���ڲ�ʱ����ΪICS���ʱ��Դ */ - /* ѡ���ڲ�ʱ����ΪFLL�ο�ʱ�� */ - /* LP = 0 ��bypassģʽFLL���ᱻ��ֹ*/ - + /*LOLS清零*/ + ICS->S |= ICS_S_LOLS_MASK; + + /* 选择内部时钟作为ICS输出时钟源 */ + /* 选择内部时钟作为FLL参考时钟 */ + /* LP = 0 在bypass模式FLL不会被禁止*/ + ICS->C1 = ICS->C1 | (ICS_C1_IREFS_MASK); - ICS->C1 = (ICS->C1 & ~(ICS_C1_CLKS_MASK)) | ICS_C1_CLKS(1); - ICS->C2 = ICS->C2 & ~(ICS_C2_LP_MASK); + ICS->C1 = (ICS->C1 & ~(ICS_C1_CLKS_MASK)) | ICS_C1_CLKS(1); + ICS->C2 = ICS->C2 & ~(ICS_C2_LP_MASK); - /* �ȴ��ο�ʱ�ӷ����ı� */ -#if defined(IAR) - asm( - "nop \n" - "nop \n" - ); + /* 等待参考时钟发生改变 */ +#if defined(IAR) + asm( + "nop \n" + "nop \n" + ); #elif defined(__MWERKS__) - asm{ - nop - nop - }; -#endif - while(!(ICS->S & ICS_S_IREFST_MASK)); /*FLL�ο�ʱ�ӳ�Ϊ�ڲ�ʱ��*/ - while(((ICS->S & ICS_S_CLKST_MASK) >> ICS_S_CLKST_SHIFT) !=1); /*�ڲ�ʱ��ΪICS���ʱ��Դ*/ - -#if defined(BUS_CLK_EQU_CORE_DIVIDE_BY_2)||defined(CPU_NV32) - /*����ѡ�е�ICS���ʱ��Դ��2��Ƶ*/ - if(((ICS->C2 & ICS_C2_BDIV_MASK)>>5) != 1) - { - ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(1); - } + asm{ + nop + nop + }; +#endif + while(!(ICS->S & ICS_S_IREFST_MASK)); /*FLL参考时钟成为内部时钟*/ + while(((ICS->S & ICS_S_CLKST_MASK) >> ICS_S_CLKST_SHIFT) !=1); /*内部时成为ICS输出时钟源*/ + +#if defined(BUS_CLK_EQU_CORE_DIVIDE_BY_2)||defined(CPU_NV32) + /*对所选中的ICS输出时钟源做2分频*/ + if(((ICS->C2 & ICS_C2_BDIV_MASK)>>5) != 1) + { + ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(1); + } #else - ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)); - -#endif - OSC_Disable(); + ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)); + +#endif + OSC_Disable(); } /*****************************************************************************//*! * - * @ ��Ҫ ��ICS�Ĺ���ģʽ�ɵ�ǰ��FEEģʽת���FBEģʽ - * - * @ ���� pConfig ָ�����ýṹ�� + * @ 概要 将ICS的工作模式由当前的FEE模式转变成FBE模式 + * + * @ 参数 pConfig 指向配置结构体 * - * @ ���� + * @ 无返回 * - * @ �ɹ�/ʧ�ܵı� ���� - * @ �ο� ICS_ConfigType + * @ 成功/失败的标准 :无 + * @ 参看 ICS_ConfigType *****************************************************************************/ void FEE_to_FBE(ICS_ConfigType *pConfig) { - /*LOLS����*/ - ICS->S |= ICS_S_LOLS_MASK; - - + /*LOLS清零*/ + ICS->S |= ICS_S_LOLS_MASK; + + /* LP = 0 */ - /*ѡ���ⲿʱ����ΪICS���ʱ��Դ*/ - /* LP = 0 ��bypassģʽFLL���ᱻ��ֹ*/ + /*选择外部时钟作为ICS输出时钟源*/ + /* LP = 0 在bypass模式FLL不会被禁止*/ - ICS->C1 = (ICS->C1 & ~(ICS_C1_CLKS_MASK)) | ICS_C1_CLKS(2); - ICS->C2 = ICS->C2 & ~(ICS_C2_LP_MASK); + ICS->C1 = (ICS->C1 & ~(ICS_C1_CLKS_MASK)) | ICS_C1_CLKS(2); + ICS->C2 = ICS->C2 & ~(ICS_C2_LP_MASK); - /*�ȴ����ʱ��Դ�����ı�*/ -#if defined(IAR) - asm( - "nop \n" - "nop \n" - ); + /*等待输出时钟源发生改变*/ +#if defined(IAR) + asm( + "nop \n" + "nop \n" + ); #elif defined(__MWERKS__) - asm{ - nop - nop - }; -#endif - while(((ICS->S & ICS_S_CLKST_MASK) >> ICS_S_CLKST_SHIFT) !=2); - - /* ����ICS���ʱ��Դѡ���ⲿʱ��Դ - * ע��: ȷ���ⲿʱ��Ƶ����20MHz���� - */ + asm{ + nop + nop + }; +#endif + while(((ICS->S & ICS_S_CLKST_MASK) >> ICS_S_CLKST_SHIFT) !=2); + + /* 现在ICS输出时钟源选择外部时钟源 + * 注释: 确保外部时钟频率在20MHz以内 + */ #if defined(CPU_NV32) - /*��ѡ���ICS���ʱ��Դ��2��Ƶ*/ - if(((ICS->C2 & ICS_C2_BDIV_MASK)>>5) != 1) - { - ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(1); - } + /*对选择的ICS输出时钟源做2分频*/ + if(((ICS->C2 & ICS_C2_BDIV_MASK)>>5) != 1) + { + ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(1); + } #else ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(0); #endif @@ -478,51 +478,51 @@ void FEE_to_FBE(ICS_ConfigType *pConfig) /*****************************************************************************//*! * - * @ ��Ҫ ��ICS�Ĺ���ģʽ�ɵ�ǰ��FBIģʽת����FBEģʽ - * - * @ ���� pConfig ָ�����ýṹ��. + * @ 概要 将ICS的工作模式由当前的FBI模式转换成FBE模式 * - * @ ���� + * @ 参数 pConfig 指向配置结构体. * - * @ �ɹ�/ʧ�ܵı� ���� - * @ �ο� ICS_ConfigType + * @ 无返回 + * + * @ 成功/失败的标准 :无 + * @ 参看 ICS_ConfigType *****************************************************************************/ void FBI_to_FBE(ICS_ConfigType *pConfig) { - OSC_Init(&pConfig->oscConfig); /*��ʼ��OSC*/ - - /* ѡ���ⲿʱ����ΪFLL�IJο�ʱ�� */ - /*ѡ���ⲿʱ����Ϊ���ʱ��Դ*/ + OSC_Init(&pConfig->oscConfig); /*初始化OSC*/ + + /* 选择外部时钟做为FLL的参考时钟 */ + /*选择外部时钟作为输出时钟源*/ ICS->C1 = ICS->C1 & ~(ICS_C1_IREFS_MASK); - ICS->C1 = (ICS->C1 & ~(ICS_C1_CLKS_MASK)) | ICS_C1_CLKS(2); + ICS->C1 = (ICS->C1 & ~(ICS_C1_CLKS_MASK)) | ICS_C1_CLKS(2); - /* �ȴ����ʱ��Դ�����ı� */ + /* 等待输出时钟源发生改变 */ -#if defined(IAR) - asm( - "nop \n" - "nop \n" - ); +#if defined(IAR) + asm( + "nop \n" + "nop \n" + ); #elif defined(__MWERKS__) - asm{ - nop - nop - }; -#endif - while(((ICS->S & ICS_S_CLKST_MASK) >> ICS_S_CLKST_SHIFT) !=2); /*�ⲿʱ�ӳ�ΪICS���ʱ��Դ*/ - while((ICS->S & ICS_S_IREFST_MASK));/*�ⲿʱ�ӳ�ΪFLL�IJο�ʱ��*/ + asm{ + nop + nop + }; +#endif + while(((ICS->S & ICS_S_CLKST_MASK) >> ICS_S_CLKST_SHIFT) !=2); /*外部时钟成为ICS输出时钟源*/ + while((ICS->S & ICS_S_IREFST_MASK));/*外部时钟成为FLL的参考时钟*/ - /* ����ϵͳʱ��Դ���ⲿ�ο�ʱ�� - * ע��:ȷ���ⲿʱ��Դ��Ƶ����20MHz�� - */ + /* 现在系统时钟源是外部参考时钟 + * 注释:确保外部时钟源的频率在20MHz内 + */ #if defined(CPU_NV32) - /*��ѡ�е�ʱ��Դ��2��Ƶ*/ - if(((ICS->C2 & ICS_C2_BDIV_MASK)>>5) != 1) - { - ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(1); - } + /*对选中的时钟源做2分频*/ + if(((ICS->C2 & ICS_C2_BDIV_MASK)>>5) != 1) + { + ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(1); + } #else ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(0); #endif @@ -530,180 +530,180 @@ void FBI_to_FBE(ICS_ConfigType *pConfig) /*****************************************************************************//** * - * @ ��Ҫ ��ICS�Ĺ���ģʽ�ɵ�ǰ��FBIģʽת����FEEģʽ - * - * @ ���� pConfig ָ�����ýṹ�� + * @ 概要 将ICS的工作模式由当前的FBI模式转换成FEE模式 + * + * @ 参数 pConfig 指向配置结构体 * - * @ ���� + * @ 无返回 * - * @ �ɹ�/ʧ�ܵı� ���� - * @ �ο� ICS_ConfigType + * @ 成功/失败的标准 :无 + * @ 参看 ICS_ConfigType *****************************************************************************/ void FBI_to_FEE(ICS_ConfigType *pConfig) { - OSC_Init(&pConfig->oscConfig); /*��ʼ��OSC*/ - - /* ѡ���ⲿʱ����ΪFLL�IJο�ʱ�� */ - /* ѡ��FLL�����Ϊ��ΪICS���ʱ��Դ*/ + OSC_Init(&pConfig->oscConfig); /*初始化OSC*/ + + /* 选择外部时钟作为FLL的参考时钟 */ + /* 选择FLL输出作为做为ICS输出时钟源*/ ICS->C1 = ICS->C1 & ~(ICS_C1_IREFS_MASK); - ICS->C1 = (ICS->C1 & ~(ICS_C1_CLKS_MASK)); + ICS->C1 = (ICS->C1 & ~(ICS_C1_CLKS_MASK)); - /*�ȴ�ʱ��Դ�ı�*/ -#if defined(IAR) - asm( - "nop \n" - "nop \n" - ); + /*等待时钟源改变*/ +#if defined(IAR) + asm( + "nop \n" + "nop \n" + ); #elif defined(__MWERKS__) - asm{ - nop - nop - }; -#endif + asm{ + nop + nop + }; +#endif + + while((ICS->S & ICS_S_CLKST_MASK)); /*FLL时钟成为ICS输出时钟源*/ + while((ICS->S & ICS_S_IREFST_MASK)); /*外部时钟成为FLL参考时钟*/ - while((ICS->S & ICS_S_CLKST_MASK)); /*FLLʱ�ӳ�ΪICS���ʱ��Դ*/ - while((ICS->S & ICS_S_IREFST_MASK)); /*�ⲿʱ�ӳ�ΪFLL�ο�ʱ��*/ - - /* ����ϵͳʱ��ԴΪ�ⲿʱ�� - * ע��: ȷ���ⲿʱ��Դ��Ƶ����20MHz�� - */ + /* 现在系统时钟源为外部时钟 + * 注释: 确保外部时钟源的频率在20MHz内 + */ #if defined(CPU_NV32) - /*��ѡ�е�ʱ��Դ��2��Ƶ*/ - if(((ICS->C2 & ICS_C2_BDIV_MASK)>>5) != 1) - { - ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(1); - } + /*对选中的时钟源做2分频*/ + if(((ICS->C2 & ICS_C2_BDIV_MASK)>>5) != 1) + { + ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(1); + } #else ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(0); #endif - /*LOLS����*/ - ICS->S |= ICS_S_LOLS_MASK; + /*LOLS清零*/ + ICS->S |= ICS_S_LOLS_MASK; } /*****************************************************************************//*! * - * @ ��Ҫ ��ICS�Ĺ���ģʽ�ɵ�ǰ��FBIģʽת����FBIPģʽ - * - * @ ���� pConfig ���ָ�����ýṹ�� + * @ 概要 将ICS的工作模式由当前的FBI模式转换成FBIP模式 + * + * @ 参数 pConfig 输出指向配置结构体 * - * @ ���� + * @ 无返回 * - * @ �ɹ�/ʧ�ܵı� ���� - * @ ���� ���������ڵ��Խӿ�û��û�н��ߵ�״̬�� - * @ �ο� ICS_ConfigType + * @ 成功/失败的标准 :无 + * @ 警告 必须运行在调试接口没有没有接线的状态下 + * @ 参看 ICS_ConfigType *****************************************************************************/ void FBI_to_FBILP(ICS_ConfigType *pConfig) { - /* - * �����ⲿ����ʱ8MHz����4MHz - */ - ICS->C2 |= ICS_C2_LP_MASK; /*�������ģʽ */ + /* + * 假设外部晶振时8MHz或者4MHz + */ + ICS->C2 |= ICS_C2_LP_MASK; /*进入低功耗模式 */ } /*****************************************************************************//*! * - * @ ��Ҫ ��ICS�Ĺ���ģʽ�ɵ�ǰ��FBIģʽת��ΪFEIģʽ - * - * @ ���� pConfig ָ�����ýṹ��. + * @ 概要 将ICS的工作模式由当前的FBI模式转变为FEI模式 + * + * @ 参数 pConfig 指向配置结构体. * - * @ ���� + * @ 无返回 * - * @ �ɹ�/ʧ�ܵı� ���� - * @ �ο� ICS_ConfigType + * @ 成功/失败的标准 :无 + * @ 参看 ICS_ConfigType *****************************************************************************/ void FBI_to_FEI(ICS_ConfigType *pConfig) { - /* ѡ���ڲ�ʱ��ΪFLL�IJο�ʱ�� */ - /*ѡ��FLL�����ΪICS���ʱ��Դ*/ + /* 选择内部时钟为FLL的参考时钟 */ + /*选择FLL输出作为ICS输出时钟源*/ ICS->C1 = ICS->C1 | (ICS_C1_IREFS_MASK); - ICS->C1 = (ICS->C1 & ~(ICS_C1_CLKS_MASK)); - - /*�ȴ�ʱ��Դ�����ı�*/ + ICS->C1 = (ICS->C1 & ~(ICS_C1_CLKS_MASK)); -#if defined(IAR) - asm( - "nop \n" - "nop \n" - ); + /*等待时钟源发生改变*/ + +#if defined(IAR) + asm( + "nop \n" + "nop \n" + ); #elif defined(__MWERKS__) - asm{ - nop - nop - }; -#endif - while((ICS->S & ICS_S_CLKST_MASK)); /*FLL�����ΪICS���ʱ��Դ*/ - while(!(ICS->S & ICS_S_IREFST_MASK)); /*FLL�IJο�ʱ��ѡ��Ϊ�ⲿʱ��*/ + asm{ + nop + nop + }; +#endif + while((ICS->S & ICS_S_CLKST_MASK)); /*FLL输出成为ICS输出时钟源*/ + while(!(ICS->S & ICS_S_IREFST_MASK)); /*FLL的参考时钟选择为外部时钟*/ + - - /* - * ����ICS���ʱ��ԴΪFLL��� - */ + /* + * 现在ICS输出时钟源为FLL输出 + */ #if defined(CPU_NV32) - /*��ѡ�е�ʱ��Դ��2��Ƶ*/ - if(((ICS->C2 & ICS_C2_BDIV_MASK)>>5) != 1) - { - ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(1); - } + /*对选中的时钟源做2分频*/ + if(((ICS->C2 & ICS_C2_BDIV_MASK)>>5) != 1) + { + ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(1); + } #else ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(0); #endif - /*LOLS���� */ - ICS->S |= ICS_S_LOLS_MASK; + /*LOLS清零 */ + ICS->S |= ICS_S_LOLS_MASK; } /*****************************************************************************//*! * - * @ ��Ҫ ��ICS�Ĺ���ģʽ�ɵ�ǰ��FBEģʽת����FBIģʽ - * - * @ ���� pConfig ָ�����ýṹ�� + * @ 概要 将ICS的工作模式由当前的FBE模式转换成FBI模式 + * + * @ 参数 pConfig 指向配置结构体 * - * @ ���� + * @ 无返回 * - * @ �ɹ�/ʧ�ܵı� ���� - * @ �ο� ICS_ConfigType + * @ 成功/失败的标准 :无 + * @ 参看 ICS_ConfigType *****************************************************************************/ void FBE_to_FBI(ICS_ConfigType *pConfig) { - /*ѡ���ڲ�ʱ����ΪFLL�IJο�ʱ��*/ - /*ѡ���ڲ�ʱ����ΪICS���ʱ��Դ*/ + /*选择内部时钟作为FLL的参考时钟*/ + /*选择内部时钟作为ICS输出时钟源*/ ICS->C1 = ICS->C1 | (ICS_C1_IREFS_MASK); - ICS->C1 = (ICS->C1 & ~(ICS_C1_CLKS_MASK)) | ICS_C1_CLKS(1); - - /*�ȴ�ʱ��Դ�����ı�*/ -#if defined(IAR) - asm( - "nop \n" - "nop \n" - ); + ICS->C1 = (ICS->C1 & ~(ICS_C1_CLKS_MASK)) | ICS_C1_CLKS(1); + + /*等待时钟源发生改变*/ +#if defined(IAR) + asm( + "nop \n" + "nop \n" + ); #elif defined(__MWERKS__) - asm{ - nop - nop - }; -#endif - while(((ICS->S & ICS_S_CLKST_MASK) >> ICS_S_CLKST_SHIFT) != 1);/*�ڲ�ʱ�ӳ�ΪICS���ʱ��Դ*/ - while(!(ICS->S & ICS_S_IREFST_MASK)); /*�ڲ�ʱ�ӳ�ΪFLL�IJο�ʱ��*/ - - /* - * ����ICS���ʱ��ԴΪ�ڲ�ʱ�� - */ - + asm{ + nop + nop + }; +#endif + while(((ICS->S & ICS_S_CLKST_MASK) >> ICS_S_CLKST_SHIFT) != 1);/*内部时钟成为ICS输出时钟源*/ + while(!(ICS->S & ICS_S_IREFST_MASK)); /*内部时钟成为FLL的参考时钟*/ + + /* + * 现在ICS输出时钟源为内部时钟 + */ + #if defined(CPU_NV32) - /*��ѡ�е�ʱ��Դ��2��Ƶ*/ - if(((ICS->C2 & ICS_C2_BDIV_MASK)>>5) != 1) - { - ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(1); - } + /*对选中的时钟源做2分频*/ + if(((ICS->C2 & ICS_C2_BDIV_MASK)>>5) != 1) + { + ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(1); + } #else ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(0); #endif - - /* - * ����OSCģ�� + + /* + * 禁用OSC模块 */ OSC_Disable(); } @@ -711,223 +711,223 @@ void FBE_to_FBI(ICS_ConfigType *pConfig) /*****************************************************************************//*! * - * @ ��Ҫ ��ICS�Ĺ���ģʽ�ɵ�ǰ��FBEģʽת����FEEģʽ - * - * @ ���� pConfig ָ�����ýṹ��. + * @ 概要 将ICS的工作模式由当前的FBE模式转换成FEE模式 + * + * @ 参数 pConfig 指向配置结构体. * - * @ ���� + * @ 无返回 * - * @ �ɹ�/ʧ�ܵı� ���� - * @ �ο� ICS_ConfigType + * @ 成功/失败的标准 :无 + * @ 参看 ICS_ConfigType *****************************************************************************/ void FBE_to_FEE(ICS_ConfigType *pConfig) { - - /*ѡ��FLL�����Ϊ���ʱ��Դ*/ - ICS->C1 = (ICS->C1 & ~(ICS_C1_CLKS_MASK)); - - /*�ȴ�ICS���ʱ��Դ�����ı�*/ -#if defined(IAR) - asm( - "nop \n" - "nop \n" - ); + + /*选择FLL输出作为输出时钟源*/ + ICS->C1 = (ICS->C1 & ~(ICS_C1_CLKS_MASK)); + + /*等待ICS输出时钟源发生改变*/ +#if defined(IAR) + asm( + "nop \n" + "nop \n" + ); #elif defined(__MWERKS__) - asm{ - nop - nop - }; -#endif - while(ICS->S & ICS_S_CLKST_MASK); + asm{ + nop + nop + }; +#endif + while(ICS->S & ICS_S_CLKST_MASK); - - /* - * ����ICS���ʱ��ԴΪFLL��� - * ע��: �ⲿʱ��Ƶ�� <= 20MHz - */ + + /* + * 现在ICS输出时钟源为FLL输出 + * 注释: 外部时钟频率 <= 20MHz + */ #if defined(CPU_NV32) - /*��ѡ�е�ICS���ʱ��Դ��2��Ƶ*/ - if(((ICS->C2 & ICS_C2_BDIV_MASK)>>5) != 1) - { - ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(1); - } + /*对选中的ICS输出时钟源做2分频*/ + if(((ICS->C2 & ICS_C2_BDIV_MASK)>>5) != 1) + { + ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(1); + } #else ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(0); -#endif - /* LOLS���� */ - ICS->S |= ICS_S_LOLS_MASK; +#endif + /* LOLS清零 */ + ICS->S |= ICS_S_LOLS_MASK; } /*****************************************************************************//*! * - * @ ��Ҫ ��ICS�Ĺ���ģʽ�ɵ�ǰ��FBEģʽת���FEIģʽ - * - * @ ���� pConfig ָ�����ýṹ�� + * @ 概要 将ICS的工作模式由当前的FBE模式转变成FEI模式 * - * @ ���� + * @ 参数 pConfig 指向配置结构体 * - * @ �ɹ�/ʧ�ܵı� ���� - * @ �ο� ICS_ConfigType + * @ 无返回 + * + * @ 成功/失败的标准 :无 + * @ 参看 ICS_ConfigType *****************************************************************************/ void FBE_to_FEI(ICS_ConfigType *pConfig) { - /* ѡ���ڲ�ʱ����ΪFLL�IJο�ʱ��*/ - /*ѡ��FLL�����ΪICS���ʱ��Դ*/ + /* 选择内部时钟作为FLL的参考时钟*/ + /*选择FLL输出做为ICS输出时钟源*/ ICS->C1 = ICS->C1 | (ICS_C1_IREFS_MASK); - ICS->C1 = (ICS->C1 & ~(ICS_C1_CLKS_MASK)); - - /*�ȴ�ʱ��Դ�ı�*/ -#if defined(IAR) - asm( - "nop \n" - "nop \n" - ); + ICS->C1 = (ICS->C1 & ~(ICS_C1_CLKS_MASK)); + + /*等待时钟源改变*/ +#if defined(IAR) + asm( + "nop \n" + "nop \n" + ); #elif defined(__MWERKS__) - asm{ - nop - nop - }; -#endif - while((ICS->S & ICS_S_CLKST_MASK)); /*FLL�����ΪICS���ʱ��Դ*/ - while(!(ICS->S & ICS_S_IREFST_MASK)); /*�ڲ�ʱ���г�ΪFLL�ο�ʱ��*/ + asm{ + nop + nop + }; +#endif + while((ICS->S & ICS_S_CLKST_MASK)); /*FLL输出成为ICS输出时钟源*/ + while(!(ICS->S & ICS_S_IREFST_MASK)); /*内部时钟中成为FLL参考时钟*/ - /* - * ����FLL�����ΪICS���ʱ��Դ + /* + * 现在FLL输出成为ICS输出时钟源 */ #if defined(CPU_NV32) - /*��ѡ�е�ʱ��Դ��2��Ƶ*/ - if(((ICS->C2 & ICS_C2_BDIV_MASK)>>5) != 1) - { - ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(1); - } + /*对选中的时钟源做2分频*/ + if(((ICS->C2 & ICS_C2_BDIV_MASK)>>5) != 1) + { + ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(1); + } #else ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(0); -#endif - /*LOLS����*/ - ICS->S |= ICS_S_LOLS_MASK; - +#endif + /*LOLS清零*/ + ICS->S |= ICS_S_LOLS_MASK; + /* - *����OSCģ�� + *禁用OSC模块 */ OSC_Disable(); } /*****************************************************************************//*! * - * @ ��Ҫ ��ICS�Ĺ���ģʽ�ɵ�ǰ��FBEģʽת��ΪFBELPģʽ + * @ 概要 将ICS的工作模式由当前的FBE模式转变为FBELP模式 * - * @ ���� pConfig ָ�����ýṹ��. + * @ 参数 pConfig 指向配置结构体. * - * @ ���� + * @ 无返回 * - * @ �ɹ�/ʧ�ܵı� ���� - * @ �ο� ICS_ConfigType + * @ 成功/失败的标准 :无 + * @ 参看 ICS_ConfigType *****************************************************************************/ void FBE_to_FBELP(ICS_ConfigType *pConfig) { - /* enter low power mode */ - /*�������ģʽ*/ - ICS->C2 = ICS->C2 | (ICS_C2_LP_MASK); + /* enter low power mode */ + /*进入低功耗模式*/ + ICS->C2 = ICS->C2 | (ICS_C2_LP_MASK); } /*****************************************************************************//*! * - * @ ��Ҫ ��ICS�Ĺ���ģʽ�ɵ�ǰ��FBELPģʽת����FBEģʽ - * - * @ ���� pConfig ָ�����ýṹ��. + * @ 概要 将ICS的工作模式由当前的FBELP模式转换成FBE模式 + * + * @ 参数 pConfig 指向配置结构体. * - * @ ���� + * @ 无返回 * - * @ �ɹ�/ʧ�ܵı� ���� - * @ �ο� ICS_ConfigType + * @ 成功/失败的标准 :无 + * @ 参看 ICS_ConfigType *****************************************************************************/ void FBELP_to_FBE(ICS_ConfigType *pConfig) { - /* enter low power mode */ - /*���õ���ģʽ*/ - ICS->C2 = ICS->C2 & ~(ICS_C2_LP_MASK); + /* enter low power mode */ + /*禁用低功耗模式*/ + ICS->C2 = ICS->C2 & ~(ICS_C2_LP_MASK); } /*****************************************************************************//*! * - * @ ��Ҫ ��ICS�Ĺ���ģʽ�ɵ�ǰ��FBILPת����FBIģʽ - * - * @ ���� pConfig ָ�����ýṹ��. + * @ 概要 将ICS的工作模式由当前的FBILP转换到FBI模式 * - * @ ���� + * @ 参数 pConfig 指向配置结构体. * - * @ �ɹ�/ʧ�ܵı� ���� - * @ �ο� ICS_ConfigType + * @ 无返回 + * + * @ 成功/失败的标准 :无 + * @ 参看 ICS_ConfigType *****************************************************************************/ void FBILP_to_FBI(ICS_ConfigType *pConfig) { - /* enter low power mode */ - /*���õ���ģʽ*/ - ICS->C2 = ICS->C2 & ~(ICS_C2_LP_MASK); + /* enter low power mode */ + /*禁用低功耗模式*/ + ICS->C2 = ICS->C2 & ~(ICS_C2_LP_MASK); } /*****************************************************************************//*! * - * @ ��Ҫ �����ڲ��ڲ�ʱ�� (IRC). - * - * @ ���� u16TrimValue ����ֵ + * @ 概要 调整内部内部时钟 (IRC). + * + * @ 参数 u16TrimValue 调整值 * - * @ ���� + * @ 无返回 * - * @ �ɹ�/ʧ�ܵı� ���� + * @ 成功/失败的标准 :无 *****************************************************************************/ void ICS_Trim(uint16_t u16TrimValue) { - ICS->C3 = (uint8_t) u16TrimValue; /*������ֵд��Ĵ���*/ + ICS->C3 = (uint8_t) u16TrimValue; /*将调整值写入寄存器*/ ICS->C4 = (ICS->C4 & ~(ICS_C4_SCFTRIM_MASK)) | ((u16TrimValue>>8) & 0x01); - while(!(ICS->S & ICS_S_LOCK_MASK)); + while(!(ICS->S & ICS_S_LOCK_MASK)); } /*****************************************************************************//*! * - * @ ��Ҫ ���ⲿ�ο�ʱ�ӽ��з�Ƶ��ʹ�÷�Ƶ�����FLL����������31.25k~39.0625k�� + * @ 概要 对外部参考时钟进行分频,使得分频结果在FLL可以锁定的31.25k~39.0625k内 * - * @ ���� u32ClkFreqKHz �ο�ʱ��Ƶ��. + * @ 参数 u32ClkFreqKHz 参考时钟频率. * - * @ ���� + * @ 无返回 * - * @ �ɹ�/ʧ�ܵı� ���� + * @ 成功/失败的标准 :无 *****************************************************************************/ void ICS_SetClkDivider(uint32_t u32ClkFreqKHz) { - + switch(u32ClkFreqKHz) { case 8000L: case 10000L: /* 8MHz or 10MHz*/ - ICS->C1 = (ICS->C1 & ~(ICS_C1_RDIV_MASK)) | ICS_C1_RDIV(3); - /*8MHz��Ƶ����� 8000/256 = 31.25K */ - /*10MHz��Ƶ����� 8000/256 = 31.25K*/ + ICS->C1 = (ICS->C1 & ~(ICS_C1_RDIV_MASK)) | ICS_C1_RDIV(3); + /*8MHz分频结果是 8000/256 = 31.25K */ + /*10MHz分频结果是 8000/256 = 31.25K*/ break; case 4000L: /* 4MHz */ - ICS->C1 = (ICS->C1 & ~(ICS_C1_RDIV_MASK)) | ICS_C1_RDIV(2); - /*4MHz��Ƶ����� 4000/128 = 31.25K*/ + ICS->C1 = (ICS->C1 & ~(ICS_C1_RDIV_MASK)) | ICS_C1_RDIV(2); + /*4MHz分频结果是 4000/128 = 31.25K*/ break; case 12000L: /* 12MHz */ - ICS->C1 = (ICS->C1 & ~(ICS_C1_RDIV_MASK)) | ICS_C1_RDIV(3); - /*12MHz��Ƶ�����12000/512 = 23.43K*/ + ICS->C1 = (ICS->C1 & ~(ICS_C1_RDIV_MASK)) | ICS_C1_RDIV(3); + /*12MHz分频结果是12000/512 = 23.43K*/ break; case 16000L: /* 16MHz */ - ICS->C1 = (ICS->C1 & ~(ICS_C1_RDIV_MASK)) | ICS_C1_RDIV(4); - /* 16MHz��Ƶ����� 16000/512 = 31.25K */ + ICS->C1 = (ICS->C1 & ~(ICS_C1_RDIV_MASK)) | ICS_C1_RDIV(4); + /* 16MHz分频结果是 16000/512 = 31.25K */ break; case 20000L: /* 20MHz */ - ICS->C1 = (ICS->C1 & ~(ICS_C1_RDIV_MASK)) | ICS_C1_RDIV(4); - /*20MHz��Ƶ����� 20000/512 = 39.0625K */ + ICS->C1 = (ICS->C1 & ~(ICS_C1_RDIV_MASK)) | ICS_C1_RDIV(4); + /*20MHz分频结果是 20000/512 = 39.0625K */ break; case 32L: /* 32KHz */ @@ -939,65 +939,65 @@ void ICS_SetClkDivider(uint32_t u32ClkFreqKHz) } /*****************************************************************************//*! * - * @ ��Ҫ ��ʼ��ICSģ����ݶ�������Ҫ������ʱ��Ƶ��. - * - * @ ���� pConfig ָ�����ýṹ��. + * @ 概要 初始化ICS模块根据定义所需要的总线时钟频率. * - * @ ���� + * @ 参数 pConfig 指向配置结构体. * - * @ �ɹ�/ʧ�ܵı� ���� - * @ �ο� ICS_ConfigType + * @ 无返回 + * + * @ 成功/失败的标准 :无 + * @ 参看 ICS_ConfigType *****************************************************************************/ void ICS_Init(ICS_ConfigType *pConfig) { if(pConfig->u8ClkMode == ICS_CLK_MODE_FEE) - { - pConfig->oscConfig.bIsCryst = 1; /* OSC�����ѡ��ѡ������ʱ��Դ */ - pConfig->oscConfig.bWaitInit = 1; /* �ȴ�������ʼ������� */ - - /*ѡ��FEEģʽ��OSC���ѡ������ʱ��Դ*/ - FEI_to_FEE(pConfig); + { + pConfig->oscConfig.bIsCryst = 1; /* OSC的输出选择选择振动器时钟源 */ + pConfig->oscConfig.bWaitInit = 1; /* 等待振荡器初始化化完成 */ + + /*选择FEE模式,OSC输出选择振荡器时钟源*/ + FEI_to_FEE(pConfig); } else if (pConfig->u8ClkMode == ICS_CLK_MODE_FEE_OSC) - { - pConfig->oscConfig.bIsCryst = 0; /*OSC���ʱ��ѡ��EEXTAL���ŵ��ⲿʱ��Դ*/ + { + pConfig->oscConfig.bIsCryst = 0; /*OSC输出时钟选择EEXTAL引脚的外部时钟源*/ - /*ѡ��FEE����ģʽ��OSC���ʱ��ѡ��EEXTAL���ŵ��ⲿʱ��Դ*/ - FEI_to_FEE_OSC(pConfig); + /*选择FEE工作模式;OSC输出时钟选择EEXTAL引脚的外部时钟源*/ + FEI_to_FEE_OSC(pConfig); } else if (pConfig->u8ClkMode == ICS_CLK_MODE_FBE_OSC) { - pConfig->oscConfig.bIsCryst = 0; /* is clock��OSC���ʱ��ѡ��EXTAL���ŵ��ⲿʱ��Դ */ - /* ѡ��FBE����ģʽ��OSC���ʱ��ѡ��EXTAL���ŵ��ⲿʱ��Դ*/ - FEI_to_FBE_OSC(pConfig); - } - else if(pConfig->u8ClkMode == ICS_CLK_MODE_FBELP ) - { - pConfig->oscConfig.bIsCryst = 1; /* OSC�����ʱ��ѡ��ѡ������ʱ��Դ */ - pConfig->oscConfig.bWaitInit = 1; /*�ȴ�������ʼ������� */ + pConfig->oscConfig.bIsCryst = 0; /* is clock:OSC输出时钟选择EXTAL引脚的外部时钟源 */ + /* 选择FBE工作模式;OSC输出时钟选择EXTAL引脚的外部时钟源*/ + FEI_to_FBE_OSC(pConfig); + } + else if(pConfig->u8ClkMode == ICS_CLK_MODE_FBELP ) + { + pConfig->oscConfig.bIsCryst = 1; /* OSC的输出时钟选择选择振动器时钟源 */ + pConfig->oscConfig.bWaitInit = 1; /*等待振荡器初始化化完成 */ - /* ѡ��FBEģʽ��OSC�����ʱ��ѡ��ѡ������ʱ��Դ*/ - FEI_to_FBE(pConfig); /*��ѡ��PBEģʽ*/ - FBE_to_FBELP(pConfig); /*ѡ��FBELP*/ - ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(0); - } - else if(pConfig->u8ClkMode == ICS_CLK_MODE_FBILP ) - { - - /* OSC���ʱ��ѡ��EXTAL���ŵ��ⲿʱ��Դ*/ - pConfig->oscConfig.bIsCryst = 0; - - /* ѡ��FBEģʽ��OSC���ʱ��ѡ��EXTAL���ŵ��ⲿʱ��Դ*/ - FEI_to_FBI(pConfig); - FBI_to_FBILP(pConfig); - ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(0); - } + /* 选择FBE模式,OSC的输出时钟选择选择振动器时钟源*/ + FEI_to_FBE(pConfig); /*先选择PBE模式*/ + FBE_to_FBELP(pConfig); /*选择FBELP*/ + ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(0); + } + else if(pConfig->u8ClkMode == ICS_CLK_MODE_FBILP ) + { + + /* OSC输出时钟选择EXTAL引脚的外部时钟源*/ + pConfig->oscConfig.bIsCryst = 0; + + /* 选择FBE模式,OSC输出时钟选择EXTAL引脚的外部时钟源*/ + FEI_to_FBI(pConfig); + FBI_to_FBILP(pConfig); + ICS->C2 = (ICS->C2 & ~(ICS_C2_BDIV_MASK)) | ICS_C2_BDIV(0); + } else { - - /*ICSĬ�Ϲ���ģʽFEIģʽ*/ + + /*ICS默认工作模式FEI模式*/ #if defined(CPU_NV32) if(((ICS->C2 & ICS_C2_BDIV_MASK)>>5) == 1) { @@ -1011,14 +1011,14 @@ void ICS_Init(ICS_ConfigType *pConfig) } /*****************************************************************************//*! * - * @ ��Ҫ ��ICSģ����Ĵ������и�λ. - * - * @ ���� + * @ 概要 对ICS模块各寄存器进行复位. * - * @ ���� + * @ 无参数 * - * @ �ɹ�/ʧ�ܵı� ���� - * @ �ο� ICS_Init + * @ 无返回 + * + * @ 成功/失败的标准 :无 + * @ 参看 ICS_Init *****************************************************************************/ void ICS_DeInit(void) @@ -1028,81 +1028,81 @@ void ICS_DeInit(void) ICS->C3 = ICS_C3_DEFAULT; ICS->C4 = ICS_C4_DEFAULT; while(ICS->S != ICS_S_DEFAULT) - ; + ; } /*****************************************************************************//*! * - * @ ��Ҫ ͨ���趨�IJ�����ʼ��XOSC - * - * @ ���� pConfig ָ��osc���ýṹ�� + * @ 概要 通过设定的参数初始化XOSC + * + * @ 参数 pConfig 指向osc配置结构体 * - * @ ���� + * @ 无返回 * - * @ �ɹ�/ʧ�ܵı� ���� + * @ 成功/失败的标准 :无 *****************************************************************************/ void OSC_Init(OSC_ConfigType *pConfig) { - uint8 cr = 0; - /* - * - */ - if(pConfig->bGain) /*����������ѡ��*/ - { - /* high gain��ѡ�������ģʽ */ - cr |= OSC_CR_HGO_MASK ; - } - - if(pConfig->bRange) /*Ƶ�ʷ�Χ��ѡ��*/ - { - cr |= OSC_CR_RANGE_MASK; /*ѡ���Ƶ��Χ */ - } + uint8 cr = 0; + /* + * + */ + if(pConfig->bGain) /*高增益振荡器选择*/ + { + /* high gain:选择高增益模式 */ + cr |= OSC_CR_HGO_MASK ; + } + + if(pConfig->bRange) /*频率范围的选择*/ + { + cr |= OSC_CR_RANGE_MASK; /*选择高频范围 */ + } + + if(pConfig->bStopEnable) /*停止模式下的OSC使能*/ + { + cr |= OSC_CR_OSCSTEN_MASK; /*OSC在停止模式下保持使能*/ + } - if(pConfig->bStopEnable) /*ֹͣģʽ�µ�OSCʹ��*/ - { - cr |= OSC_CR_OSCSTEN_MASK; /*OSC��ֹͣģʽ�±���ʹ��*/ - } + if(pConfig->bIsCryst) /*OSC输出选择*/ + { + cr |= OSC_CR_OSCOS_MASK; /*选择振荡器时钟*/ + } - if(pConfig->bIsCryst) /*OSC���ѡ��*/ - { - cr |= OSC_CR_OSCOS_MASK; /*ѡ������ʱ��*/ - } + if(pConfig->bEnable) /*OSC使能*/ + { + cr |= OSC_CR_OSCEN_MASK; + } - if(pConfig->bEnable) /*OSCʹ��*/ - { - cr |= OSC_CR_OSCEN_MASK; - } - - OSC->CR = cr; /*��ֵд����ƼĴ���*/ - - if(pConfig->bWaitInit) - { + OSC->CR = cr; /*数值写入控制寄存器*/ - /* - *�ȴ���ʼ����� - */ - while(!(OSC->CR & OSC_CR_OSCINIT_MASK)); - - } + if(pConfig->bWaitInit) + { + + /* + *等待初始化完成 + */ + while(!(OSC->CR & OSC_CR_OSCINIT_MASK)); + + } } /*****************************************************************************//*! * - * @ ��Ҫ ����OSCģ�飬ʹ��ָ���Ĭ��״̬. - * - * @ ������� + * @ 概要 重置OSC模块,使其恢复到默认状态. * - * @ ���� + * @ 无输参数 * - * @ �ɹ�/ʧ�ܵı� ���� - * @ �ο� ICS_Init + * @ 无返回 + * + * @ 成功/失败的标准 :无 + * @ 参看 ICS_Init *****************************************************************************/ void OSC_DeInit(void) { OSC->CR = OSC_CR_DEFAULT; } - + diff --git a/bsp/smartfusion2/CMSIS/startup_arm/retarget.c b/bsp/smartfusion2/CMSIS/startup_arm/retarget.c index 229a7c0b80..c4ebb0a87f 100644 --- a/bsp/smartfusion2/CMSIS/startup_arm/retarget.c +++ b/bsp/smartfusion2/CMSIS/startup_arm/retarget.c @@ -70,10 +70,10 @@ static int g_stdio_uart_init_done = 0; /*============================================================================== * sendchar() */ -int sendchar(int ch) +int sendchar(int ch) { uint32_t tx_ready; - //��һ�ε���ʱ����ʼ������ + //第一次调用时,初始化串口 if(!g_stdio_uart_init_done) { MSS_UART_init(gp_my_uart, @@ -89,7 +89,7 @@ int sendchar(int ch) } /*============================================================================== - * + * */ struct __FILE { int handle; /* Add whatever you need here */ }; FILE __stdout; @@ -111,7 +111,7 @@ int fgetc(FILE *f) { uint8_t rx_size; uint8_t rx_byte; - + do { rx_size = MSS_UART_get_rx(gp_my_uart, &rx_byte, 1); } while(0u == rx_size); |
