在线时间97 小时
UID3164718
注册时间2017-7-24
NXP金币0
TA的每日心情 | 开心 2017-9-7 09:04 |
---|
签到天数: 1 天 连续签到: 1 天 [LV.1]初来乍到
中级会员
 
- 积分
- 401
- 最后登录
- 2020-11-3
|

楼主 |
发表于 2017-10-19 09:20:00
|
显示全部楼层
您好,我对比例程发现我的配置也没有错误的地方好像。我在线调试发现如果我在DMA中断将DMA通道使能关掉,那么ADC就可以转换完成,ADACT寄存器也变成0了。我感觉PIT触发DMA以后,DMA在一直触发ADC,进而使ADC没有来得及进行转换就又被触发了,所以一直ADACT=1;附上我的程序帮看一下吧?
/***********初始化***************/
volatile uint32 CHSwitch[] =
{
ADC_SC1_ADCH(6),
ADC_SC1_ADCH(7)
};
DMA1ADC0Init(DMA_CH21, (void *)(&(ADC0_R(0))), (void *)BUFF0_U, DMA_BYTE2); //ADC结果的搬运
enable_irq(5);
ADC0SoftwareInit();
PIT0DMA0Init(DMA_CH0, (void *)CHSwitch ,(void *)(&(ADC0_SC1A)), DMA_BYTE4); //配合PIT触发ADC
pit_init(PIT0, (60*1000000)); //nU秒
DMA_EN(DMA_CH0);
/***********ADC配置***************/
void ADC0SoftwareInit(void)
{
SIM_SCGC6 |= SIM_SCGC6_ADC0_MASK;
ADC0_CFG1 = ADC_CFG1_ADIV(0x03) |
ADC_CFG1_MODE(0x03) |
ADC_CFG1_ADICLK(0x00);
ADC0_CFG2 &= (uint32_t)~0xFFFFFFEFUL;
ADC0_SC2 = ( //ADC_SC2_ADTRG_MASK |
ADC_SC2_DMAEN_MASK |
ADC_SC2_REFSEL(0x00));
ADC0_CV1 = (uint32_t)0x00UL;
ADC0_CV2 = (uint32_t)0x00UL;
ADC0_SC3 = (uint32_t)0x00UL;
}
/***********PIT配置***************/
void pit_init(PITn_e pitn, uint32 cnt)
{
SIM_SCGC6 |= SIM_SCGC6_PIT_MASK; //使能PIT时钟
PIT_MCR = (0
//| PIT_MCR_MDIS_MASK //禁用PIT定时器时钟选择(0表示使能PIT,1表示禁止PIT)
//| PIT_MCR_FRZ_MASK //调试模式下停止运行(0表示继续运行,1表示停止运行)
);
PIT_LDVAL(pitn) = cnt - 1 ; //设置溢出中断时间
PIT_Flag_Clear(pitn); //清中断标志位
PIT_TCTRL(pitn) &= ~ PIT_TCTRL_TEN_MASK; //禁止PITn定时器(用于清空计数值)
PIT_TCTRL(pitn) = ( 0
| PIT_TCTRL_TEN_MASK //使能 PITn定时器
//| PIT_TCTRL_TIE_MASK //开PITn中断
);
}
/***********DMA0配置***************/
void PIT0DMA0Init(DMA_CHn CHn, void *SADDR, void *DADDR, DMA_BYTEn byten)
{
uint8 BYTEs = (byten == DMA_BYTE1 ? 1 : (byten == DMA_BYTE2 ? 2 : (byten == DMA_BYTE4 ? 4 : 16 ) ) ); //计算每次传输字节数
SIM_SCGC7 |= SIM_SCGC7_DMA_MASK;
SIM_SCGC6 |= SIM_SCGC6_DMAMUX0_MASK;
/* 配置 DMA 通道 的 传输控制块 TCD */
DMA_SADDR(CHn) = (uint32)SADDR;
DMA_DADDR(CHn) = (uint32)DADDR;
DMA_SOFF(CHn) = BYTEs; // 字节
DMA_DOFF(CHn) = 0;
DMA_ATTR(CHn) = (0
| DMA_ATTR_SMOD(0x0)
| DMA_ATTR_SSIZE(byten)
| DMA_ATTR_DMOD(0x0)
| DMA_ATTR_DSIZE(byten)
);
DMA_CITER_ELINKNO(CHn) = DMA_CITER_ELINKNO_CITER(2);
DMA_BITER_ELINKNO(CHn) = DMA_BITER_ELINKNO_BITER(2);
DMA_CR &= ~DMA_CR_EMLM_MASK; // CR[EMLM] = 0
//当CR[EMLM] = 0 时:
DMA_NBYTES_MLNO(CHn) = DMA_NBYTES_MLNO_NBYTES((BYTEs));
/* 配置 DMA 传输结束后的操作 */
DMA_SLAST(CHn) = -(BYTEs*2);
DMA_DLAST_SGA(CHn) = 0;
DMA_CSR(CHn) = (0
| DMA_CSR_BWC(3)
// | DMA_CSR_DREQ_MASK //主循环结束后停止硬件请求
// | DMA_CSR_INTHALF_MASK
| DMA_CSR_INTMAJOR_MASK //主循环结束后产生中断
);
/* 配置 DMA 触发源 P455 */
DMAMUX_CHCFG_REG(DMAMUX0_BASE_PTR,CHn) = (0
| DMAMUX_CHCFG_ENBL_MASK
| DMAMUX_CHCFG_TRIG_MASK //PIT 周期性触发DMA
| DMAMUX_CHCFG_SOURCE(54) /* Always enabled */
);
DMA_DIS(CHn);
DMA_IRQ_CLEAN(CHn); //清除中断标志位
}
|
|