定时器捕获外部上升沿信号,DMA读取GPIO口数据的问题

2019-08-23 14:57发布

小弟新手,最近在做STM32采集片外AD信号的程序

现在用了Tim2的ch3捕获功能监控外部触发采样的信号,片外AD输出8位并行数据接GPIO口,当外部采样信号到来时,DMA读取GPIO口数据并保存到内存中
我模仿网上例程an2548,在开发板程序基础上修改了寄存器版(因为时间紧固件库不会用,怕出错)。

void MYDMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
{
     RCC->AHBENR|=1<<0;        //开启DMA1时钟
     delay_ms(1);            //等待DMA时钟稳定
     DMA_CHx->CPAR=cpar;      //DMA1 外设地址
    DMA_CHx->CMAR=(u32)cmar;//DMA1,存储器地址
    DMA1_MEM_LEN=cndtr;     //保存DMA传输数据量
    DMA_CHx->CNDTR=cndtr;   //DMA1,传输数据量

    DMA_CHx->CCR=0X00000000;//复位
    DMA_CHx->CCR|=0<<4;      //从外设读
    DMA_CHx->CCR|=0<<5;      //不执行循环操作
    DMA_CHx->CCR|=0<<6;      //外设地址非增量模式
    DMA_CHx->CCR|=1<<7;      //存储器增量模式
    DMA_CHx->CCR|=1<<8;      //外设数据宽度为16位
    DMA_CHx->CCR|=1<<10;     //存储器数据宽度16位
    DMA_CHx->CCR|=3<<12;     //最高优先级
    DMA_CHx->CCR|=0<<14;     //非存储器到存储器模式

    DMA_CHx->CCR|=1<<0;     //开启DMA传输             
}

void Timerx_Init(u16 arr,u16 psc)
{
    //RCC->APB1ENR|=1<<1;//TIM3时钟使能
    RCC->APB1ENR|=1<<0;//TIM2时钟使能 
    delay_ms(1);        //等待时钟稳定
//    TIM2->CCMR1|
//    TIM2->SMCR|=0x0007;
     TIM2->ARR=arr;  //设定计数器自动重装值//刚好1ms
    TIM2->SC=psc;  //预分频器7200,得到10Khz的计数时钟
//    TIM2->CR1=0X0000;//复位
    TIM2->CR1&=0x008F;    //无分频 向上计数

    TIM2->CCER &=0x3233;    //复位
    TIM2->CCMR2&=0x0000;       
    //TIM2->CCMR2&=0xFF00;           //无滤波器
    TIM2->CCMR2|=1<<0;             //映射T3

    TIM2->CCER =0x3133;     //捕获使能
//    TIM2->SMCR|=7<<0;
    TIM2->DIER&=0x0000;
    TIM2->DIER |=1<<11;

    //这两个东东要同时设置才可以使用中断

//    TIM2->DIER|=1<<0;   //允许更新中断               
//    TIM2->DIER|=1<<6;   //允许触发中断
    TIM2->CR1|=0x01;    //使能定时器3
       
//      MY_NVIC_Init(1,3,TIM2_IRQChannel,2);//抢占1,子优先级3,组2                                     
}

    MYDMA_Config(DMA1_Channel1,(u32)&GPIOB->IDR,(u32)Data_Buffer,2500);//DMA1通道4,外设为串口1,存储器为SendBuff,长度5200.

    Timerx_Init(2500,0);//10Khz的计数频率,计数到5000为500ms

现在的问题是这样的:
1 如上所示,我总共传输的是2500个数据,当外部触发信号到来一个时,DMA是传送还是一个数据还是开始传送2500个数据
2 定时器捕获一个触发信号,DMA传送一个;还是捕获几个触发信号,DMA传送一个数据。

请各位大牛不吝赐教,谢谢




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
正点原子
1楼-- · 2019-08-23 15:28
 精彩回答 2  元偷偷看……
lenyu2010
2楼-- · 2019-08-23 17:37
回复【2楼】正点原子:
---------------------------------
谢谢,虽然不太懂,但是最终结果ms是我需要的
lenyu2010
3楼-- · 2019-08-23 19:25
抱歉,还有一个问题,上面代码试验环境是外部有一个频率2MHz,占空比2:3的周期方波作为外部触发信号

试验结果是来一个方波的上升沿读取一个数据,数据是8位连接GPIOB高8位,

问题是,我不确定这种工作方式TIM2的响应时间、DMA传输时间是不是够,不知道响应极限是多少

我现在的理解是TIM2用APB1时钟,36M,我fdts 4分频,可以分辨到9M

DMA的传输时间按照an2548,还有网上说的,保险点能到6M,也就是大概0.16us一次传输

这么估算一下大概从定时器捕获上升沿到传输完数据,在0.3us内能完事。

真的新手,不知道这么算对不对,保不保险。

虽然目前功能貌似实现,但是这个不搞清楚,总是心里没底,望原子哥再指点一下
liang923
4楼-- · 2019-08-23 20:57
有点问题想请教一下,能否留个qq???谢谢
YQ
5楼-- · 2019-08-23 23:34
不知道楼主问题解决没有,我还想问一下楼主,按F4的参考手册里写的,GPIO没有DMA这个模式啊,我也想用GPIO的DMA模式,顺带问一下楼主用的哪个系列的芯片。
YQ
6楼-- · 2019-08-24 00:53
 精彩回答 2  元偷偷看……

一周热门 更多>