小弟新手,最近在做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传送一个数据。
请各位大牛不吝赐教,谢谢
---------------------------------
谢谢,虽然不太懂,但是最终结果ms是我需要的
试验结果是来一个方波的上升沿读取一个数据,数据是8位连接GPIOB高8位,
问题是,我不确定这种工作方式TIM2的响应时间、DMA传输时间是不是够,不知道响应极限是多少
我现在的理解是TIM2用APB1时钟,36M,我fdts 4分频,可以分辨到9M
DMA的传输时间按照an2548,还有网上说的,保险点能到6M,也就是大概0.16us一次传输
这么估算一下大概从定时器捕获上升沿到传输完数据,在0.3us内能完事。
真的新手,不知道这么算对不对,保不保险。
虽然目前功能貌似实现,但是这个不搞清楚,总是心里没底,望原子哥再指点一下
一周热门 更多>