Здравствуйте, исп. Atmel Studio 6.2 , мк ATSAM3N4C
Создаю через меню проект Example Project - FREERTOS_PERIPHERAL_CONTROL
Компилирует все нормально, однако в протеусе стопорится на inlin'e osc_enable
http://postimg.org/image/7m3zpqo3v/full/osc_enable применяется только в
sysclk.c и
pll.h:
CONFIG_SYSCLK_SOURCE дефайнится в 2 местах :conf_clock.h #define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_PLLACK(там же #define CONFIG_SYSCLK_PRES SYSCLK_PRES_2 #define CONFIG_PLL0_SOURCE PLL_SRC_MAINCK_XTAL #define CONFIG_PLL0_MUL 8 #define CONFIG_PLL0_DIV 1) и sysclk.h : #ifndef CONFIG_SYSCLK_SOURCE # define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_MAINCK_4M_RC #endif .
Код
[u]sysclk.c[/u]
void sysclk_init(void) //Вызывается из мейна
{/* Set flash wait state to max in case the below clock switching. */
system_init_flash(CHIP_FREQ_CPU_MAX);
/* Config system clock setting */
if (CONFIG_SYSCLK_SOURCE == SYSCLK_SRC_SLCK_RC) {
osc_enable(OSC_SLCK_32K_RC);
osc_wait_ready(OSC_SLCK_32K_RC);
pmc_switch_mck_to_sclk(CONFIG_SYSCLK_PRES);
}
.................
else if (CONFIG_SYSCLK_SOURCE == SYSCLK_SRC_MAINCK_XTAL) {
osc_enable(OSC_MAINCK_XTAL);
osc_wait_ready(OSC_MAINCK_XTAL);
pmc_switch_mck_to_mainck(CONFIG_SYSCLK_PRES);
}
else if (CONFIG_SYSCLK_SOURCE == SYSCLK_SRC_MAINCK_BYPASS) {
osc_enable(OSC_MAINCK_BYPASS);
osc_wait_ready(OSC_MAINCK_BYPASS);
pmc_switch_mck_to_mainck(CONFIG_SYSCLK_PRES);
}
#ifdef CONFIG_PLL0_SOURCE
else if (CONFIG_SYSCLK_SOURCE == SYSCLK_SRC_PLLACK) {
struct pll_config pllcfg;
[b]pll_enable_source[/b](CONFIG_PLL0_SOURCE); // PLL0_SOURCE -> #define OSC_MAINCK_XTAL 6
pll_config_defaults(&pllcfg, 0);
pll_enable(&pllcfg, 0);
pll_wait_for_lock(0);
pmc_switch_mck_to_pllack(CONFIG_SYSCLK_PRES);
}
#endif
/* Update the SystemFrequency variable */
SystemCoreClockUpdate();
/* Set a flash wait state depending on the new cpu frequency */
system_init_flash(sysclk_get_cpu_hz());
....
}
[u]pll.h[/u]
static inline void [b]pll_enable_source[/b](enum pll_source e_src)
{
switch (e_src) {
case PLL_SRC_MAINCK_4M_RC:
case PLL_SRC_MAINCK_8M_RC:
case PLL_SRC_MAINCK_12M_RC:
case PLL_SRC_MAINCK_XTAL:
case PLL_SRC_MAINCK_BYPASS:
[b]osc_enable(e_src);[/b] //e_src=6
osc_wait_ready(e_src);
break;
default:
Assert(false);
break;
}
}
Код
[b]osc.h[/b]
static inline void [b]osc_enable[/b](uint32_t ul_id)
{
switch (ul_id) {
case OSC_SLCK_32K_RC:
break;
....
case OSC_MAINCK_12M_RC:
pmc_switch_mainck_to_fastrc(CKGR_MOR_MOSCRCF_12_MHz);
break;
case OSC_MAINCK_XTAL:
[b]pmc_switch_mainck_to_xtal[/b](PMC_OSC_XTAL, <--- !!Стопорится здесь!!!
pmc_us_to_moscxtst(BOARD_OSC_STARTUP_US,
OSC_SLCK_32K_RC_HZ));
break;
case OSC_MAINCK_BYPASS:
[b]pmc_switch_mainck_to_xtal[/b](PMC_OSC_BYPASS, // define osc_bypass=0
[b]pmc_us_to_moscxtst[/b](BOARD_OSC_STARTUP_US, // define BOARD_OSC_STARTUP_US 15625UL
OSC_SLCK_32K_RC_HZ)); // define OSC_SLCK_32K_RC_HZ 32000UL
break;
}
}
#define [b]pmc_us_to_moscxtst[/b](startup_us, slowck_freq) \
((startup_us * slowck_freq / 8 / 1000000) < 0x100 ? \
(startup_us * slowck_freq / 8 / 1000000) : 0xFF)
[b]pmc.c[/b]
void [b]pmc_switch_mainck_to_xtal[/b](uint32_t ul_bypass,
uint32_t ul_xtal_startup_time)
{
/* Enable Main Xtal oscillator */
if (ul_bypass) {
....
} else { PMC->CKGR_MOR = (PMC->CKGR_MOR & ~CKGR_MOR_MOSCXTBY) |
CKGR_MOR_KEY_PASSWD | CKGR_MOR_MOSCXTEN |
CKGR_MOR_MOSCXTST(ul_xtal_startup_time);
/* Wait the Xtal to stabilize */
while (!(PMC->PMC_SR & PMC_SR_MOSCXTS));
PMC->CKGR_MOR |= CKGR_MOR_KEY_PASSWD | CKGR_MOR_MOSCSEL;
}
}
Подскажите пожалуйста в чем может быть проблема.
Сообщение отредактировал Andreyy - Nov 1 2015, 18:47