中级会员
- 积分
- 388
- 威望
- 217
- 贡献
- 99
- 兑换币
- 121
- 注册时间
- 2013-6-1
- 在线时间
- 36 小时
- 毕业学校
- 燕山大学
|
我想用PIT触发DMA PIT0对应的CH0,但是就是进不了中断额,中断里面我显示的是让小灯反转状态·····
我用的是PIT0然后也已经初始化了~想用它触发DMA0,我有个疑问~~数据手册上说PIT在它计数值到0的时候,会产生一个DMA触发脉冲,能产生一个中断,那这个触发的脉冲和中断是一起产生的吗? 我的DMA 肿么也进不了中断·····
SIM_SCGC7 |= SIM_SCGC7_DMA_MASK; //打开DMA模块时钟
SIM_SCGC6 |= SIM_SCGC6_DMAMUX_MASK; //打开DMA多路复用器时钟
DMAMUX_CHCFG_REG(DMAMUX_BASE_PTR, CHn) = (0
| DMAMUX_CHCFG_ENBL_MASK /* Enable routing of DMA request */
| DMAMUX_CHCFG_TRIG_MASK /* Trigger Mode: Periodic PIT周期触发传输模式 通道1对应PIT1,必须使能PIT1,且配置相应的PIT定时触发 */
//| DMAMUX_CHCFG_SOURCE((ptxn >> 5) + DMA_Port_A) /* 通道触发传输源: */
);
/* 配置 DMA 通道 的 传输控制块 TCD ( Transfer Control Descriptor ) */
DMA_SADDR(CHn) = (u32)SADDR; // 设置 源地址
DMA_DADDR(CHn) = (u32)DADDR; // 设置目的地址
DMA_SOFF(CHn) = 0; // 设置源地址偏移 = 0x0, 即不变
DMA_DOFF(CHn) = BYTEs; // 每次传输后,目的地址加 BYTEs
DMA_ATTR(CHn) = 0;
DMA_CITER_ELINKNO(CHn) = DMA_CITER_ELINKNO_CITER(count); //当前主循环次数
DMA_BITER_ELINKNO(CHn) = DMA_BITER_ELINKYES_BITER(count);//起始主循环次数
DMA_CSR(CHn)=0; //csr active位清零
DMA_CR = 2; // CR[EMLM] = 0禁止副循环映射,调试模式下继续运行
//当CR[EMLM] = 0 时:
DMA_NBYTES_MLNO(CHn) = DMA_NBYTES_MLNO_NBYTES(BYTEs); // 通道每次传输字节数,这里设置为BYTEs个字节。注:值为0表示传输4GB */
/* 配置 DMA 传输结束后的操作 */
DMA_SLAST(CHn) = 0; //调整 源地址的附加值,主循环结束后恢复 源地址
DMA_DLAST_SGA(CHn) = -1; //调整目的地址的附加值,主循环结束后恢复目的地址或者保持地址
DMA_CSR(CHn) = (0
| DMA_CSR_DREQ_MASK //主循环结束后停止硬件请求
| DMA_CSR_INTMAJOR_MASK //主循环结束后产生中断
);
/* 配置输入源 */
SIM_SCGC5 |= (SIM_SCGC5_PORTA_MASK << ((((u32)SADDR) & 0x1ff)>>6)); //开启PORTx端口
switch(byten)
{
case DMA_BYTE1:
*((u8 *)((u32)SADDR + 4)) = 0; //设置为输入方向。为什么加4?PDIR地址加4后,就变成对应的PDDR地址
break;
case DMA_BYTE2:
*((u16 *)((u32)SADDR + 4)) = 0;
break;
case DMA_BYTE4:
*((u32 *)((u32)SADDR + 4)) = 0;
break;
default:
assert_failed(__FILE__, __LINE__);
break;
}
/* 输入源管脚选择功能脚 */
n = (u8)(((u32)SADDR - ((u32)(&PTA_BYTE0_IN))) & 0x3f); //最小的引脚号
tmp = n + (BYTEs << 3); //最大的引脚号
for(i = n; i < tmp; i++)
{
PORT_PCR_REG(PORTX[ ((((u32)SADDR)&0x1ff)>>6) ], i) = (0
| PORT_PCR_MUX(1)
| GPI_DOWN //输入源应该下拉,默认读取到的是0
);
}
// DMA_EN(DMA_CHn);
DMA_ERQ |= (DMA_ERQ_ERQ0_MASK<<(CHn)) ;
enable_irq((CHn) + 0); //允许DMA通道传输
|
|