常驻嘉宾
- 积分
- 3996
- 威望
- 1744
- 贡献
- 1104
- 兑换币
- 1159
- 注册时间
- 2013-10-21
- 在线时间
- 574 小时
|
本帖最后由 wojiaohaomi 于 2014-2-13 16:29 编辑
这个要设置一下触发void DMA_PORT_Init(PTxn ptxn,DMA_PORT_cfg cfg) //DMA端口设置
{
SIM_SCGC5 |= (SIM_SCGC5_PORTA_MASK << (ptxn>>5)); //开启PORTx端口
GPIO_PDDR_REG(GPIOx[(ptxn>>5)]) &= ~(1 << (ptxn & 0x1f)); //设置端口方向为输入
PORT_PCR_REG(PORTX[(ptxn>>5)], (ptxn & 0x1F)) = ( 0
| PORT_PCR_MUX(1) // 复用GPIO
| PORT_PCR_IRQC(cfg & 0x03 ) // 确定触发模式
| ((cfg & 0xc0 ) >> 6) // 开启上拉或下拉电阻,或者没有
);
GPIO_PDDR_REG(GPIOx[(ptxn>>5)]) &= ~(1 << (ptxn && 0x1F)); //输入模式
}
typedef enum DMA_PORT_cfg
{
DMA_rising = 0x01u, //上升沿触发
DMA_falling = 0x02u, //下降沿触发
DMA_either = 0x03u, //跳变沿触发
//用最高两位标志上拉和下拉
DMA_rising_down = 0x81u, //上升沿触发,源地址IO端口内部下拉
DMA_falling_down = 0x82u, //下降沿触发,源地址IO端口内部下拉
DMA_either_down = 0x83u, //跳变沿触发,源地址IO端口内部下拉
DMA_rising_up = 0xc1u, //上升沿触发,源地址IO端口内部上拉
DMA_falling_up = 0xc2u, //下降沿触发,源地址IO端口内部上拉
DMA_either_up = 0xc3u, //跳变沿触发,源地址IO端口内部上拉
//用位6来标志,传输结束后,目的地址保持不变,不恢复成原来地址
DMA_rising_keepon = 0x21u, //上升沿触发 ,目的地址保持不变
DMA_falling_keepon = 0x22u, //下降沿触发 ,目的地址保持不变
DMA_either_keepon = 0x23u, //跳变沿触发 ,目的地址保持不变
DMA_rising_down_keepon = 0xA1u, //上升沿触发,源地址IO端口内部下拉,目的地址保持不变
DMA_falling_down_keepon = 0xA2u, //下降沿触发,源地址IO端口内部下拉,目的地址保持不变
DMA_either_down_keepon = 0xA3u, //跳变沿触发,源地址IO端口内部下拉,目的地址保持不变
DMA_rising_up_keepon = 0xF1u, //上升沿触发,源地址IO端口内部上拉,目的地址保持不变
DMA_falling_up_keepon = 0xF2u, //下降沿触发,源地址IO端口内部上拉,目的地址保持不变
DMA_either_up_keepon = 0xF3u, //跳变沿触发,源地址IO端口内部上拉,目的地址保持不变
} DMA_PORT_cfg, DMA_Count_cfg;
/****************初始化DMA传输*********************/
void DMA_init()
{
DMA_PORT_Init(PTC20,DMA_rising);//DMA端口设置
SIM_SCGC7|=SIM_SCGC7_DMA_MASK;//打开DMA模块时钟
SIM_SCGC6|=SIM_SCGC6_DMAMUX_MASK;//打开DMA多路复用器时钟
DMAMUX_CHCFG0=DMAMUX_CHCFG_SOURCE(51);//DMA通道0对应51号DMA请求,即PORTC
DMA_TCD0_CITER_ELINKNO=DMA_CITER_ELINKNO_CITER(1);//当前主循环次数,采集点数
DMA_TCD0_BITER_ELINKNO=DMA_BITER_ELINKNO_BITER(1);//起始主循环次数,采集点数
DMA_TCD0_SADDR=(uint32_t)&GPIOD_PDIR ; //设置源地址GPIO口,GPIOD_PDIR
DMA_TCD0_SOFF=0; //每次传送源地址不变
DMA_TCD0_NBYTES_MLNO=DMA_NBYTES_MLNO_NBYTES(1); //每次读取一字节
DMA_TCD0_SLAST=0; //主循环结束后源地址0回写tcd
DMA_TCD0_DLASTSGA=0;//主循环结束后目的地址0回写tcd
DMA_TCD0_DADDR=(uint32_t)Image_Buf;//设置目的地址,video数组第一个元素
DMA_TCD0_DOFF=1;//每次写目的地址加1
DMA_TCD0_ATTR=DMA_ATTR_SSIZE(0)+DMA_ATTR_DSIZE(0);//源数据宽度8bit,目的数据宽度8bit使能AD0采集DMA_CSR_DREQ
DMA_ERQ|=DMA_ERQ_ERQ0_MASK;//使能通道0硬件DMA请求
DMAMUX_CHCFG0|=DMAMUX_CHCFG_ENBL_MASK;//DMA通道0使能
}
没有dma中断,自己加
|
|