dongdaxing 发表于 2017-12-1 21:23:25

请教SAMD20/D21 48M时钟设置不成功问题

各位大侠
在samd21-xpro板子上有32.768khz的晶振,我用ASF建立工程,然后查看时钟配置,的确是用32.768来产生48M时钟 供系统工作
但是通过程序测试发现 系统并未工作在48M 下,苦思不得其解,请高人指点一下。
系统时钟配置代码如下:

#ifndef CONF_CLOCKS_H_INCLUDED
#define CONF_CLOCKS_H_INCLUDED

/* System clock bus configuration */
#define CONF_CLOCK_FLASH_WAIT_STATES            2
#define CONF_CLOCK_CPU_DIVIDER                  SYSTEM_MAIN_CLOCK_DIV_1
#define CONF_CLOCK_APBA_DIVIDER               SYSTEM_MAIN_CLOCK_DIV_1
#define CONF_CLOCK_APBB_DIVIDER               SYSTEM_MAIN_CLOCK_DIV_1
#define CONF_CLOCK_APBC_DIVIDER               SYSTEM_MAIN_CLOCK_DIV_1

/* SYSTEM_CLOCK_SOURCE_OSC8M configuration - Internal 8MHz oscillator */
#define CONF_CLOCK_OSC8M_PRESCALER            SYSTEM_OSC8M_DIV_1
#define CONF_CLOCK_OSC8M_ON_DEMAND            true
#define CONF_CLOCK_OSC8M_RUN_IN_STANDBY         false

/* SYSTEM_CLOCK_SOURCE_XOSC configuration - External clock/oscillator */
#define CONF_CLOCK_XOSC_ENABLE                  false
#define CONF_CLOCK_XOSC_EXTERNAL_CRYSTAL      SYSTEM_CLOCK_EXTERNAL_CRYSTAL
#define CONF_CLOCK_XOSC_EXTERNAL_FREQUENCY      12000000UL
#define CONF_CLOCK_XOSC_STARTUP_TIME            SYSTEM_XOSC_STARTUP_32768
#define CONF_CLOCK_XOSC_AUTO_GAIN_CONTROL       true
#define CONF_CLOCK_XOSC_ON_DEMAND               true
#define CONF_CLOCK_XOSC_RUN_IN_STANDBY          false

/* SYSTEM_CLOCK_SOURCE_XOSC32K configuration - External 32KHz crystal/clock oscillator */
#define CONF_CLOCK_XOSC32K_ENABLE               true
#define CONF_CLOCK_XOSC32K_EXTERNAL_CRYSTAL   SYSTEM_CLOCK_EXTERNAL_CRYSTAL
#define CONF_CLOCK_XOSC32K_STARTUP_TIME         SYSTEM_XOSC32K_STARTUP_4096
#define CONF_CLOCK_XOSC32K_AUTO_AMPLITUDE_CONTROLfalse
#define CONF_CLOCK_XOSC32K_ENABLE_1KHZ_OUPUT    false
#define CONF_CLOCK_XOSC32K_ENABLE_32KHZ_OUTPUTtrue
#define CONF_CLOCK_XOSC32K_ON_DEMAND            true
#define CONF_CLOCK_XOSC32K_RUN_IN_STANDBY       false

/* SYSTEM_CLOCK_SOURCE_OSC32K configuration - Internal 32KHz oscillator */
#define CONF_CLOCK_OSC32K_ENABLE                false
#define CONF_CLOCK_OSC32K_STARTUP_TIME          SYSTEM_OSC32K_STARTUP_10
#define CONF_CLOCK_OSC32K_ENABLE_1KHZ_OUTPUT    true
#define CONF_CLOCK_OSC32K_ENABLE_32KHZ_OUTPUT   true
#define CONF_CLOCK_OSC32K_ON_DEMAND             true
#define CONF_CLOCK_OSC32K_RUN_IN_STANDBY      false

/* SYSTEM_CLOCK_SOURCE_DFLL configuration - Digital Frequency Locked Loop */
#define CONF_CLOCK_DFLL_ENABLE                  true
#define CONF_CLOCK_DFLL_LOOP_MODE               SYSTEM_CLOCK_DFLL_LOOP_MODE_CLOSED
#define CONF_CLOCK_DFLL_ON_DEMAND               false

/* DFLL open loop mode configuration */
#define CONF_CLOCK_DFLL_FINE_VALUE            (512)

