高级会员
- 积分
- 593
- 威望
- 284
- 贡献
- 117
- 兑换币
- 110
- 注册时间
- 2012-2-3
- 在线时间
- 96 小时
- 毕业学校
- 中国计量学院
|
20贡献
满满的都是泪,直接上主要程序
打算用FTM2的0通道作为时钟..话说就算GPIO的时钟貌似也没反应..
uint8 src_arr[100];//测试用源序列
uint8 dir_arr[100];//测试用目的序列
void DMA0_Init(void)
{
SIM_SCGC6|=SIM_SCGC6_DMAMUX_MASK;//打开DMA多路复用器时钟
SIM_SCGC7|=SIM_SCGC7_DMA_MASK;//打开DMA模块时钟
DMAMUX_CHCFG0=DMAMUX_CHCFG_SOURCE(34);//DMA通道0对应34号DMA请求,对应FTM2_CH0 模块的请求
DMA_TCD0_SADDR = (uint32)src_arr;
DMA_TCD0_SOFF = 1;//每次传送源地址不变//加1
DMA_TCD0_CITER_ELINKNO=DMA_CITER_ELINKNO_CITER(100);//当前主循环次数,采集点数
DMA_TCD0_BITER_ELINKNO=DMA_BITER_ELINKNO_BITER(100);//起始主循环次数,采集点数
DMA_TCD0_ATTR = DMA_ATTR_SSIZE(0) | DMA_ATTR_DSIZE(0);//源数据宽度8bit,目的数据宽度8bit
DMA_TCD0_NBYTES_MLNO = DMA_NBYTES_MLNO_NBYTES(1);//每次读取一字节
DMA_TCD0_SLAST = 0;//主循环结束后源地址0回写tcd
DMA_TCD0_DLASTSGA = 0;
DMA_TCD0_DADDR=(uint32)dir_arr;//设置目的地址,video数组第一个元素
DMA_TCD0_DOFF=1;//每次写目的地址加1
DMA_TCD0_CSR|=DMA_CSR_DREQ_MASK;//DMA通道0主循环结束后停止硬件请求
DMA_TCD0_CSR|=DMA_CSR_INTMAJOR_MASK;//使能DMA0中断
DMAMUX_CHCFG0|=DMAMUX_CHCFG_ENBL_MASK;//DMA通道0使能
}
void ftm2_init(void)
{
PORTA_PCR10 = PORT_PCR_MUX(0x03)|PORT_PCR_DSE_MASK;
SIM_SCGC3 |= SIM_SCGC3_FTM2_MASK;
FTM2_C0SC |= FTM_CnSC_ELSB_MASK | FTM_CnSC_MSB_MASK | FTM_CnSC_DMA_MASK;//打开DMA请求
FTM2_C0SC &= ~FTM_CnSC_ELSA_MASK;
//系统时钟,32分频:100M/8/4=3M125K
//固定进行4分频
FTM2_SC = FTM_SC_CPWMS_MASK|FTM_SC_CLKS(0x01)|FTM_SC_PS(0x03);
//禁用写保护,使能FTM1
FTM2_MODE |= FTM_MODE_WPDIS_MASK;
FTM2_MODE &= ~FTM_MODE_FTMEN_MASK;
//掩盖通道0输出
FTM2_OUTMASK = ~FTM_OUTMASK_CH0OM_MASK;
FTM2_COMBINE = 0;
FTM2_OUTINIT = 0;
FTM2_EXTTRIG = 0;
FTM2_POL = 0;
FTM2_QDCTRL &= ~FTM_QDCTRL_QUADEN_MASK;
FTM2_INVCTRL = 0;
FTM2_SWOCTRL = 0;
FTM2_PWMLOAD = 0;
FTM2_CNTIN = 0;
//当前设置为5ms,200hz
FTM2_MOD = 10500;
//占空比50%
//5050 right
//left 3000
FTM2_C0V = 4000;
FTM2_CNT = 0;
}
void main(void)
{
int i;
for(i = 0;i < 100;i++)
src_arr = i+1;
//1 主程序使用的变量定义
//2 关中断
DisableInterrupts;
//3 模块初始化
// init();
//4 开中断
ftm2_init();
EnableInterrupts;
DMA0_Init();
DMA_ERQ|=DMA_ERQ_ERQ0_MASK;
//主循环
while(1) ;
//main_loop();
//while(1);
}
//对应的是DMA0的中断位置,不过好像从来没进去
void DMA0_isr(void)
{
DMA_INT|=DMA_INT_INT0_MASK;//清除通道0中断
}
|
最佳答案
查看完整内容
这个是我的测试程序你参考一下吧,,GPIO时钟都没反应???之前也是用DMA,后来因为种种原因现在觉得不是那么好用。。。
|