OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5301|回复: 6

STM32F103VET6使用定时器1连续测几百纳秒脉宽,同时定时器4输出相应脉宽的方波,求援!!!

[复制链接]

10

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2015-11-26
在线时间
10 小时
发表于 2015-12-3 13:28:27 | 显示全部楼层 |阅读模式
5金钱
如题,因为测量脉宽较小,所以不打算采用中断方式,以节约时间,我的想法是各种初始化完成后,用定时器1上升沿捕获,触发DMA请求,DMA读取计数器值到某一我自己定义的变量,while语句里面循环判断是否有DMA传输完成标志,再if判断这是上升沿还是下降沿,如果这次捕获到的是上升沿,此时清除计数器值,设置定时器1下降沿捕获。如果是下降沿,则此时我的变量里面是脉宽值,下面是我的代码,变量MAIKUAN始终是0,想了两天了,不知道自己哪里想错了,实在没辙了,顾来求援啊
[mw_shl_code=c,true]#include "timer.h" #include "sys.h" #include "dma.h" u16 CNT=0; //捕获次数 u16 MAIKUAN; void MYDMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar,u16 cndtr) { RCC->AHBENR|=1<<0; //开启DMA1时钟 DMA_CHx->CPAR=cpar; //DMA1外设地址 DMA_CHx->CMAR=(u32)cmar; //DMA1存储器地址 DMA_CHx->CNDTR=cndtr; //DMA1传输数据量 DMA_CHx->CCR=0X00000000; //复位 DMA_CHx->CCR|=0<<4; //从外设读 DMA_CHx->CCR|=1<<5; //循环模式 DMA_CHx->CCR|=1<<6; //外设地址增量模式 DMA_CHx->CCR|=1<<7; //存储器增量模式 DMA_CHx->CCR|=1<<8; //外设数据宽度16位 DMA_CHx->CCR|=1<<10; //存储器数据宽度16位 DMA_CHx->CCR|=2<<12; //高优先级 DMA_CHx->CCR|=0<<14; //非存储器到存储器模式 DMA_CHx->CCR|=1<<0; //开启DMA通道 } void TIM1_Int_Init(u16 arr,u16 psc) { RCC->APB2ENR|=1<<11; //TIM1时钟使能 RCC->APB2ENR|=1<<2; //使能端口A时钟 GPIOA->CRH&=0XFFFFFFF0; //PA8 清楚之前的设置 GPIOA->CRH|=0X00000008; //PA8输入 GPIOA->ODR|=0<<8; //PA8下拉 TIM1->ARR=arr; //周期 TIM1->SC=psc; //时基 TIM1->CCMR1|=1<<0; //选择输入端,IC1映射到TI1 TIM1->CCMR1|=0<<10; //IC2PS=00 ,不分频,不滤波 TIM1->CCER|=0<<1; //CC1P=0 上升沿捕获 TIM1->CCER|=1<<0; //CC1E=1 捕获使能 TIM1->DIER|=1<<9; //允许捕获1的DMA请求 TIM1->CR1=0x01; //使能定时器1 } void TIM4_Int_Init(u16 arr,u16 psc) { RCC->APB1ENR|=1<<2; //TIM4时钟使能 RCC->APB2ENR|=1<<3; //使能端口B时钟 GPIOB->CRL&=0XF0FFFFFF; GPIOB->CRL|=0X0B000000;//PB6 推挽输出 TIM4->ARR=arr; //周期 TIM4->SC=psc; //时基 TIM4->CCMR1|=3<<4; //CH1翻转模式 TIM4->CCMR1|=1<<3; //CH1预装载使能 TIM4->CCER|=1<<0; //OC1 输出使能 TIM4->CR1=0x0080; //自动重装载预装载允许 TIM4->CR1|=0x01; //使能定时器4 } int main() { Stm32_Clock_Init(9); //系统时钟设置 MYDMA_Config(DMA1_Channel2,(u32)&TIM1->CNT,(u32)MAIKUAN,0xFFFF);//DMA1通道2,外设为计数器,存储器为MAIKUAN,长度0xFFFF TIM4_Int_Init(359,0);//输出 TIM1_Int_Init(0XFFFF,0); //72MHz频率计数,捕获 while(1) { if(DMA1->ISR==0x0020)//是否传输完成 { if(CNT==0) { TIM1->CNT=0; TIM1->CCER|=1<<1; //CC1P=1下降沿捕获 DMA1->IFCR|=1<<5;//清除传输完成标志 CNT=1; } else { TIM4->ARR=MAIKUAN; TIM1->CCER|=0<<1; //CC1P=0上升沿捕获 DMA1->IFCR|=1<<5;//清除传输完成标志 CNT=0; } } } }[/mw_shl_code]

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-12-3 23:46:28 | 显示全部楼层
回复

使用道具 举报

10

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2015-11-26
在线时间
10 小时
 楼主| 发表于 2015-12-4 08:41:49 | 显示全部楼层
回复【2楼】正点原子:
-------------------------
原子哥,你帮我看看啊,我哪里搞错了
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2015-12-4 13:21:40 | 显示全部楼层
回复【3楼】kun0226:
---------------------------------
72m,执行一条汇编基本指令的时间大约14纳秒,不知道你这个while加上dma移动数据加上定时器,捕获200~800纳秒脉宽能不能来得及
回复

使用道具 举报

10

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2015-11-26
在线时间
10 小时
 楼主| 发表于 2015-12-4 13:37:05 | 显示全部楼层
回复【4楼】ricefat:
-----------------------------
那咱们不考虑这个执行时间和传输时间,只考虑我的思路和其他设置对不对啊,我现在在怀疑自己的思路和设置问题,而且硬件仿真时,语句TIM1->CNT=0;貌似并不起作用啊,根本看不到它清零。   还有计数器CNT 到我自己设置的内存变量MAIKUAN是否应该选择DMA1的通道2,还是选择别的,又或者我是不是应该选择TIM1->CCR1通过DMA 的哪个通道可以传输到我自己设置的内存变量MAIKUAN,还有DMA1通道4对应的TIM1_TX4是个什么鬼
回复

使用道具 举报

10

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2015-11-26
在线时间
10 小时
 楼主| 发表于 2015-12-4 13:42:28 | 显示全部楼层
回复【4楼】ricefat:
---------------------------------
我现在是捕获的信号源输出的100微妙脉宽的波形,依旧不能捕获,所以我再怀疑自己的思路或者设置问题,刚刚接触stm32,求大神指点一二
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2015-12-4 14:54:36 | 显示全部楼层
回复【6楼】kun0226:
---------------------------------
定时器用DMA我还真没试过,但是DMA每次调用都需要重新进行初始化,即使是循环模式也需要先关闭DMA,重新设置传输数据数量和基地址后再开启才能用,你看看是不是这里出错了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-21 00:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表