/* DFLL closed loop mode configuration */
#define CONF_CLOCK_DFLL_SOURCE_GCLK_GENERATOR   GCLK_GENERATOR_1
#define CONF_CLOCK_DFLL_MULTIPLY_FACTOR         1465//(48000000 / 32768)
#define CONF_CLOCK_DFLL_QUICK_LOCK            true
#define CONF_CLOCK_DFLL_TRACK_AFTER_FINE_LOCK   true
#define CONF_CLOCK_DFLL_KEEP_LOCK_ON_WAKEUP   true
#define CONF_CLOCK_DFLL_ENABLE_CHILL_CYCLE      true
#define CONF_CLOCK_DFLL_MAX_COARSE_STEP_SIZE    (0x1f / 4)
#define CONF_CLOCK_DFLL_MAX_FINE_STEP_SIZE      (0xff / 4)

/* SYSTEM_CLOCK_SOURCE_DPLL configuration - Digital Phase-Locked Loop */
#define CONF_CLOCK_DPLL_ENABLE                  false
#define CONF_CLOCK_DPLL_ON_DEMAND               true
#define CONF_CLOCK_DPLL_RUN_IN_STANDBY          false
#define CONF_CLOCK_DPLL_LOCK_BYPASS             false
#define CONF_CLOCK_DPLL_WAKE_UP_FAST            false
#define CONF_CLOCK_DPLL_LOW_POWER_ENABLE      false

#define CONF_CLOCK_DPLL_LOCK_TIME               SYSTEM_CLOCK_SOURCE_DPLL_LOCK_TIME_NO_TIMEOUT
#define CONF_CLOCK_DPLL_REFERENCE_CLOCK         SYSTEM_CLOCK_SOURCE_DPLL_REFERENCE_CLOCK_REF0
#define CONF_CLOCK_DPLL_FILTER                  SYSTEM_CLOCK_SOURCE_DPLL_FILTER_DEFAULT

#define CONF_CLOCK_DPLL_REFERENCE_FREQUENCY   32768
#define CONF_CLOCK_DPLL_REFERENCE_DIVIDER       1
#define CONF_CLOCK_DPLL_OUTPUT_FREQUENCY      48000000

/* DPLL GCLK reference configuration */
#define CONF_CLOCK_DPLL_REFERENCE_GCLK_GENERATORGCLK_GENERATOR_1
/* DPLL GCLK lock timer configuration */
#define CONF_CLOCK_DPLL_LOCK_GCLK_GENERATOR   GCLK_GENERATOR_1

/* Set this to true to configure the GCLK when running clocks_init. If set to
* false, none of the GCLK generators will be configured in clocks_init(). */
#define CONF_CLOCK_CONFIGURE_GCLK               true

/* Configure GCLK generator 0 (Main Clock) */
#define CONF_CLOCK_GCLK_0_ENABLE                true
#define CONF_CLOCK_GCLK_0_RUN_IN_STANDBY      false
#define CONF_CLOCK_GCLK_0_CLOCK_SOURCE          SYSTEM_CLOCK_SOURCE_DFLL
#define CONF_CLOCK_GCLK_0_PRESCALER             1
#define CONF_CLOCK_GCLK_0_OUTPUT_ENABLE         false

/* Configure GCLK generator 1 */
#define CONF_CLOCK_GCLK_1_ENABLE                true
#define CONF_CLOCK_GCLK_1_RUN_IN_STANDBY      false
#define CONF_CLOCK_GCLK_1_CLOCK_SOURCE          SYSTEM_CLOCK_SOURCE_XOSC32K
#define CONF_CLOCK_GCLK_1_PRESCALER             1
#define CONF_CLOCK_GCLK_1_OUTPUT_ENABLE         false

/* Configure GCLK generator 2 (RTC) */
#define CONF_CLOCK_GCLK_2_ENABLE                false
#define CONF_CLOCK_GCLK_2_RUN_IN_STANDBY      false
#define CONF_CLOCK_GCLK_2_CLOCK_SOURCE          SYSTEM_CLOCK_SOURCE_OSC32K
#define CONF_CLOCK_GCLK_2_PRESCALER             32
#define CONF_CLOCK_GCLK_2_OUTPUT_ENABLE         false

