Программа уходит куда-то не туда

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Аватара пользователя
Грендайзер
Мучитель микросхем
Сообщения: 479
Зарегистрирован: Вт июн 02, 2009 22:38:40
Откуда: Город-герой Москва

Программа уходит куда-то не туда

Сообщение Грендайзер »

Здравствуйте. С проблемой вожусь уже неделю. Надежда постепенно умерает :( Работаю с ATSAM4SD32 установленным на отладочной плате SAM4S-EK2. Написал следующий код:
Спойлер

Код: Выделить всё

#include "sam.h"

int dout[8] = {300, 800, 1300, 1800, 2300, 2800, 3300, 0};
 volatile int n = 0;

void DACC_Handler( void );

int main(void)
{
	
	/* Initialize the SAM system */
   // SystemInit();

	__enable_irq ();
	
	// --------------- Enable Interrupts in NVIC ----------------------------
	NVIC_EnableIRQ(DACC_IRQn);
	
	//------------------- Disable Watchdog Timer ---------------------------
	WDT -> WDT_MR = WDT_MR_WDDIS; // disable Watchdog Timer
	//----------------------------------------------------------------------

	//----------------- Switch to fast RC oscillator ----------------------
	// Enable Fast RC oscillator but DO NOT switch to RC now
	PMC-> CKGR_MOR |= (CKGR_MOR_KEY_PASSWD | CKGR_MOR_MOSCRCEN);

	// Wait the Fast RC to stabilize
	while (!(PMC -> PMC_SR & PMC_SR_MOSCRCS)){};

	// Change Fast RC oscillator frequency
	PMC-> CKGR_MOR = (PMC-> CKGR_MOR & ~CKGR_MOR_MOSCRCF_Msk) | CKGR_MOR_KEY_PASSWD |  CKGR_MOR_MOSCRCF_4_MHz;

	// Wait the Fast RC to stabilize
	while (!(PMC-> PMC_SR & PMC_SR_MOSCRCS)){};

	// Switch to Fast RC
	PMC-> CKGR_MOR = (PMC -> CKGR_MOR & ~CKGR_MOR_MOSCSEL) | CKGR_MOR_KEY_PASSWD;
	//---------------------------------------------------------------------------------------------------------------

	//-------------------------- Switch to Main Clock ---------------------------------------------------------------
	// Switch to Main Clock
	PMC -> PMC_MCKR |= PMC_MCKR_CSS_MAIN_CLK;

	// Wait the Fast RC to stabilize
	while (!(PMC-> PMC_SR & PMC_SR_MOSCRCS)){};
	//---------------------------------------------------------------------------------------------------------------

	//-------------------------- PLLA enable ------------------------------------------------------------------------

	// Number Wait States Required to Access the Embedded Flash Memory (page 366 and 1183 datasheet)
	EFC0 -> EEFC_FMR = (EFC0 -> EEFC_FMR & ~EEFC_FMR_FWS_Msk) | EEFC_FMR_FWS(6);

	// Always stop PLL first!
	PMC-> CKGR_PLLAR = CKGR_PLLAR_ONE | CKGR_PLLAR_MULA(0);

	// Adjustment of the Multiplier and Divider
	PMC-> CKGR_PLLAR = CKGR_PLLAR_ONE | CKGR_PLLAR_MULA(24) | CKGR_PLLAR_DIVA(1) | CKGR_PLLAR_PLLACOUNT(100) | PMC_MCKR_PLLADIV2;

	// Wait the PLL Lock
	while (!(PMC-> PMC_SR & PMC_SR_LOCKA)){};

	// Switch to PLLA Clock
	PMC -> PMC_MCKR = (PMC -> PMC_MCKR & ~PMC_MCKR_CSS_Msk) | PMC_MCKR_CSS_PLLA_CLK;

	// Wait Master Clock is Ready
	while(!(PMC -> PMC_SR & PMC_SR_MCKRDY)){};
	
	MATRIX -> MATRIX_SCFG[0] = MATRIX_SCFG_DEFMSTR_TYPE_Msk;
	
	
	// --------- Enables the corresponding peripheral clock	----------------
	// ------------------------ Enable PIOA --------------------------------
	PMC -> PMC_PCER0 = (1 << ID_PIOA);
	
	// ---------------------- Enable DACC clock ----------------------------
	PMC -> PMC_PCER0 = (1 << ID_DACC);
	PMC -> PMC_PCER0 = (1 << ID_ADC);

	// --------- Enable corresponding pins ---------------------------------
	PIOA -> PIO_PER = PIO_PER_P19 | PIO_PER_P20;
	
	// ---- Enable output corresponding pins in PORTA-----------------------
	PIOA -> PIO_OER = PIO_OER_P19|PIO_OER_P20;
	
	
	// -- DAC SET 
	// --------------------- DACC Software Reset ---------------------------
	DACC -> DACC_CR = DACC_CR_SWRST;
	
	// ----------------------- DACC Mode Register --------------------------
	DACC -> DACC_MR = DACC_MR_WORD_HALF | DACC_MR_USER_SEL_CHANNEL1;

	// ----------------------- Channel 1 Enable ----------------------------
	DACC -> DACC_CHER = DACC_CHER_CH1;

	// ------------------- End of conversion interrupt ---------------------
	DACC -> DACC_IER = DACC_IER_TXRDY;

	// ---------------------- Start of conversion --------------------------
	//DACC -> DACC_CDR = DACC_CDR_DATA(dout);

    while (1)
	{ 
 		if(n == 7)
 		{n = 0;}
  		if(DACC -> DACC_IMR == 0)
  		{DACC -> DACC_IER = DACC_IER_TXRDY;}	
	}
	return 0;
}

void DACC_Handler( void )
{ 	
	
	DACC -> DACC_ISR;
	DACC -> DACC_CDR = DACC_CDR_DATA(dout[n]);
	n = n + 1;
	DACC -> DACC_IDR = DACC_IDR_TXRDY;
	return;
}
Код последовательно передаёт числа содержащиеся в массиве "dout[]" в ЦАП. Номер "n" текущего элемента массива увеличивается в обработчике прерывания, а как только станет равным 7, должен сбросится в 0 в цикле "while(1)" функци "main". Осциллографом проверяю выход ЦАП. Несколько секунд на экране присутствует колебание, но затем всё пропадает. При отладке обнаружил, что в итоге программа вылетает в пустой цикл в функции:

Код: Выделить всё

void Dummy_Handler(void)
{
        while (1) {
        }
}
в файле startup_sam4s.c как будто поступило прерывание, обработчик для которого не указан. Хотя никаких других прерываний я не включал. Работаю в AtmelStudio 6.2
Реклама
Аватара пользователя
Грендайзер
Мучитель микросхем
Сообщения: 479
Зарегистрирован: Вт июн 02, 2009 22:38:40
Откуда: Город-герой Москва

Re: Программа уходит куда-то не туда

Сообщение Грендайзер »

По вопросу кой чё прояснилось, но не совсем. Кому интересно можно почитать здесь
Реклама
Ответить

Вернуться в «ARM»