سلام
من میخواستم از با DMA از سریال بخونم و بریزم توی یک آرایه ای بعد وقتی تعداد بایت ها 32 تا شد داده هامو بریزم توی یک آرایه دیگری که داره توی یک جای دیگه قراره ازش استفاده بشه.دقیقا نشستم عین دیتاشیت خود اتمل دونه دونه رجیسترها مقدار دهی کردم. ولی متاسفانه توی اینتراپت اصلا نمیره به نظر شما مشکل چیه؟
اینم کد من :
با تشکر
من میخواستم از با DMA از سریال بخونم و بریزم توی یک آرایه ای بعد وقتی تعداد بایت ها 32 تا شد داده هامو بریزم توی یک آرایه دیگری که داره توی یک جای دیگه قراره ازش استفاده بشه.دقیقا نشستم عین دیتاشیت خود اتمل دونه دونه رجیسترها مقدار دهی کردم. ولی متاسفانه توی اینتراپت اصلا نمیره به نظر شما مشکل چیه؟
اینم کد من :
کد:
#include <io.h> #include <stdint.h> unsigned char ali_test[32],i; unsigned char ali_test2[2000]; unsigned int index=0; void system_clocks_init(void) { unsigned char n,s; #pragma optsize- s=SREG; #asm("cli") OSC.XOSCCTRL=OSC_FRQRANGE_12TO16_gc | OSC_XOSCSEL_XTAL_16KCLK_gc; OSC.CTRL|=OSC_XOSCEN_bm; while ((OSC.STATUS & OSC_XOSCRDY_bm)==0); n=(OSC.PLLCTRL & (~(OSC_PLLSRC_gm | OSC_PLLFAC_gm))) | OSC_PLLSRC_XOSC_gc | 8; CCP=CCP_IOREG_gc; OSC.PLLCTRL=n; OSC.CTRL|=OSC_PLLEN_bm; n=(CLK.PSCTRL & (~(CLK_PSADIV_gm | CLK_PSBCDIV1_bm | CLK_PSBCDIV0_bm))) | CLK_PSADIV_1_gc | CLK_PSBCDIV_2_2_gc; CCP=CCP_IOREG_gc; CLK.PSCTRL=n; while ((OSC.STATUS & OSC_PLLRDY_bm)==0); n=(CLK.CTRL & (~CLK_SCLKSEL_gm)) | CLK_SCLKSEL_PLL_gc; CCP=CCP_IOREG_gc; CLK.CTRL=n; OSC.CTRL&= ~(OSC_RC2MEN_bm | OSC_RC32MEN_bm | OSC_RC32KEN_bm); PORTCFG.CLKEVOUT&= ~PORTCFG_CLKOUT_gm; SREG=s; #pragma optsize_default } void usarte0_init(void) { PORTE.OUTSET=0x08; USARTE0.CTRLC=USART_CMODE_ASYNCHRONOUS_gc | USART_PMODE_DISABLED_gc | USART_CHSIZE_8BIT_gc; USARTE0.CTRLA=(USARTE0.CTRLA & (~(USART_RXCINTLVL_gm | USART_TXCINTLVL_gm | USART_DREINTLVL_gm))) | USART_RXCINTLVL_OFF_gc | USART_TXCINTLVL_OFF_gc | USART_DREINTLVL_OFF_gc; USARTE0.BAUDCTRLA=0xF5; USARTE0.BAUDCTRLB=((0x0C << USART_BSCALE_gp) & USART_BSCALE_gm) | 0x0C; USARTE0.CTRLB=(USARTE0.CTRLB & (~(USART_RXEN_bm | USART_TXEN_bm | USART_CLK2X_bm | USART_MPCM_bm | USART_TXB8_bm))) | USART_RXEN_bm | USART_TXEN_bm; } interrupt [DMA_CH0_vect] void dma_ch0_isr(void) { for ( i =0 ; i < 32 ; i++) { ali_test2[index] = ali_test[i]; index++; } } void main(void) { unsigned char n; volatile DMA_CH_t * channel; #pragma optsize- #asm("cli") n=(PMIC.CTRL & (~(PMIC_RREN_bm | PMIC_IVSEL_bm | PMIC_HILVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_LOLVLEN_bm))) | PMIC_LOLVLEN_bm | PMIC_HILVLEN_bm; CCP=CCP_IOREG_gc; PMIC.CTRL=n; PMIC.INTPRI=0x00; #pragma optsize_default system_clocks_init(); PORTE.OUT=0x08; PORTE.DIR=0x08; usarte0_init(); channel = &DMA.CH0; DMA.CTRL = 0; DMA.CTRL = DMA_RESET_bm; while ((DMA.CTRL & DMA_RESET_bm) != 0); channel->CTRLB = (channel->CTRLB & ~(DMA_CH_ERRINTLVL_gm | DMA_CH_TRNINTLVL_gm)) | DMA_CH_TRNINTLVL_LO_gc | DMA_CH_ERRINTLVL_LO_gc ; DMA.CTRL = DMA_CH_ENABLE_bm | DMA_DBUFMODE_CH01_gc; channel->REPCNT = 0; channel->CTRLA |= DMA_CH_SINGLE_bm; channel->CTRLA |= DMA_CH_REPEAT_bm; channel->CTRLA |= DMA_CH_BURSTLEN_1BYTE_gc; channel->ADDRCTRL |= DMA_CH_SRCRELOAD_BURST_gc; channel->ADDRCTRL |= DMA_CH_SRCDIR_FIXED_gc; channel->ADDRCTRL |= DMA_CH_DESTDIR_INC_gc; channel->TRIGSRC = DMA_CH_TRIGSRC_USARTE0_RXC_gc; channel->TRFCNT = 32; channel->SRCADDR0 = (( (uint32_t) &USARTE0.DATA) >> 0*8 ) & 0xFF; channel->SRCADDR1 = (( (uint32_t) &USARTE0.DATA) >> 1*8 ) & 0xFF; channel->SRCADDR2 = (( (uint32_t) &USARTE0.DATA) >> 2*8 ) & 0xFF; channel->DESTADDR0 = (( (uint32_t) &ali_test) >> 0*8 ) & 0xFF; channel->DESTADDR1 = (( (uint32_t) &ali_test) >> 1*8 ) & 0xFF; channel->DESTADDR2 = (( (uint32_t) &ali_test) >> 2*8 ) & 0xFF; channel->CTRLA |= DMA_CH_ENABLE_bm; //DMA.CH0.CTRLA |= DMA_CH_ENABLE_bm #asm("sei") while (1); }
دیدگاه