hi everyone ,I have this problem for several days and still no solution.
I want to send data to the PWM module's C0V register to change its duty cycle by enable the DMA.
But I really don't know what's wrong with my code .It seems that the DMA transmission is failed because the value of C0V is always 0.
I have succeed in generating pwm by updating the C0V through the MPU,like below:
while(1)
{
FTM0_C0V = pwm1;
FTM0_PWMLOAD |= FTM_PWMLOAD_LDOK_MASK;
}
and I've also succeed in transfering datas from memory to memory by using DMA.But it never works when I connect the DMA to PWM register.
By the way ,I'm using the DMA in periodic trigger mode,and I think I have configured the PIT module right.
My code are as follows:
//dma.c
/***channel init***/
void DMAinit(int chno,int sourceno)
{
SIM_SCGC6 |= SIM_SCGC6_DMAMUX_MASK;
DMA_SERQ|=DMA_SERQ_SERQ(chno) ;//enable the source chno
DMAMUX_CHCFG(chno)=(DMAMUX_CHCFG_ENBL_MASK | DMAMUX_CHCFG_SOURCE(sourceno));//enable dma channel chno,
DMAMUX_CHCFG(chno)|=DMAMUX_CHCFG_TRIG_MASK;//enable the periodic trigger
}
//DMA controler setting
void DMAset(uint32 *source_addr,uint32 *destiny_address,char sbits,char dbits,char nbytes,char chno,uint16 majorinter )
{
uint8 i;
i =chno ;//DMA number of channel
SIM_SCGC7 |= SIM_SCGC7_DMA_MASK; //enable DMA clock
DMA_SADDR(i) = (uint32)source_addr;//DMA source address
DMA_DADDR(i) = (uint32)destiny_address;//DMA destiny address
DMA_NBYTES_MLNO(i) =2;//minor loop nbytes
DMA_ATTR(i)= (DMA_ATTR_SSIZE(sbits)|DMA_ATTR_DSIZE(dbits)) ;//source and dest bits
DMA_SOFF(i) =0x2; //source address offset after each transfer
DMA_DOFF(i)=0x0;/source address offset after each transfer
DMA_SLAST(i) = -nbytes; //adjust the source address to the original address
DMA_DLAST_SGA(i) = -nbytes; /adjust the destiny address to the original address
DMA_CITER_ELINKNO(i) =DMA_CITER_ELINKNO_CITER( majorinter);//current major loop counts
DMA_BITER_ELINKNO(i) = DMA_BITER_ELINKNO_BITER(majorinter);//beginning major loop counts
DMA_CSR(i)|=DMA_CSR_BWC(3);//bandwidth control
//DMA_CSR(i)|=DMA_CSR_INTMAJOR_MASK;
DMA_CSR(i)|=DMA_CSR_START_MASK;//soft start
//DMA_SERQ|=DMA_SERQ_SERQ(chno) ;//enable hardware request chno (have done in the DMAinit)
}
//main.c
int main(void)
{
InitPWM();
hw_pit_init(PIT1,0x249f00);//set the timeout of PIT1
DMAinit(1,ftm0ch0_dmasc);//
DMAset(pwmdata,(uint32)&FTM0_C0V,1,1,buflength*2,1,30);
while(1);
return 0;
}