Jump to content

    

Вопросы по samc21

Привет. 

По контроллеру Samc21 нет вообще ни какой информации предлагаю  сделать разбор его функционала. 

Ссылка на даташит. 

Вот пытаюсь настроить запуск ацп через event system от таймера TCC0. 

По пути встречаю подводные камни. 

Вопрос что за параметр в Event User m ---> Bits 7:0 – CHANNEL[7:0] ?

Share this post


Link to post
Share on other sites

1107 страниц с картинками на "нет вообще ни какой информации" никак не тянет (атмел скрытностью никогда не отличался).

стр.475 "Эти биты используются для выбора канала"... чёрт чтение документации online вслух, во-первых, не педагогично, а во-вторых, со времён ФИДО... ну вы поняли ;-)

Share this post


Link to post
Share on other sites

Вот написал драйвер для связи adc с dma а он не работает. 

	
   static DmacDescriptor dmadescr  __attribute__((aligned(16))) SECTION_DMAC_DESCRIPTOR;
   static DmacDescriptor wrtbck __attribute__((aligned(16))) SECTION_DMAC_DESCRIPTOR;

    GCLK->PCHCTRL[33].reg = GCLK_PCHCTRL_GEN_GCLK0 | GCLK_PCHCTRL_CHEN;
	while (0 == GCLK->PCHCTRL[33].bit.CHEN);
	MCLK->APBCMASK.bit.ADC0_ = 1;
	
	ADC0->CTRLA.reg               =    0x00;
	while(       ADC0->SYNCBUSY.reg       );
	ADC0->CTRLB.reg = ADC_CTRLB_PRESCALER_DIV4;
	ADC0->REFCTRL.reg = ADC_REFCTRL_REFSEL(ADC_REFCTRL_REFSEL_INTREF_Val);
	ADC0->EVCTRL.reg = ADC_EVCTRL_STARTEI | ADC_EVCTRL_RESRDYEO;
	
	ADC0->INTENSET.reg = ADC_INTENSET_RESRDY;
	ADC0->INPUTCTRL.reg = ADC_INPUTCTRL_MUXPOS(ADC_INPUTCTRL_MUXPOS_AIN4_Val) | ADC_INPUTCTRL_MUXNEG(0x19);
	
	ADC0->CTRLC.reg = 0x00;
	
	ADC0->AVGCTRL.reg = ADC_AVGCTRL_ADJRES(0) | ADC_AVGCTRL_SAMPLENUM(ADC_AVGCTRL_SAMPLENUM_1_Val);
	
	ADC0->SAMPCTRL.reg = ADC_SAMPCTRL_SAMPLEN(0x3);
	
	//ADC0->GAINCORR.reg = 
	
    NVIC_SetPriority(ADC0_IRQn, 3);
	NVIC_EnableIRQ(ADC0_IRQn);
	
	ADC0->CTRLA.reg = ADC_CTRLA_ENABLE; 
	while( ADC0->SYNCBUSY.reg & ADC_SYNCBUSY_ENABLE );
	
	/************************************************************************/
	/*                            DMA                                       */
	/************************************************************************/
	
	uint32_t temp_CHCTRLB_reg;

	MCLK->AHBMASK.bit.DMAC_ = 1;

    DMAC->CTRL.reg &= ~DMAC_CTRL_DMAENABLE;
	DMAC->CTRL.reg = DMAC_CTRL_SWRST;

	temp_CHCTRLB_reg = DMAC_CHCTRLB_EVIE | DMAC_CHCTRLB_EVACT(DMAC_CHCTRLB_EVACT_TRIG_Val);
	temp_CHCTRLB_reg |= DMAC_CHCTRLB_TRIGSRC(ADC0_DMAC_ID_RESRDY);
	temp_CHCTRLB_reg |= DMAC_CHCTRLB_TRIGACT(DMAC_CHCTRLB_TRIGACT_BEAT_Val);
	temp_CHCTRLB_reg |= DMAC_CHCTRLB_CMD(DMAC_CHCTRLB_CMD_RESUME_Val);
	
	dmadescr.BTCTRL.reg = DMAC_BTCTRL_BEATSIZE(DMAC_BTCTRL_BEATSIZE_HWORD_Val) | DMAC_BTCTRL_STEPSIZE(DMAC_BTCTRL_STEPSIZE_X1) | DMAC_BTCTRL_STEPSEL_DST | DMAC_BTCTRL_DSTINC | DMAC_BTCTRL_VALID;

	dmadescr.BTCNT.reg = DMAC_BTCNT_BTCNT(4);
	dmadescr.SRCADDR.reg =	(uint32_t) &ADC0->RESULT.reg;	
	dmadescr.DSTADDR.reg =	(uint32_t) &adcresult;	
	dmadescr.DESCADDR.reg = 0 ;		
	
	DMAC->BASEADDR.reg = (uint32_t) &dmadescr;
	DMAC->WRBADDR.reg = (uint32_t)	&wrtbck;
	DMAC->CTRL.reg = DMAC_CTRL_DMAENABLE | DMAC_CTRL_LVLEN(0xf);

	DMAC->CHID.reg = DMAC_CHID_ID(0);
	DMAC->CHCTRLA.reg &= ~DMAC_CHCTRLA_ENABLE;
	DMAC->CHCTRLA.reg = DMAC_CHCTRLA_SWRST;

	DMAC->CHID.reg = DMAC_CHID_ID(0);
	DMAC->SWTRIGCTRL.reg &= (uint32_t)(~(1 <<0));

	DMAC->CHCTRLB.reg = temp_CHCTRLB_reg;
	
	DMAC->CHID.reg = DMAC_CHID_ID(0);
	DMAC->CHINTENSET.reg = DMAC_CHINTENSET_TERR | DMAC_CHINTENSET_TCMPL | DMAC_CHINTENSET_SUSP;
	DMAC->CHCTRLA.reg |= DMAC_CHCTRLA_ENABLE;
	NVIC_SetPriority(DMAC_IRQn, 3);
	NVIC_EnableIRQ(DMAC_IRQn);
	
	GCLK->PCHCTRL[7].reg = GCLK_PCHCTRL_GEN_GCLK0 | GCLK_PCHCTRL_CHEN;
	while (0 == GCLK->PCHCTRL[7].bit.CHEN);
	EVSYS->USER[5].reg = EVSYS_USER_CHANNEL(1);
	EVSYS->CHANNEL[1].reg = EVSYS_CHANNEL_PATH(EVSYS_CHANNEL_PATH_SYNCHRONOUS_Val) | EVSYS_CHANNEL_EVGEN(EVSYS_ID_GEN_ADC0_RESRDY) | EVSYS_CHANNEL_EDGSEL(EVSYS_CHANNEL_EDGSEL_RISING_EDGE_Val);

Не вызывается вектор прерывания dma. 

Может кто подскажет в чем проблема?

Share this post


Link to post
Share on other sites

А вообще прерывания работают? __irq_enable() ?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this