Спойлер
Код: Выделить всё
#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;
}
Код: Выделить всё
void Dummy_Handler(void)
{
while (1) {
}
}