/* Configure GCLK generator 3 */
#define CONF_CLOCK_GCLK_3_ENABLE                false
#define CONF_CLOCK_GCLK_3_RUN_IN_STANDBY      false
#define CONF_CLOCK_GCLK_3_CLOCK_SOURCE          SYSTEM_CLOCK_SOURCE_OSC8M
#define CONF_CLOCK_GCLK_3_PRESCALER             1
#define CONF_CLOCK_GCLK_3_OUTPUT_ENABLE         false

/* Configure GCLK generator 4 */
#define CONF_CLOCK_GCLK_4_ENABLE                false
#define CONF_CLOCK_GCLK_4_RUN_IN_STANDBY      false
#define CONF_CLOCK_GCLK_4_CLOCK_SOURCE          SYSTEM_CLOCK_SOURCE_OSC8M
#define CONF_CLOCK_GCLK_4_PRESCALER             1
#define CONF_CLOCK_GCLK_4_OUTPUT_ENABLE         false

/* Configure GCLK generator 5 */
#define CONF_CLOCK_GCLK_5_ENABLE                false
#define CONF_CLOCK_GCLK_5_RUN_IN_STANDBY      false
#define CONF_CLOCK_GCLK_5_CLOCK_SOURCE          SYSTEM_CLOCK_SOURCE_OSC8M
#define CONF_CLOCK_GCLK_5_PRESCALER             1
#define CONF_CLOCK_GCLK_5_OUTPUT_ENABLE         false

/* Configure GCLK generator 6 */
#define CONF_CLOCK_GCLK_6_ENABLE                false
#define CONF_CLOCK_GCLK_6_RUN_IN_STANDBY      false
#define CONF_CLOCK_GCLK_6_CLOCK_SOURCE          SYSTEM_CLOCK_SOURCE_OSC8M
#define CONF_CLOCK_GCLK_6_PRESCALER             1
#define CONF_CLOCK_GCLK_6_OUTPUT_ENABLE         false

/* Configure GCLK generator 7 */
#define CONF_CLOCK_GCLK_7_ENABLE                false
#define CONF_CLOCK_GCLK_7_RUN_IN_STANDBY      false
#define CONF_CLOCK_GCLK_7_CLOCK_SOURCE          SYSTEM_CLOCK_SOURCE_OSC8M
#define CONF_CLOCK_GCLK_7_PRESCALER             1
#define CONF_CLOCK_GCLK_7_OUTPUT_ENABLE         false

/* Configure GCLK generator 8 */
#define CONF_CLOCK_GCLK_8_ENABLE                false
#define CONF_CLOCK_GCLK_8_RUN_IN_STANDBY      false
#define CONF_CLOCK_GCLK_8_CLOCK_SOURCE          SYSTEM_CLOCK_SOURCE_OSC8M
#define CONF_CLOCK_GCLK_8_PRESCALER             1
#define CONF_CLOCK_GCLK_8_OUTPUT_ENABLE         false

#endif /* CONF_CLOCKS_H_INCLUDED */


主程序如下:

        system_init();
       
        while (true)
       {
               port_pin_set_output_level(LED_0_PIN, ledState=!ledState);
               double i=0;
               for (i=0;i<1000000;i++)
               {
               }                              
        }
我现在灯8s 才能翻转一下,明显不对。
恳请高人指点

wye11083 发表于 2017-12-2 07:39:24

上面都写了,external 12M晶体,你眼是不是选择性失明了?

chaled 发表于 2017-12-2 09:26:02

楼主也载在atmel start这个坑里面呀。感觉这个破玩意好难用呀,除了问题还没有地方问。

dongdaxing 发表于 2017-12-2 21:39:40

wye11083 发表于 2017-12-2 07:39
上面都写了,external 12M晶体,你眼是不是选择性失明了?

/* SYSTEM_CLOCK_SOURCE_XOSC configuration - External clock/oscillator */
#define CONF_CLOCK_XOSC_ENABLE                  false
#define CONF_CLOCK_XOSC_EXTERNAL_CRYSTAL      SYSTEM_CLOCK_EXTERNAL_CRYSTAL
#define CONF_CLOCK_XOSC_EXTERNAL_FREQUENCY      12000000UL
。。。。

感谢你的回复
12M时钟是禁用的 使用的外部的32.768khz时钟

dongdaxing 发表于 2017-12-2 22:26:59

用asf自带的例程 解决了
已经能跑48M了
页: [1]
查看完整版本: 请教SAMD20/D21 48M时钟设置不成功问题